Module: Concurrent::Synchronization::AbstractStruct
| Relationships & Source Files | |
| Extension / Inclusion / Inheritance Descendants | |
|
Included In:
| |
| Defined in: | lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb |
Overview
**Private Implementation:** This abstraction is a private, internal implementation detail. It should never be used directly.
Class Method Summary
Instance Method Summary
-
#length ⇒ Fixnum
(also: #size)
Returns the number of struct members.
-
#members ⇒ Array
Returns the struct members as an array of symbols.
-
#size
Alias for #length.
- #initialize(*values) private
-
#ns_each {|value| ... }
private
Yields the value of each struct member in order.
-
#ns_each_pair {|member, value| ... }
private
Yields the name and value of each struct member in order.
-
#ns_equality(other) ⇒ Boolean
private
Equality.
-
#ns_get(member) ⇒ Object
private
Attribute Reference.
- #ns_initialize_copy private
-
#ns_inspect ⇒ String
private
Describe the contents of this struct in a string.
-
#ns_merge(other) {|member, selfvalue, othervalue| ... } ⇒ Synchronization::AbstractStruct
private
Returns a new struct containing the contents of
otherand the contents ofself. -
#ns_select {|value| ... } ⇒ Array
private
Yields each member value from the struct to the block and returns an
Arraycontaining the member values from the struct for which the given block returns a true value (equivalent toEnumerable#select). -
#ns_to_h ⇒ Hash
private
Returns a hash containing the names and values for the struct’s members.
-
#ns_values ⇒ Array
private
Returns the values for this struct as an
Array. -
#ns_values_at(indexes)
private
Returns the struct member values for each selector as an
Array. - #pr_underscore(clazz) private
Class Method Details
.define_struct_class(parent, base, name, members, &block) (private)
[ GitHub ]# 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(false).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
Instance Method Details
#initialize(*values) (private)
[ GitHub ]# File 'lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb', line 9
def initialize(*values) super() ns_initialize(*values) end
#length ⇒ Fixnum
Also known as: #size
Returns the number of struct members.
# File 'lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb', line 19
def length self.class::MEMBERS.length end
#members ⇒ Array
Returns 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
#ns_each {|value| ... } (private)
Yields the value of each struct member in order. If no block is given an enumerator is returned.
# File 'lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb', line 82
def ns_each values.each{|value| yield value } end
#ns_each_pair {|member, value| ... } (private)
Yields the name and value of each struct member in order. If no block is given an enumerator is returned.
# 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) ⇒ Boolean (private)
Equality
# 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) ⇒ Object (private)
Attribute Reference
# 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_copy (private)
[ GitHub ]# 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 ⇒ String (private)
Describe the contents of this struct in a string.
# 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) {|member, selfvalue, othervalue| ... } ⇒ Synchronization::AbstractStruct (private)
Returns a new struct containing the contents of other and the contents of self. If no block is specified, the value for entries with duplicate keys will be that of other. Otherwise the value for each duplicate key is determined by calling the block with the key, its value in self and its value in other.
# 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| ... } ⇒ Array (private)
Yields each member value from the struct to the block and returns an Array containing the member values from the struct for which the given block returns a true value (equivalent to Enumerable#select).
# File 'lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb', line 98
def ns_select values.select{|value| yield value } end
#ns_to_h ⇒ Hash (private)
Returns a hash containing the names and values for the struct’s members.
# 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 ⇒ Array (private)
Returns the values for this struct as an Array.
# File 'lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb', line 38
def ns_values @values.dup end
#ns_values_at(indexes) (private)
Returns the struct member values for each selector as an Array.
A selector may be either an Integer offset or a Range of offsets (as in Array#values_at).
# File 'lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb', line 45
def ns_values_at(indexes) @values.values_at(*indexes) end
#pr_underscore(clazz) (private)
[ GitHub ]# 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
#size
Alias for #length.
# File 'lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb', line 22
alias_method :size, :length