Class: PacketGen::Types::Array Abstract

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

Overview

This class is abstract.

Base class to define set of Fields subclasses.

#record_from_hash

Subclasses should define private method #record_from_hash. This method is called by #push 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

Constant Summary collapse

HUMAN_SEPARATOR =

Separator used in #to_human. May be ovverriden 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 Fieldable

#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



85
86
87
88
89
# File 'lib/packetgen/types/array.rb', line 85

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)


77
78
79
# File 'lib/packetgen/types/array.rb', line 77

def set_of(klass)
  @klass = klass
end

.set_of_klassClass

Get class set with set_of.

Returns:

  • (Class)

Since:

  • 3.0.0



70
71
72
# File 'lib/packetgen/types/array.rb', line 70

def set_of_klass
  @klass
end

Instance Method Details

#<<(obj) ⇒ Array

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:



152
153
154
155
156
# File 'lib/packetgen/types/array.rb', line 152

def <<(obj)
  push obj
  @counter&.read(@counter.to_i + 1)
  self
end

#==(other) ⇒ Object



97
98
99
100
101
102
103
104
# File 'lib/packetgen/types/array.rb', line 97

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)


58
# File 'lib/packetgen/types/array.rb', line 58

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

#clearvoid

This method returns an undefined value.

Clear array.



58
# File 'lib/packetgen/types/array.rb', line 58

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

#clear!void

This method returns an undefined value.

Clear array. Reset associated counter, if any.



108
109
110
111
# File 'lib/packetgen/types/array.rb', line 108

def clear!
  @array.clear
  @counter&.read(0)
end

#delete(obj) ⇒ Object

Delete an object from this array. Update associated counter if any

Parameters:

  • obj (Object)

Returns:

  • (Object)

    deleted object



116
117
118
119
120
# File 'lib/packetgen/types/array.rb', line 116

def delete(obj)
  deleted = @array.delete(obj)
  @counter.read(@counter.to_i - 1) if @counter && deleted
  deleted
end

#delete_at(index) ⇒ Object?

Delete element at index.

Parameters:

  • index (Integer)

Returns:

  • (Object, nil)

    deleted object



125
126
127
128
129
# File 'lib/packetgen/types/array.rb', line 125

def delete_at(index)
  deleted = @array.delete_at(index)
  @counter.read(@counter.to_i - 1) if @counter && deleted
  deleted
end

#eachArray

Calls the given block once for each element in self, passing that element as a parameter. Returns the array itself.

Returns:



58
# File 'lib/packetgen/types/array.rb', line 58

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

#empty?Booelan

Return true if contains no element.

Returns:

  • (Booelan)


58
# File 'lib/packetgen/types/array.rb', line 58

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

#firstObject

Return first element

Returns:

  • (Object)


58
# File 'lib/packetgen/types/array.rb', line 58

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

#initialize_copy(_other) ⇒ Object

Initialize array for copy:

  • duplicate internal array.



93
94
95
# File 'lib/packetgen/types/array.rb', line 93

def initialize_copy(_other)
  @array = @array.dup
end

#lastObject

Return last element.

Returns:

  • (Object)


58
# File 'lib/packetgen/types/array.rb', line 58

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

#push(obj) ⇒ Array

This method is abstract.

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

Add an object to this array

Parameters:

  • obj (Object)

    type depends on subclass

Returns:



136
137
138
139
140
141
142
143
144
145
# File 'lib/packetgen/types/array.rb', line 136

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:

Returns:

  • (self)


161
162
163
164
165
166
167
168
169
170
# File 'lib/packetgen/types/array.rb', line 161

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)


58
# File 'lib/packetgen/types/array.rb', line 58

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

#szInteger

Get size in bytes

Returns:

  • (Integer)


174
175
176
# File 'lib/packetgen/types/array.rb', line 174

def sz
  to_s.size
end

#to_a::Array

Return an Array

Returns:

  • (::Array)


180
181
182
# File 'lib/packetgen/types/array.rb', line 180

def to_a
  @array
end

#to_humanString

Get a human readable string

Returns:



192
193
194
# File 'lib/packetgen/types/array.rb', line 192

def to_human
  @array.map(&:to_human).join(self.class::HUMAN_SEPARATOR)
end

#to_sString

Get binary string

Returns:



186
187
188
# File 'lib/packetgen/types/array.rb', line 186

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