Class: BinData::Choice
- Extended by:
- DSLMixin
- Defined in:
- lib/bindata/choice.rb,
lib/bindata/trace.rb
Overview
A Choice is a collection of data objects of which only one is active at any particular time. Method calls will be delegated to the active choice.
require 'bindata'
type1 = [:string, {value: "Type1"}]
type2 = [:string, {value: "Type2"}]
choices = {5 => type1, 17 => type2}
a = BinData::Choice.new(choices: choices, selection: 5)
a # => "Type1"
choices = [ type1, type2 ]
a = BinData::Choice.new(choices: choices, selection: 1)
a # => "Type2"
choices = [ nil, nil, nil, type1, nil, type2 ]
a = BinData::Choice.new(choices: choices, selection: 3)
a # => "Type1"
Chooser = Struct.new(:choice)
mychoice = Chooser.new
mychoice.choice = 'big'
choices = {'big' => :uint16be, 'little' => :uint16le}
a = BinData::Choice.new(choices: choices, copy_on_change: true,
selection: -> { mychoice.choice })
a.assign(256)
a.to_binary_s #=> "\001\000"
mychoice.choice = 'little'
a.to_binary_s #=> "\000\001"
Parameters
Parameters may be provided at initialisation to control the behaviour of an object. These params are:
:choices
-
Either an array or a hash specifying the possible data objects. The format of the array/hash.values is a list of symbols representing the data object type. If a choice is to have params passed to it, then it should be provided as [type_symbol, hash_params]. An implementation constraint is that the hash may not contain symbols as keys, with the exception of :default. :default is to be used when then :selection does not exist in the :choices hash.
:selection
-
An index/key into the :choices array/hash which specifies the currently active choice.
:copy_on_change
-
If set to true, copy the value of the previous selection to the current selection whenever the selection changes. Default is false.
Instance Attribute Summary
Attributes inherited from Base
Class Method Summary collapse
Instance Method Summary collapse
- #do_read_with_hook(io) ⇒ Object
- #initialize_instance ⇒ Object
- #initialize_shared_instance ⇒ Object
-
#method_missing(symbol, *args, &block) ⇒ Object
:nodoc:.
-
#respond_to?(symbol, include_private = false) ⇒ Boolean
:nodoc:.
-
#selection ⇒ Object
Returns the current selection.
- #trace_selection ⇒ Object
Methods included from DSLMixin
Methods inherited from Base
#==, #=~, #abs_offset, arg_processor, auto_call_delayed_io, bindata_name, #clear, #debug_name, #eval_parameter, #get_parameter, #has_parameter?, #initialize_with_warning, #inspect, #lazy_evaluator, #new, #num_bytes, #pretty_print, #read, read, register_subclasses, #rel_offset, #safe_respond_to?, #to_binary_s, #to_hex, #to_s, unregister_self, #write
Methods included from AcceptedParametersPlugin
#accepted_parameters, #default_parameters, #mandatory_parameters, #mutually_exclusive_parameters, #optional_parameters
Methods included from CheckOrAdjustOffsetPlugin
Methods included from RegisterNamePlugin
Methods included from Framework
#assign, #bit_aligned?, #clear?, #debug_name_of, #offset_of, #snapshot
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(symbol, *args, &block) ⇒ Object
:nodoc:
92 93 94 |
# File 'lib/bindata/choice.rb', line 92 def method_missing(symbol, *args, &block) #:nodoc: current_choice.__send__(symbol, *args, &block) end |
Class Method Details
.turn_off_tracing ⇒ Object
78 79 80 |
# File 'lib/bindata/trace.rb', line 78 def turn_off_tracing alias_method :do_read, :do_read_without_hook end |
.turn_on_tracing ⇒ Object
73 74 75 76 |
# File 'lib/bindata/trace.rb', line 73 def turn_on_tracing alias_method :do_read_without_hook, :do_read alias_method :do_read, :do_read_with_hook end |
Instance Method Details
#do_read_with_hook(io) ⇒ Object
83 84 85 86 |
# File 'lib/bindata/trace.rb', line 83 def do_read_with_hook(io) trace_selection do_read_without_hook(io) end |
#initialize_instance ⇒ Object
74 75 76 77 |
# File 'lib/bindata/choice.rb', line 74 def initialize_instance @choices = {} @last_selection = nil end |
#initialize_shared_instance ⇒ Object
69 70 71 72 |
# File 'lib/bindata/choice.rb', line 69 def initialize_shared_instance extend CopyOnChangePlugin if eval_parameter(:copy_on_change) == true super end |
#respond_to?(symbol, include_private = false) ⇒ Boolean
:nodoc:
88 89 90 |
# File 'lib/bindata/choice.rb', line 88 def respond_to?(symbol, include_private = false) #:nodoc: current_choice.respond_to?(symbol, include_private) || super end |
#selection ⇒ Object
Returns the current selection.
80 81 82 83 84 85 86 |
# File 'lib/bindata/choice.rb', line 80 def selection selection = eval_parameter(:selection) if selection.nil? raise IndexError, ":selection returned nil for #{debug_name}" end selection end |
#trace_selection ⇒ Object
88 89 90 91 92 93 |
# File 'lib/bindata/trace.rb', line 88 def trace_selection BinData. do |tracer| selection_string = eval_parameter(:selection).inspect tracer.trace_obj("#{debug_name}-selection-", selection_string) end end |