module Concurrent::Synchronization::AbstractStruct
@!visibility private @!macro internal_implementation_note
Public Class Methods
new(*values)
click to toggle source
@!visibility private
Calls superclass method
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 9 def initialize(*values) super() ns_initialize(*values) end
Protected Class Methods
define_struct_class(parent, base, name, members, &block)
click to toggle source
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 141 def self.define_struct_class(parent, base, name, members, &block) clazz = Class.new(base || Object) do include parent self.const_set(:MEMBERS, members.collect{|member| member.to_s.to_sym}.freeze) def ns_initialize(*values) raise ArgumentError.new('struct size differs') if values.length > length @values = values.fill(nil, values.length..length-1) end end unless name.nil? begin parent.send :remove_const, name if parent.const_defined?(name, false) parent.const_set(name, clazz) clazz rescue NameError raise NameError.new("identifier #{name} needs to be constant") end end members.each_with_index do |member, index| clazz.send :remove_method, member if clazz.instance_methods.include? member clazz.send(:define_method, member) do @values[index] end end clazz.class_exec(&block) unless block.nil? clazz.singleton_class.send :alias_method, :[], :new clazz end
Public Instance Methods
length()
click to toggle source
@!macro struct_length
Returns the number of struct members. @return [Fixnum] the number of struct members
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 19 def length self.class::MEMBERS.length end
Also aliased as: size
members()
click to toggle source
@!macro struct_members
Returns the struct members as an array of symbols. @return [Array] the struct members as an array of symbols
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 29 def members self.class::MEMBERS.dup end
Protected Instance Methods
ns_each() { |value| ... }
click to toggle source
@!macro struct_each
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 82 def ns_each values.each{|value| yield value } end
ns_each_pair() { |MEMBERS, values| ... }
click to toggle source
@!macro struct_each_pair
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 89 def ns_each_pair @values.length.times do |index| yield self.class::MEMBERS[index], @values[index] end end
ns_equality(other)
click to toggle source
@!macro struct_equality
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 75 def ns_equality(other) self.class == other.class && self.values == other.values end
ns_get(member)
click to toggle source
@!macro struct_get
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 59 def ns_get(member) if member.is_a? Integer if member >= @values.length raise IndexError.new("offset #{member} too large for struct(size:#{@values.length})") end @values[member] else send(member) end rescue NoMethodError raise NameError.new("no member '#{member}' in struct") end
ns_initialize(*values)
click to toggle source
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 145 def ns_initialize(*values) raise ArgumentError.new('struct size differs') if values.length > length @values = values.fill(nil, values.length..length-1) end
ns_initialize_copy()
click to toggle source
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 119 def ns_initialize_copy @values = @values.map do |val| begin val.clone rescue TypeError val end end end
ns_inspect()
click to toggle source
@!macro struct_inspect
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 105 def ns_inspect struct = pr_underscore(self.class.ancestors[1]) clazz = ((self.class.to_s =~ /^#<Class:/) == 0) ? '' : " #{self.class}" "#<#{struct}#{clazz} #{ns_to_h}>" end
ns_merge(other, &block)
click to toggle source
@!macro struct_merge
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 114 def ns_merge(other, &block) self.class.new(*self.to_h.merge(other, &block).values) end
ns_select() { |value| ... }
click to toggle source
@!macro struct_select
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 98 def ns_select values.select{|value| yield value } end
ns_to_h()
click to toggle source
@!macro struct_to_h
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 52 def ns_to_h length.times.reduce({}){|memo, i| memo[self.class::MEMBERS[i]] = @values[i]; memo} end
ns_values()
click to toggle source
@!macro struct_values
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 38 def ns_values @values.dup end
ns_values_at(indexes)
click to toggle source
@!macro struct_values_at
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 45 def ns_values_at(indexes) @values.values_at(*indexes) end
pr_underscore(clazz)
click to toggle source
@!visibility private
# File lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb, line 130 def pr_underscore(clazz) word = clazz.to_s.dup # dup string to workaround JRuby 9.2.0.0 bug https://github.com/jruby/jruby/issues/5229 word.gsub!(/::/, '/') word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2') word.gsub!(/([a-z\d])([A-Z])/,'\1_\2') word.tr!("-", "_") word.downcase! word end