Class: BinStruct::Array Abstract
- Inherits:
-
Object
- Object
- BinStruct::Array
- Extended by:
- Forwardable
- Includes:
- LengthFrom, Structable, Enumerable
- Defined in:
- lib/bin_struct/array.rb
Overview
Base class to define set of Struct subclasses.
This class mimics regular Ruby Array, but it is Structable and responds to LengthFrom.
Concrete subclasses may define 2 private methods:
#record_from_hash
This method is called by #push and #<< to add an object to the set.
A default method is defined by Array: it calls constructor of class defined by Array.set_of.
#real_type
Subclasses should define private method #real_type
if Array.set_of type may be subclassed. This method should return real class to use. It takes an only argument, which is of type given by Array.set_of.
Default behaviour of this method is to return argument’s class.
Direct Known Subclasses
ArrayOfInt16, ArrayOfInt16le, ArrayOfInt32, ArrayOfInt32le, ArrayOfInt8
Constant Summary collapse
- HUMAN_SEPARATOR =
Separator used in #to_human. May be overriden by subclasses
','
Constants included from LengthFrom
Class Method Summary collapse
-
.set_of(klass) ⇒ void
Define type of objects in set.
-
.set_of_klass ⇒ Class
Get class set with Array.set_of.
Instance Method Summary collapse
-
#<<(obj) ⇒ self
abstract
Add an object to this array, and increment associated counter, if any.
-
#==(other) ⇒ Boolean
Check equality.
-
#[](index) ⇒ Object
Return the element at
index
. -
#clear ⇒ void
Clear array.
-
#clear! ⇒ void
Clear array.
-
#delete(obj) ⇒ Object
Delete an object from this array.
-
#delete_at(index) ⇒ Object?
Delete element at
index
. -
#each ⇒ ::Array
Calls the given block once for each element in self, passing that element as a parameter.
-
#empty? ⇒ Boolean
Return
true
if contains no element. -
#first ⇒ Object
Return first element.
-
#initialize(options = {}) ⇒ Array
constructor
A new instance of Array.
-
#initialize_copy(_other) ⇒ Object
Initialize array for copy: * duplicate internal array.
-
#last ⇒ Object
Return last element.
-
#push(obj) ⇒ self
abstract
Add an object to this array.
-
#read(data) ⇒ self
Populate object from a string or from an array of hashes.
-
#size ⇒ Integer
(also: #length)
Get number of element in array.
-
#sz ⇒ Integer
Get size in bytes.
-
#to_a ⇒ ::Array
Return underlying Ruby Array.
-
#to_human ⇒ ::String
Get a human readable string.
-
#to_s ⇒ ::String
Get binary string.
Methods included from LengthFrom
#initialize_length_from, #read_with_length_from, #sz_to_read
Methods included from Structable
Constructor Details
#initialize(options = {}) ⇒ Array
Returns a new instance of Array.
89 90 91 92 93 |
# File 'lib/bin_struct/array.rb', line 89 def initialize( = {}) @counter = [:counter] @array = [] initialize_length_from() end |
Class Method Details
.set_of(klass) ⇒ void
81 82 83 |
# File 'lib/bin_struct/array.rb', line 81 def set_of(klass) @klass = klass end |
.set_of_klass ⇒ Class
Get class set with set_of.
74 75 76 |
# File 'lib/bin_struct/array.rb', line 74 def set_of_klass @klass end |
Instance Method Details
#<<(obj) ⇒ self
depend on private method #record_from_hash
which should be declared by subclasses.
Add an object to this array, and increment associated counter, if any
160 161 162 163 164 |
# File 'lib/bin_struct/array.rb', line 160 def <<(obj) push(obj) @counter&.from_human(@counter.to_i + 1) self end |
#==(other) ⇒ Boolean
Check equality. Equality is checked on underlying array.
104 105 106 107 108 109 110 111 |
# File 'lib/bin_struct/array.rb', line 104 def ==(other) @array == case other when Array other.to_a else other end end |
#[](index) ⇒ Object
Return the element at index
.
63 |
# File 'lib/bin_struct/array.rb', line 63 def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size |
#clear ⇒ void
This method returns an undefined value.
Clear array.
63 |
# File 'lib/bin_struct/array.rb', line 63 def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size |
#clear! ⇒ void
This method returns an undefined value.
Clear array. Reset associated counter, if any.
115 116 117 118 |
# File 'lib/bin_struct/array.rb', line 115 def clear! @array.clear @counter&.from_human(0) end |
#delete(obj) ⇒ Object
Delete an object from this array. Update associated counter if any
123 124 125 126 127 |
# File 'lib/bin_struct/array.rb', line 123 def delete(obj) deleted = @array.delete(obj) @counter.from_human(@counter.to_i - 1) if @counter && deleted deleted end |
#delete_at(index) ⇒ Object?
Delete element at index
. Update associated counter if any
132 133 134 135 136 |
# File 'lib/bin_struct/array.rb', line 132 def delete_at(index) deleted = @array.delete_at(index) @counter.from_human(@counter.to_i - 1) if @counter && deleted deleted end |
#each ⇒ ::Array
Calls the given block once for each element in self, passing that element as a parameter. Returns the array itself.
63 |
# File 'lib/bin_struct/array.rb', line 63 def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size |
#empty? ⇒ Boolean
Return true
if contains no element.
63 |
# File 'lib/bin_struct/array.rb', line 63 def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size |
#first ⇒ Object
Return first element
63 |
# File 'lib/bin_struct/array.rb', line 63 def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size |
#initialize_copy(_other) ⇒ Object
Associated counter, if any, is not duplicated
Initialize array for copy:
-
duplicate internal array.
98 99 100 |
# File 'lib/bin_struct/array.rb', line 98 def initialize_copy(_other) @array = @array.dup end |
#last ⇒ Object
Return last element.
63 |
# File 'lib/bin_struct/array.rb', line 63 def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size |
#push(obj) ⇒ self
depend on private method #record_from_hash
which should be declared by subclasses.
Add an object to this array. Do not update associated counter.
144 145 146 147 148 149 150 151 152 153 |
# File 'lib/bin_struct/array.rb', line 144 def push(obj) obj = case obj when Hash record_from_hash(obj) else obj end @array << obj self end |
#read(data) ⇒ self
Populate object from a string or from an array of hashes
169 170 171 172 173 174 175 176 177 178 |
# File 'lib/bin_struct/array.rb', line 169 def read(data) clear case data when ::Array read_from_array(data) else read_from_string(data) end self end |
#size ⇒ Integer Also known as: length
Get number of element in array
63 |
# File 'lib/bin_struct/array.rb', line 63 def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size |
#sz ⇒ Integer
Get size in bytes
182 183 184 |
# File 'lib/bin_struct/array.rb', line 182 def sz to_s.size end |
#to_a ⇒ ::Array
Return underlying Ruby Array
188 189 190 |
# File 'lib/bin_struct/array.rb', line 188 def to_a @array end |
#to_human ⇒ ::String
Get a human readable string
200 201 202 |
# File 'lib/bin_struct/array.rb', line 200 def to_human @array.map(&:to_human).join(self.class::HUMAN_SEPARATOR) end |
#to_s ⇒ ::String
Get binary string
194 195 196 |
# File 'lib/bin_struct/array.rb', line 194 def to_s @array.map(&:to_s).join end |