Class: PacketGen::Types::Array Abstract

Inherits:
Object
  • Object
show all
Includes:
Enumerable
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.

Author:

  • Sylvain Daubert

Constant Summary collapse

HUMAN_SEPARATOR =

Separator used in #to_human. May be ovverriden by subclasses

','

Class Method Summary collapse

Instance Method Summary collapse

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



36
37
38
39
# File 'lib/packetgen/types/array.rb', line 36

def initialize(options={})
  @counter = options[:counter]
  @array = []
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. rubocop:disable Naming/AccessorMethodName

Parameters:

  • klass (Class)


29
30
31
# File 'lib/packetgen/types/array.rb', line 29

def self.set_of(klass)
  @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:



140
141
142
143
144
# File 'lib/packetgen/types/array.rb', line 140

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

#==(other) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/packetgen/types/array.rb', line 54

def ==(other)
  case other
  when Array
    @array == other.to_a
  else
    @array == other
  end
end

#[](index) ⇒ Object

Return the element at index.

Parameters:

  • index (integer)

Returns:

  • (Object)


50
51
52
# File 'lib/packetgen/types/array.rb', line 50

def [](index)
  @array[index]
end

#clearvoid

This method returns an undefined value.

Clear array.



65
66
67
# File 'lib/packetgen/types/array.rb', line 65

def clear
  @array.clear
end

#clear!void

This method returns an undefined value.

Clear array. Reset associated counter, if any.



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

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

#delete(obj) ⇒ Object

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

Parameters:

  • obj (Object)

Returns:

  • (Object)

    deleted object



79
80
81
82
83
# File 'lib/packetgen/types/array.rb', line 79

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



88
89
90
91
92
# File 'lib/packetgen/types/array.rb', line 88

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:



97
98
99
# File 'lib/packetgen/types/array.rb', line 97

def each
  @array.each { |el| yield el }
end

#empty?Booelan

Return true if contains no element.

Returns:

  • (Booelan)


103
104
105
# File 'lib/packetgen/types/array.rb', line 103

def empty?
  @array.empty?
end

#firstObject

Return first element

Returns:

  • (Object)


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

def first
  @array.first
end

#force_binary(str) ⇒ String

Force binary encoding for str

Parameters:

Returns:

  • (String)

    binary encoded string



198
199
200
# File 'lib/packetgen/types/array.rb', line 198

def force_binary(str)
  PacketGen.force_binary str
end

#initialize_copy(_other) ⇒ Object

Initialize array for copy:

  • duplicate internal array.



43
44
45
# File 'lib/packetgen/types/array.rb', line 43

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

#lastObject

Return last element.

Returns:

  • (Object)


115
116
117
# File 'lib/packetgen/types/array.rb', line 115

def last
  @array.last
end

#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:



124
125
126
127
128
129
130
131
132
133
# File 'lib/packetgen/types/array.rb', line 124

def push(obj)
  obj = case obj
        when Hash
          record_from_hash obj
        else
          obj
        end
  @array << obj
  self
end

#read(str) ⇒ self

Populate object from a string

Parameters:

Returns:

  • (self)


149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/packetgen/types/array.rb', line 149

def read(str)
  clear
  return self if str.nil?
  return self if @counter && @counter.to_i.zero?
  force_binary str
  klass = self.class.class_eval { @klass }
  until str.empty?
    obj = klass.new.read(str)
    @array << obj
    str.slice!(0, obj.sz)
    break if @counter && self.size == @counter.to_i
  end
  self
end

#sizeInteger Also known as: length

Get number of element in array

Returns:

  • (Integer)


166
167
168
# File 'lib/packetgen/types/array.rb', line 166

def size
  @array.size
end

#szInteger

Get size in bytes

Returns:

  • (Integer)


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

def sz
  to_s.size
end

#to_a::Array

Return an Array

Returns:

  • (::Array)


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

def to_a
  @array
end

#to_humanString

Get a human readable string

Returns:



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

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

#to_sString

Get binary string

Returns:



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

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