Class: BitStruct::VectorField

Inherits:
Field
  • Object
show all
Defined in:
lib/bit-struct/vector-field.rb

Overview

Class for embedding a BitStruct::Vector as a field within a BitStruct. Declared with BitStruct.vector.

Instance Attribute Summary

Attributes inherited from Field

#default, #display_name, #format, #length, #name, #offset, #options

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Field

default, #initialize, #inspect_in_object, #inspectable?

Constructor Details

This class inherits a constructor from BitStruct::Field

Class Method Details

.class_nameObject

Used in describe.



8
9
10
# File 'lib/bit-struct/vector-field.rb', line 8

def self.class_name
  @class_name ||= "vector"
end

Instance Method Details

#add_accessors_to(cl, attr = name) ⇒ Object

:nodoc:



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/bit-struct/vector-field.rb', line 36

def add_accessors_to(cl, attr = name) # :nodoc:
  unless offset % 8 == 0
    raise ArgumentError,
      "Bad offset, #{offset}, for vector field #{name}." +
      " Must be multiple of 8."
  end
  
  unless length % 8 == 0
    raise ArgumentError,
      "Bad length, #{length}, for vector field #{name}." +
      " Must be multiple of 8."
  end
  
  offset_byte = offset / 8
  length_byte = length / 8
  last_byte = offset_byte + length_byte - 1
  byte_range = offset_byte..last_byte

  vc = vector_class
  
  cl.class_eval do
    define_method attr do ||
      vc.new(self[byte_range])
    end

    define_method "#{attr}=" do |val|
      if val.length != length_byte
        raise ArgumentError, "Size mismatch in vector field assignment " +
          "to #{attr} with value #{val.inspect}"
      end
      
      if val.class != vc
        warn "Type mismatch in vector field assignment " +
          "to #{attr} with value #{val.inspect}"
      end
      
      self[byte_range] = val
    end
  end
end

#class_nameObject

Used in describe.



13
14
15
# File 'lib/bit-struct/vector-field.rb', line 13

def class_name
  @class_name ||= vector_class.name[/\w+$/]
end

#describe(opts) ⇒ Object

:nodoc:



25
26
27
28
29
30
31
32
33
34
# File 'lib/bit-struct/vector-field.rb', line 25

def describe opts # :nodoc:
  if opts[:expand]
    opts = opts.dup
    opts[:byte_offset] = offset / 8
    opts[:omit_header] = opts[:omit_footer] = true
    vector_class.describe(nil, opts) {|desc| yield desc}
  else
    super
  end
end

#vector_classObject

Returns the subclass of Vector that is used to manage the value of this field. If the class was specified in the BitStruct.vector declaration, #vector_class will return it, otherwise it will be an anonymous class (which you can assign to a constant to make nonymous ;).



21
22
23
# File 'lib/bit-struct/vector-field.rb', line 21

def vector_class
  @vector_class ||= options[:vector_class] || options["vector_class"]
end