Class: BitStruct::VectorField
- 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
-
.class_name ⇒ Object
Used in describe.
Instance Method Summary collapse
-
#add_accessors_to(cl, attr = name) ⇒ Object
:nodoc:.
-
#class_name ⇒ Object
Used in describe.
-
#describe(opts) ⇒ Object
:nodoc:.
-
#vector_class ⇒ Object
Returns the subclass of Vector that is used to manage the value of this field.
Methods inherited from Field
default, #initialize, #inspect_in_object, #inspectable?
Constructor Details
This class inherits a constructor from BitStruct::Field
Class Method Details
.class_name ⇒ Object
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_name ⇒ Object
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_class ⇒ Object
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 ||= [:vector_class] || ["vector_class"] end |