Class: BinStruct::Array Abstract

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
LengthFrom, Structable, Enumerable
Defined in:
lib/bin_struct/array.rb

Overview

This class is abstract.

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.

Author:

  • Sylvain Daubert (2016-2024)

  • LemonTree55

Constant Summary collapse

HUMAN_SEPARATOR =

Separator used in #to_human. May be overriden by subclasses

','

Constants included from LengthFrom

LengthFrom::MAX_SZ_TO_READ

Class Method Summary collapse

Instance Method Summary collapse

Methods included from LengthFrom

#initialize_length_from, #read_with_length_from, #sz_to_read

Methods included from Structable

#format_inspect, #type_name

Constructor Details

#initialize(options = {}) ⇒ Array

Returns a new instance of Array.

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • counter (Int)

    Int object used as a counter for this set



89
90
91
92
93
# File 'lib/bin_struct/array.rb', line 89

def initialize(options = {})
  @counter = options[:counter]
  @array = []
  initialize_length_from(options)
end

Class Method Details

.set_of(klass) ⇒ void

This method returns an undefined value.

Define type of objects in set. Used by #read and #push.

Parameters:

  • klass (Class)


81
82
83
# File 'lib/bin_struct/array.rb', line 81

def set_of(klass)
  @klass = klass
end

.set_of_klassClass

Get class set with set_of.

Returns:

  • (Class)


74
75
76
# File 'lib/bin_struct/array.rb', line 74

def set_of_klass
  @klass
end

Instance Method Details

#<<(obj) ⇒ self

This method is abstract.

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

Parameters:

  • obj (Object)

    type depends on subclass

Returns:

  • (self)


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.

Returns:

  • (Boolean)


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.

Parameters:

  • index (Integer)

Returns:

  • (Object)


63
# File 'lib/bin_struct/array.rb', line 63

def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size

#clearvoid

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

Parameters:

  • obj (Object)

Returns:

  • (Object)

    deleted object



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

Parameters:

  • index (Integer)

Returns:

  • (Object, nil)

    deleted object



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.

Returns:

  • (::Array)


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.

Returns:

  • (Boolean)


63
# File 'lib/bin_struct/array.rb', line 63

def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size

#firstObject

Return first element

Returns:

  • (Object)


63
# File 'lib/bin_struct/array.rb', line 63

def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size

#initialize_copy(_other) ⇒ Object

Note:

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

#lastObject

Return last element.

Returns:

  • (Object)


63
# File 'lib/bin_struct/array.rb', line 63

def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size

#push(obj) ⇒ self

This method is abstract.

depend on private method #record_from_hash which should be declared by subclasses.

Add an object to this array. Do not update associated counter.

Parameters:

  • obj (Object)

    type depends on subclass

Returns:

  • (self)

See Also:



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

Parameters:

  • data (::String, ::Array<Hash>)

Returns:

  • (self)


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

#sizeInteger Also known as: length

Get number of element in array

Returns:

  • (Integer)


63
# File 'lib/bin_struct/array.rb', line 63

def_delegators :@array, :[], :clear, :each, :empty?, :first, :last, :size

#szInteger

Get size in bytes

Returns:

  • (Integer)


182
183
184
# File 'lib/bin_struct/array.rb', line 182

def sz
  to_s.size
end

#to_a::Array

Return underlying Ruby Array

Returns:

  • (::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

Returns:

  • (::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

Returns:

  • (::String)


194
195
196
# File 'lib/bin_struct/array.rb', line 194

def to_s
  @array.map(&:to_s).join
end