Class: FFI::Struct
- Inherits:
-
Object
- Object
- FFI::Struct
- Defined in:
- ext/ffi_c/Struct.c,
lib/ffi/struct.rb,
ext/ffi_c/Struct.c
Overview
A FFI::Struct means to mirror a C struct.
A Struct is defined as:
class MyStruct < FFI::Struct
layout :value1, :int,
:value2, :double
end
and is used as:
my_struct = MyStruct.new
my_struct[:value1] = 12
For more information, see github.com/ffi/ffi/wiki/Structs
Direct Known Subclasses
Defined Under Namespace
Classes: InlineArray, ManagedStructConverter
Class Method Summary collapse
-
.alignment ⇒ Fixnum
Struct alignment.
- .auto_ptr ⇒ Object
- .by_ref(flags = :inout) ⇒ Object
- .by_value ⇒ Object
- .in ⇒ Object
- .layout(*spec) ⇒ StructLayout
- .members ⇒ Object
-
.offset_of(name) ⇒ Numeric
Get the offset of a field.
-
.offsets ⇒ Array<Array(Symbol, Numeric)>
Get an array of tuples (field name, offset of the field).
- .out ⇒ Object
- .ptr(flags = :inout) ⇒ Object
-
.size ⇒ Numeric
Get struct size.
-
.size=(size) ⇒ size
set struct size.
- .val ⇒ Object
Instance Method Summary collapse
-
#align ⇒ Fixnum
Struct alignment.
-
#alignment ⇒ Fixnum
Struct alignment.
-
#clear ⇒ self
Clear the struct content.
-
#members ⇒ Array<Symbol>
Get list of field names.
-
#offset_of(name) ⇒ Numeric
Get the offset of a field.
-
#offsets ⇒ Array<Array(Symbol, Numeric)>
Get an array of tuples (field name, offset of the field).
-
#size ⇒ Numeric
Get struct size.
-
#to_ptr ⇒ AbstractMemory
Get Pointer to struct content.
-
#values ⇒ Array
Get array of values from Struct fields.
Class Method Details
.alignment ⇒ Fixnum
Returns Struct alignment.
164 165 166 |
# File 'lib/ffi/struct.rb', line 164 def self.alignment @layout.alignment end |
.auto_ptr ⇒ Object
225 226 227 |
# File 'lib/ffi/struct.rb', line 225 def self.auto_ptr @managed_type ||= Type::Mapped.new(ManagedStructConverter.new(self)) end |
.by_ref(flags = :inout) ⇒ Object
203 204 205 |
# File 'lib/ffi/struct.rb', line 203 def self.by_ref(flags = :inout) self.ptr(flags) end |
.by_value ⇒ Object
199 200 201 |
# File 'lib/ffi/struct.rb', line 199 def self.by_value self.val end |
.in ⇒ Object
183 184 185 |
# File 'lib/ffi/struct.rb', line 183 def self.in ptr(:in) end |
.layout ⇒ StructLayout .layout(*spec) ⇒ StructLayout
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 |
# File 'lib/ffi/struct.rb', line 266 def layout(*spec) #raise RuntimeError, "struct layout already defined for #{self.inspect}" if defined?(@layout) 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 ⇒ Object
169 170 171 |
# File 'lib/ffi/struct.rb', line 169 def self.members @layout.members end |
.offset_of(name) ⇒ Numeric
Get the offset of a field.
179 180 181 |
# File 'lib/ffi/struct.rb', line 179 def self.offset_of(name) @layout.offset_of(name) end |
.offsets ⇒ Array<Array(Symbol, Numeric)>
Get an array of tuples (field name, offset of the field).
174 175 176 |
# File 'lib/ffi/struct.rb', line 174 def self.offsets @layout.offsets end |
.out ⇒ Object
187 188 189 |
# File 'lib/ffi/struct.rb', line 187 def self.out ptr(:out) end |
.ptr(flags = :inout) ⇒ Object
191 192 193 |
# File 'lib/ffi/struct.rb', line 191 def self.ptr(flags = :inout) @ref_data_type ||= Type::Mapped.new(StructByReference.new(self)) end |
.size ⇒ Numeric
Get struct size
151 152 153 |
# File 'lib/ffi/struct.rb', line 151 def self.size defined?(@layout) ? @layout.size : defined?(@size) ? @size : 0 end |
.size=(size) ⇒ size
set struct size
158 159 160 161 |
# File 'lib/ffi/struct.rb', line 158 def self.size=(size) raise ArgumentError, "Size already set" if defined?(@size) || defined?(@layout) @size = size end |
.val ⇒ Object
195 196 197 |
# File 'lib/ffi/struct.rb', line 195 def self.val @val_data_type ||= StructByValue.new(self) end |
Instance Method Details
#align ⇒ Fixnum
Returns Struct alignment.
113 114 115 |
# File 'lib/ffi/struct.rb', line 113 def alignment self.class.alignment end |
#alignment ⇒ Fixnum
Returns Struct alignment.
110 111 112 |
# File 'lib/ffi/struct.rb', line 110 def alignment self.class.alignment end |
#clear ⇒ self
Clear the struct content.
138 139 140 141 |
# File 'lib/ffi/struct.rb', line 138 def clear pointer.clear self end |
#members ⇒ Array<Symbol>
Get list of field names.
121 122 123 |
# File 'lib/ffi/struct.rb', line 121 def members self.class.members end |
#offset_of(name) ⇒ Numeric
Get the offset of a field.
116 117 118 |
# File 'lib/ffi/struct.rb', line 116 def offset_of(name) self.class.offset_of(name) end |
#offsets ⇒ Array<Array(Symbol, Numeric)>
Get an array of tuples (field name, offset of the field).
132 133 134 |
# File 'lib/ffi/struct.rb', line 132 def offsets self.class.offsets end |
#size ⇒ Numeric
Get struct size
105 106 107 |
# File 'lib/ffi/struct.rb', line 105 def size self.class.size end |
#to_ptr ⇒ AbstractMemory
Get Pointer to struct content.
145 146 147 |
# File 'lib/ffi/struct.rb', line 145 def to_ptr pointer end |
#values ⇒ Array
Get array of values from Struct fields.
127 128 129 |
# File 'lib/ffi/struct.rb', line 127 def values members.map { |m| self[m] } end |