Class: BinData::Record
- Includes:
- DSLMixin
- Defined in:
- lib/bindata/record.rb
Overview
A Record is a declarative wrapper around Struct.
require 'bindata'
class SomeDataType < BinData::Record
hide :a
int32le :a
int16le :b
struct :s do
int8 :x
int8 :y
int8 :z
end
end
obj = SomeDataType.new
obj.field_names =># ["b", "s"]
obj.s.field_names =># ["x", "y", "z"]
Constant Summary
Constants inherited from Struct
Instance Attribute Summary
Attributes inherited from Base
Class Method Summary collapse
- .arg_extractor ⇒ Object
-
.define_field_accessors(fields) ⇒ Object
Defines accessor methods to avoid the overhead of going through Struct#method_missing.
- .define_field_accessors_for(name, index) ⇒ Object
-
.sanitize_parameters!(params) ⇒ Object
:nodoc:.
Methods included from DSLMixin
Methods inherited from Struct
#[], #[]=, #assign, #clear, #clear?, #debug_name_of, #do_num_bytes, #do_read, #do_write, #each_pair, #field_names, #has_key?, #initialize_instance, #initialize_shared_instance, #method_missing, #offset_of, #respond_to?, #snapshot
Methods inherited from Base
#==, #=~, #assign, bindata_name, #clear, #clear?, #debug_name, #debug_name_of, #eval_parameter, #get_parameter, #has_parameter?, #initialize_instance, #initialize_with_warning, #inspect, #lazy_evaluator, #new, #num_bytes, #offset, #offset_of, #pretty_print, #read, read, register_subclasses, #rel_offset, #safe_respond_to?, #snapshot, #to_binary_s, #to_s, unregister_self, #write
Methods included from CheckOrAdjustOffsetMixin
#do_read_with_adjust_offset, #do_read_with_check_offset, included
Methods included from AcceptedParametersMixin
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class BinData::Struct
Class Method Details
.arg_extractor ⇒ Object
70 71 72 |
# File 'lib/bindata/record.rb', line 70 def arg_extractor RecordArgExtractor end |
.define_field_accessors(fields) ⇒ Object
Defines accessor methods to avoid the overhead of going through Struct#method_missing. This is purely a speed optimisation. Removing this method will not have any effect on correctness.
85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/bindata/record.rb', line 85 def define_field_accessors(fields) #:nodoc: unless method_defined?(:bindata_defined_accessors_for_fields?) fields.each_with_index do |field, i| name = field.name_as_sym if name define_field_accessors_for(name, i) end end define_method(:bindata_defined_accessors_for_fields?) { true } end end |
.define_field_accessors_for(name, index) ⇒ Object
98 99 100 101 102 103 104 105 106 107 |
# File 'lib/bindata/record.rb', line 98 def define_field_accessors_for(name, index) define_method(name) do instantiate_obj_at(index) unless @field_objs[index] @field_objs[index] end define_method(name.to_s + "=") do |*vals| instantiate_obj_at(index) unless @field_objs[index] @field_objs[index].assign(*vals) end end |
.sanitize_parameters!(params) ⇒ Object
:nodoc:
74 75 76 77 78 79 80 |
# File 'lib/bindata/record.rb', line 74 def sanitize_parameters!(params) #:nodoc: params.merge!(dsl_params) super(params) define_field_accessors(params[:fields].fields) end |