class FFI::Struct
Public Class Methods
@return (see Struct#alignment
)
# File lib/ffi/struct.rb, line 104 def self.alignment @layout.alignment end
# File lib/ffi/struct.rb, line 165 def self.auto_ptr @managed_type ||= Type::Mapped.new(ManagedStructConverter.new(self)) end
# File lib/ffi/struct.rb, line 143 def self.by_ref(flags = :inout) self.ptr(flags) end
# File lib/ffi/struct.rb, line 139 def self.by_value self.val end
# File lib/ffi/struct.rb, line 123 def self.in ptr(:in) end
@return [StructLayout] @overload layout
@return [StructLayout] Get struct layout.
@overload layout(*spec)
@param [Array<Symbol, Integer>,Array(Hash)] spec @return [StructLayout] Create struct layout from +spec+. @example Creating a layout from an array +spec+ class MyStruct < Struct layout :field1, :int, :field2, :pointer, :field3, :string end @example Creating a layout from an array +spec+ with offset class MyStructWithOffset < Struct layout :field1, :int, :field2, :pointer, 6, # set offset to 6 for this field :field3, :string end @example Creating a layout from a hash +spec+ class MyStructFromHash < Struct layout :field1 => :int, :field2 => :pointer, :field3 => :string end @example Creating a layout with pointers to functions class MyFunctionTable < Struct layout :function1, callback([:int, :int], :int), :function2, callback([:pointer], :void), :field3, :string end
# File lib/ffi/struct.rb, line 205 def layout(*spec) return @layout if spec.size == 0 warn "[DEPRECATION] Struct layout is already defined for class #{self.inspect}. Redefinition as in #{caller[0]} will be disallowed in ffi-2.0." if defined?(@layout) 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
(see FFI::Type#members)
# File lib/ffi/struct.rb, line 109 def self.members @layout.members end
(see FFI::StructLayout#offset_of
)
# File lib/ffi/struct.rb, line 119 def self.offset_of(name) @layout.offset_of(name) end
(see FFI::StructLayout#offsets
)
# File lib/ffi/struct.rb, line 114 def self.offsets @layout.offsets end
# File lib/ffi/struct.rb, line 127 def self.out ptr(:out) end
# File lib/ffi/struct.rb, line 131 def self.ptr(flags = :inout) @ref_data_type ||= Type::Mapped.new(StructByReference.new(self)) end
Get struct size @return [Integer]
# File lib/ffi/struct.rb, line 91 def self.size defined?(@layout) ? @layout.size : defined?(@size) ? @size : 0 end
set struct size @param [Integer] size @return [size]
# File lib/ffi/struct.rb, line 98 def self.size=(size) raise ArgumentError, "Size already set" if defined?(@size) || defined?(@layout) @size = size end
# File lib/ffi/struct.rb, line 135 def self.val @val_data_type ||= StructByValue.new(self) end
Protected Class Methods
# File lib/ffi/struct.rb, line 244 def aligned(alignment = 1) @min_alignment = alignment end
Also aliased as: align
# File lib/ffi/struct.rb, line 230 def callback(params, ret) mod = enclosing_module ret_type = find_type(ret, mod) if ret_type == Type::STRING raise TypeError, ":string is not allowed as return type of callbacks" end FFI::CallbackInfo.new(ret_type, params.map { |e| find_type(e, mod) }) end
# File lib/ffi/struct.rb, line 249 def enclosing_module begin mod = self.name.split("::")[0..-2].inject(Object) { |obj, c| obj.const_get(c) } if mod.respond_to?(:find_type) && (mod.is_a?(FFI::Library) || mod < FFI::Struct) mod end rescue Exception nil end end
# File lib/ffi/struct.rb, line 261 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
# File lib/ffi/struct.rb, line 276 def find_type(type, mod = enclosing_module) if mod mod.find_type(type) end || FFI.find_type(type) end
# File lib/ffi/struct.rb, line 239 def packed(packed = 1) @packed = packed end
Also aliased as: pack
Public Instance Methods
@return [Integer] Struct
alignment
# File lib/ffi/struct.rb, line 50 def alignment self.class.alignment end
Also aliased as: align
Clear the struct content. @return [self]
# File lib/ffi/struct.rb, line 78 def clear pointer.clear self end
(see FFI::StructLayout#members)
# File lib/ffi/struct.rb, line 61 def members self.class.members end
(see FFI::StructLayout#offset_of
)
# File lib/ffi/struct.rb, line 56 def offset_of(name) self.class.offset_of(name) end
(see FFI::StructLayout#offsets
)
# File lib/ffi/struct.rb, line 72 def offsets self.class.offsets end
Get struct size @return [Integer]
# File lib/ffi/struct.rb, line 45 def size self.class.size end
Get {Pointer} to struct content. @return [AbstractMemory]
# File lib/ffi/struct.rb, line 85 def to_ptr pointer end