Class: BinData::Choice
- Includes:
- 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 => lambda { 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
-
.sanitize_parameters!(params) ⇒ Object
:nodoc:.
- .turn_off_tracing ⇒ Object
- .turn_on_tracing ⇒ Object
Instance Method Summary collapse
- #assign(val) ⇒ Object
-
#clear ⇒ Object
:nodoc:.
-
#clear? ⇒ Boolean
:nodoc:.
-
#do_num_bytes ⇒ Object
:nodoc:.
-
#do_read(io) ⇒ Object
:nodoc:.
-
#do_write(io) ⇒ Object
:nodoc:.
- #initialize_instance ⇒ Object
- #initialize_shared_instance ⇒ Object
-
#method_missing(symbol, *args, &block) ⇒ Object
:nodoc:.
-
#respond_to?(symbol, include_private = false) ⇒ Boolean
:nodoc:.
-
#safe_respond_to?(symbol, include_private = false) ⇒ Boolean
:nodoc:.
-
#selection ⇒ Object
A convenience method that returns the current selection.
- #snapshot ⇒ Object
Methods included from DSLMixin
Methods inherited from Base
#==, #=~, arg_extractor, bindata_name, #debug_name, #debug_name_of, #eval_parameter, #get_parameter, #has_parameter?, #initialize_with_warning, #inspect, #lazy_evaluator, #new, #num_bytes, #offset, #offset_of, #pretty_print, #read, read, register_subclasses, #rel_offset, #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
#method_missing(symbol, *args, &block) ⇒ Object
:nodoc:
151 152 153 |
# File 'lib/bindata/choice.rb', line 151 def method_missing(symbol, *args, &block) #:nodoc: current_choice.__send__(symbol, *args, &block) end |
Class Method Details
.sanitize_parameters!(params) ⇒ Object
:nodoc:
70 71 72 73 74 75 76 77 78 |
# File 'lib/bindata/choice.rb', line 70 def sanitize_parameters!(params) #:nodoc: params.merge!(dsl_params) if params.needs_sanitizing?(:choices) choices = choices_as_hash(params[:choices]) ensure_valid_keys(choices) params[:choices] = params.create_sanitized_choices(choices) end end |
.turn_off_tracing ⇒ Object
77 78 79 |
# File 'lib/bindata/trace.rb', line 77 def turn_off_tracing alias_method :hook_before_do_read, :null_method end |
.turn_on_tracing ⇒ Object
73 74 75 |
# File 'lib/bindata/trace.rb', line 73 def turn_on_tracing alias_method :hook_before_do_read, :trace_selection end |
Instance Method Details
#assign(val) ⇒ Object
135 136 137 |
# File 'lib/bindata/choice.rb', line 135 def assign(val) current_choice.assign(val) end |
#clear ⇒ Object
:nodoc:
127 128 129 |
# File 'lib/bindata/choice.rb', line 127 def clear #:nodoc: initialize_instance end |
#clear? ⇒ Boolean
:nodoc:
131 132 133 |
# File 'lib/bindata/choice.rb', line 131 def clear? #:nodoc: current_choice.clear? end |
#do_num_bytes ⇒ Object
:nodoc:
164 165 166 |
# File 'lib/bindata/choice.rb', line 164 def do_num_bytes #:nodoc: current_choice.do_num_bytes end |
#do_read(io) ⇒ Object
:nodoc:
155 156 157 158 |
# File 'lib/bindata/choice.rb', line 155 def do_read(io) #:nodoc: hook_before_do_read current_choice.do_read(io) end |
#do_write(io) ⇒ Object
:nodoc:
160 161 162 |
# File 'lib/bindata/choice.rb', line 160 def do_write(io) #:nodoc: current_choice.do_write(io) end |
#initialize_instance ⇒ Object
117 118 119 120 |
# File 'lib/bindata/choice.rb', line 117 def initialize_instance @choices = {} @last_selection = nil end |
#initialize_shared_instance ⇒ Object
109 110 111 112 113 114 115 |
# File 'lib/bindata/choice.rb', line 109 def initialize_shared_instance if eval_parameter(:copy_on_change) == true class << self alias_method :hook_after_current_choice, :copy_previous_value end end end |
#respond_to?(symbol, include_private = false) ⇒ Boolean
:nodoc:
143 144 145 |
# File 'lib/bindata/choice.rb', line 143 def respond_to?(symbol, include_private = false) #:nodoc: current_choice.respond_to?(symbol, include_private) || super end |
#safe_respond_to?(symbol, include_private = false) ⇒ Boolean
:nodoc:
147 148 149 |
# File 'lib/bindata/choice.rb', line 147 def safe_respond_to?(symbol, include_private = false) #:nodoc: orig_respond_to?(symbol, include_private) end |
#selection ⇒ Object
A convenience method that returns the current selection.
123 124 125 |
# File 'lib/bindata/choice.rb', line 123 def selection eval_parameter(:selection) end |
#snapshot ⇒ Object
139 140 141 |
# File 'lib/bindata/choice.rb', line 139 def snapshot current_choice.snapshot end |