class BinData::Choice

selection changes. Default is false.
selection to the current selection whenever the
:copy_on_change
If set to true, copy the value of the previous
specifies the currently active choice.
:selection
An index/key into the :choices array/hash which
:selection does not exist in the :choices hash.
of :default. :default is to be used when then
not contain symbols as keys, with the exception
implementation constraint is that the hash may
be provided as [type_symbol, hash_params]. An
is to have params passed to it, then it should
representing the data object type. If a choice
array/hash.values is a list of symbols
data objects. The format of the
:choices

Either an array or a hash specifying the possible
an object. These params are:
Parameters may be provided at initialisation to control the behaviour of
== Parameters
a.to_binary_s #=> “000001”
mychoice.choice = ‘little’
a.to_binary_s #=> “001000”
a.assign(256)
selection: -> { mychoice.choice })
a = BinData::Choice.new(choices: choices, copy_on_change: true,
choices = {‘big’ => :uint16be, ‘little’ => :uint16le}
mychoice.choice = ‘big’
mychoice = Chooser.new
Chooser = Struct.new(:choice)
a # => “Type1”
a = BinData::Choice.new(choices: choices, selection: 3)
choices = [ nil, nil, nil, type1, nil, type2 ]
a # => “Type2”
a = BinData::Choice.new(choices: choices, selection: 1)
choices = [ type1, type2 ]
a # => “Type1”
a = BinData::Choice.new(choices: choices, selection: 5)
choices = {5 => type1, 17 => type2}
type2 = [:string, {value: “Type2”}]
type1 = [:string, {value: “Type1”}]
require ‘bindata’
choice.
at any particular time. Method calls will be delegated to the active
A Choice is a collection of data objects of which only one is active

def current_choice

def current_choice
  current_selection = selection
  @choices[current_selection] ||= instantiate_choice(current_selection)
end

def do_read_with_hook(io)

def do_read_with_hook(io)
  BinData.trace_message do |tracer|
    selection_string = eval_parameter(:selection).inspect
    tracer.trace_obj("#{debug_name}-selection-", selection_string)
  end
  do_read_without_hook(io)
end

def initialize_instance

def initialize_instance
  @choices = {}
  @last_selection = nil
end

def initialize_shared_instance

def initialize_shared_instance
  extend CopyOnChangePlugin if eval_parameter(:copy_on_change) == true
  super
end

def instantiate_choice(selection)

def instantiate_choice(selection)
  prototype = get_parameter(:choices)[selection]
  if prototype.nil?
    msg = "selection '#{selection}' does not exist in :choices for #{debug_name}"
    raise IndexError, msg
  end
  prototype.instantiate(nil, self)
end

def method_missing(symbol, *args, &block) # :nodoc:

:nodoc:
def method_missing(symbol, *args, &block) # :nodoc:
  current_choice.__send__(symbol, *args, &block)
end

def respond_to?(symbol, include_all = false) # :nodoc:

:nodoc:
def respond_to?(symbol, include_all = false) # :nodoc:
  current_choice.respond_to?(symbol, include_all) || super
end

def selection

Returns the current selection.
def selection
  selection = eval_parameter(:selection)
  if selection.nil?
    raise IndexError, ":selection returned nil for #{debug_name}"
  end
  selection
end