alignment()
click to toggle source
def self.alignment
@layout.alignment
end
auto_ptr()
click to toggle source
def self.auto_ptr
@managed_type ||= Type::Mapped.new(ManagedStructConverter.new(self))
end
by_ref(flags = :inout)
click to toggle source
def self.by_ref(flags = :inout)
self.ptr(flags)
end
by_value()
click to toggle source
def self.by_value
self.val
end
in()
click to toggle source
layout(*spec)
click to toggle source
def layout(*spec)
return @layout if spec.size == 0
builder = StructLayoutBuilder.new
builder.union = self < Union
builder.packed = @packed if defined?(@packed)
builder.alignment = @min_alignment if defined?(@min_alignment)
if spec[0].kind_of?(Hash)
hash_layout(builder, spec)
else
array_layout(builder, spec)
end
builder.size = @size if defined?(@size) && @size > builder.size
cspec = builder.build
@layout = cspec unless self == Struct
@size = cspec.size
return cspec
end
members()
click to toggle source
def self.members
@layout.members
end
offset_of(name)
click to toggle source
def self.offset_of(name)
@layout.offset_of(name)
end
offsets()
click to toggle source
def self.offsets
@layout.offsets
end
out()
click to toggle source
def self.out
ptr(:out)
end
ptr(flags = :inout)
click to toggle source
def self.ptr(flags = :inout)
@ref_data_type ||= Type::Mapped.new(StructByReference.new(self))
end
size()
click to toggle source
def self.size
defined?(@layout) ? @layout.size : defined?(@size) ? @size : 0
end
size=(size)
click to toggle source
def self.size=(size)
raise ArgumentError, "Size already set" if defined?(@size) || defined?(@layout)
@size = size
end
val()
click to toggle source
def self.val
@val_data_type ||= StructByValue.new(self)
end
align(alignment = 1)
click to toggle source
aligned(alignment = 1)
click to toggle source
def aligned(alignment = 1)
@min_alignment = alignment
end
callback(params, ret)
click to toggle source
def callback(params, ret)
mod = enclosing_module
FFI::CallbackInfo.new(find_type(ret, mod), params.map { |e| find_type(e, mod) })
end
enclosing_module()
click to toggle source
def enclosing_module
begin
mod = self.name.split("::")[0..-2].inject(Object) { |obj, c| obj.const_get(c) }
mod.respond_to?(:find_type) ? mod : nil
rescue Exception
nil
end
end
find_field_type(type, mod = enclosing_module)
click to toggle source
def find_field_type(type, mod = enclosing_module)
if type.kind_of?(Class) && type < Struct
FFI::Type::Struct.new(type)
elsif type.kind_of?(Class) && type < FFI::StructLayout::Field
type
elsif type.kind_of?(::Array)
FFI::Type::Array.new(find_field_type(type[0]), type[1])
else
find_type(type, mod)
end
end
find_type(type, mod = enclosing_module)
click to toggle source
def find_type(type, mod = enclosing_module)
if mod
mod.find_type(type)
end || FFI.find_type(type)
end
pack(packed = 1)
click to toggle source
packed(packed = 1)
click to toggle source
def packed(packed = 1)
@packed = packed
end
align()
click to toggle source
alignment()
click to toggle source
def alignment
self.class.alignment
end
clear()
click to toggle source
def clear
pointer.clear
self
end
members()
click to toggle source
def members
self.class.members
end
offset_of(name)
click to toggle source
def offset_of(name)
self.class.offset_of(name)
end
offsets()
click to toggle source
def offsets
self.class.offsets
end
size()
click to toggle source
def size
self.class.size
end
to_ptr()
click to toggle source
values()
click to toggle source
def values
members.map { |m| self[m] }
end