Class: BinData::Virtual

Inherits:
Base
  • Object
show all
Defined in:
lib/bindata/virtual.rb

Overview

A virtual field is one that is neither read, written nor occupies space. It is used to make assertions or as a convenient label for determining offsets.

require 'bindata'

class A < BinData::Record
  string  :a, :read_length => 5
  string  :b, :read_length => 5
  virtual :c, :assert => lambda { a == b }
end

obj = A.read("abcdeabcde")
obj.a #=> "abcde"
obj.c.offset #=> 10

obj = A.read("abcdeABCDE") #=> BinData::ValidityError: assertion failed for obj.c

Parameters

Parameters may be provided at initialisation to control the behaviour of an object. These params include those for BinData::Base as well as:

:assert

Raise an error when reading or assigning if the value of this evaluated parameter is false.

Instance Attribute Summary

Attributes inherited from Base

#parent

Instance Method Summary collapse

Methods inherited from Base

#==, #=~, arg_extractor, bindata_name, #clear, #debug_name, #eval_parameter, #get_parameter, #has_parameter?, #initialize_instance, #initialize_with_warning, #inspect, #lazy_evaluator, #new, #num_bytes, #offset, #pretty_print, #read, read, register_subclasses, #rel_offset, #safe_respond_to?, #to_binary_s, #to_s, unregister_self, #write

Methods included from AcceptedParametersPlugin

#accepted_parameters, #default_parameters, #mandatory_parameters, #mutually_exclusive_parameters, #optional_parameters

Methods included from RegisterNamePlugin

included, #initialize_shared_instance

Methods included from CheckOrAdjustOffsetPlugin

included, #initialize_shared_instance

Methods included from Framework

#debug_name_of, included, #offset_of

Instance Method Details

#assert!Object



47
48
49
50
51
# File 'lib/bindata/virtual.rb', line 47

def assert!
  if has_parameter?(:assert) and not eval_parameter(:assert)
    raise ValidityError, "assertion failed for #{debug_name}"
  end
end

#assign(val) ⇒ Object



39
40
41
# File 'lib/bindata/virtual.rb', line 39

def assign(val)
  assert!
end

#clear?Boolean

Returns:

  • (Boolean)


34
# File 'lib/bindata/virtual.rb', line 34

def clear?; true; end

#do_num_bytesObject



36
# File 'lib/bindata/virtual.rb', line 36

def do_num_bytes; 0; end

#do_read(io) ⇒ Object



43
44
45
# File 'lib/bindata/virtual.rb', line 43

def do_read(io)
  assert!
end

#do_write(io) ⇒ Object



37
# File 'lib/bindata/virtual.rb', line 37

def do_write(io); end

#snapshotObject



35
# File 'lib/bindata/virtual.rb', line 35

def snapshot; nil; end