Class: Fiddle::Packer
    Do not use.  This class is for internal use only.
  
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
| Instance Chain: 
          self,
           PackInfo | |
| Inherits: | Object | 
| Defined in: | ext/fiddle/lib/fiddle/pack.rb | 
Constant Summary
Class Method Summary
- .[](*types)
- .new(types) ⇒ Packer constructor
Instance Method Summary
Constructor Details
    .new(types)  ⇒ Packer 
  
# File 'ext/fiddle/lib/fiddle/pack.rb', line 91
def initialize(types) parse_types(types) end
Class Method Details
.[](*types)
[ GitHub ]# File 'ext/fiddle/lib/fiddle/pack.rb', line 87
def self.[](*types) new(types) end
Instance Method Details
#pack(ary)
[ GitHub ]# File 'ext/fiddle/lib/fiddle/pack.rb', line 99
def pack(ary) case SIZEOF_VOIDP when SIZEOF_LONG ary.pack(@template) else if defined?(TYPE_LONG_LONG) and SIZEOF_VOIDP == SIZEOF_LONG_LONG ary.pack(@template) else raise(RuntimeError, "sizeof(void*)?") end end end
#parse_types(types) (private)
[ GitHub ]# File 'ext/fiddle/lib/fiddle/pack.rb', line 129
def parse_types(types) @template = "".dup addr = 0 types.each{|t| orig_addr = addr if( t.is_a?(Array) ) addr = align(orig_addr, ALIGN_MAP[TYPE_VOIDP]) else addr = align(orig_addr, ALIGN_MAP[t]) end d = addr - orig_addr if( d > 0 ) @template << "x#{d}" end if( t.is_a?(Array) ) @template << (PACK_MAP[t[0]] * t[1]) addr += (SIZE_MAP[t[0]] * t[1]) else @template << PACK_MAP[t] addr += SIZE_MAP[t] end } addr = align(addr, ALIGN_MAP[TYPE_VOIDP]) @size = addr end
#size
[ GitHub ]# File 'ext/fiddle/lib/fiddle/pack.rb', line 95
def size() @size end
#unpack(ary)
[ GitHub ]# File 'ext/fiddle/lib/fiddle/pack.rb', line 113
def unpack(ary) case SIZEOF_VOIDP when SIZEOF_LONG ary.join().unpack(@template) else if defined?(TYPE_LONG_LONG) and SIZEOF_VOIDP == SIZEOF_LONG_LONG ary.join().unpack(@template) else raise(RuntimeError, "sizeof(void*)?") end end end