### Home Classes Methods

### In Files

- lib/ffi/struct.rb
- ext/ffi_c/ffi.c

### Parent

Object

### Namespace

- CLASS FFI::Struct::InlineArray
- CLASS FFI::Struct::ManagedStructConverter

### Methods

- ::align
- ::aligned
- ::alignment
- ::auto_ptr
- ::by_ref
- ::by_value
- ::callback
- ::enclosing_module
- ::find_field_type
- ::find_type
- ::in
- ::layout
- ::members
- ::offset_of
- ::offsets
- ::out
- ::pack
- ::packed
- ::ptr
- ::size
- ::size=
- ::val
- #align
- #alignment
- #clear
- #members
- #offset_of
- #offsets
- #size
- #to_ptr
- #values

### Files

- Makefile
- LICENSE
- compile
- configure
- depcomp
- stamp-vti
- install-sh
- libtool-version
- mdate-sh
- missing

### Class/Module Index

Quicksearch

- FFI
- FFI::ArrayType
- FFI::AutoPointer
- FFI::AutoPointer::CallableReleaser
- FFI::AutoPointer::DefaultReleaser
- FFI::AutoPointer::Releaser
- FFI::ConstGenerator
- FFI::ConstGenerator::Constant
- FFI::DynamicLibrary
- FFI::DynamicLibrary::Symbol
- FFI::Enum
- FFI::Enums
- FFI::Function
- FFI::Generator
- FFI::Generator::Task
- FFI::IO
- FFI::ManagedStruct
- FFI::Platform
- FFI::PlatformError
- FFI::Pointer
- FFI::StrPtrConverter
- FFI::Struct
- FFI::Struct::InlineArray
- FFI::Struct::ManagedStructConverter
- FFI::StructByReference
- FFI::StructByValue
- FFI::StructGenerator
- FFI::StructGenerator::Field
- FFI::StructLayout
- FFI::StructLayout::Enum
- FFI::StructLayout::InnerStruct
- FFI::StructLayout::Mapped
- FFI::StructLayoutBuilder
- FFI::TypesGenerator
- FFI::Union
- FFI::VariadicInvoker

No matching classes.

# FFI::Struct

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

### Public Class Methods

alignment() click to toggle source

@return (see Struct#alignment)

    # File lib/ffi/struct.rb, line 164
    def self.alignment
      @layout.alignment
    end

auto_ptr() click to toggle source

    # File lib/ffi/struct.rb, line 225
    def self.auto_ptr
      @managed_type ||= Type::Mapped.new(ManagedStructConverter.new(self))
    end

by_ref(flags = :inout) click to toggle source

    # File lib/ffi/struct.rb, line 203
    def self.by_ref(flags = :inout)
      self.ptr(flags)
    end

by_value() click to toggle source

    # File lib/ffi/struct.rb, line 199
    def self.by_value
      self.val
    end

in() click to toggle source

    # File lib/ffi/struct.rb, line 183
    def self.in
      ptr(:in)
    end

layout(*spec) click to toggle source

@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+ (Ruby 1.9 only)
      class MyStructFromHash < Struct
        layout :field1 => :int,
               :field2 => :pointer,
               :field3 => :string
      end
    @note Creating a layout from a hash +spec+ is supported only for Ruby 1.9.

    # File lib/ffi/struct.rb, line 260
          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() click to toggle source

(see FFI::Type#members)

    # File lib/ffi/struct.rb, line 169
    def self.members
      @layout.members
    end

offset_of(name) click to toggle source

(see FFI::StructLayout#offset_of)

    # File lib/ffi/struct.rb, line 179
    def self.offset_of(name)
      @layout.offset_of(name)
    end

offsets() click to toggle source

(see FFI::StructLayout#offsets)

    # File lib/ffi/struct.rb, line 174
    def self.offsets
      @layout.offsets
    end

out() click to toggle source

    # File lib/ffi/struct.rb, line 187
    def self.out
      ptr(:out)
    end

ptr(flags = :inout) click to toggle source

    # File lib/ffi/struct.rb, line 191
    def self.ptr(flags = :inout)
      @ref_data_type ||= Type::Mapped.new(StructByReference.new(self))
    end

size() click to toggle source

Get struct size @return [Numeric]

    # File lib/ffi/struct.rb, line 151
    def self.size
      defined?(@layout) ? @layout.size : defined?(@size) ? @size : 0
    end

size=(size) click to toggle source

set struct size @param [Numeric] size @return [size]

    # 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() click to toggle source

    # File lib/ffi/struct.rb, line 195
    def self.val
      @val_data_type ||= StructByValue.new(self)
    end

### Protected Class Methods

align(alignment = 1) click to toggle source
Alias for: aligned
aligned(alignment = 1) click to toggle source

    # File lib/ffi/struct.rb, line 294
    def aligned(alignment = 1)
      @min_alignment = alignment
    end

Also aliased as: align
callback(params, ret) click to toggle source

    # File lib/ffi/struct.rb, line 284
    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

    # File lib/ffi/struct.rb, line 299
    def enclosing_module
      begin
        mod = self.name.split("::")[0..-2].inject(Object) { |obj, c| obj.const_get(c) }
        (mod < FFI::Library || mod < FFI::Struct || mod.respond_to?(:find_type)) ? mod : nil
      rescue Exception
        nil
      end
    end

find_field_type(type, mod = enclosing_module) click to toggle source

    # File lib/ffi/struct.rb, line 309
    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

    # File lib/ffi/struct.rb, line 324
    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
Alias for: packed
packed(packed = 1) click to toggle source

    # File lib/ffi/struct.rb, line 289
    def packed(packed = 1)
      @packed = packed
    end

Also aliased as: pack

### Public Instance Methods

align() click to toggle source
Alias for: alignment
alignment() click to toggle source

@return [Fixnum] Struct alignment

    # File lib/ffi/struct.rb, line 110
    def alignment
      self.class.alignment
    end

Also aliased as: align
clear() click to toggle source

Clear the struct content. @return [self]

    # File lib/ffi/struct.rb, line 138
    def clear
      pointer.clear
      self
    end

members() click to toggle source

(see FFI::StructLayout#members)

    # File lib/ffi/struct.rb, line 121
    def members
      self.class.members
    end

offset_of(name) click to toggle source

(see FFI::StructLayout#offset_of)

    # File lib/ffi/struct.rb, line 116
    def offset_of(name)
      self.class.offset_of(name)
    end

offsets() click to toggle source

(see FFI::StructLayout#offsets)

    # File lib/ffi/struct.rb, line 132
    def offsets
      self.class.offsets
    end

size() click to toggle source

Get struct size @return [Numeric]

    # File lib/ffi/struct.rb, line 105
    def size
      self.class.size
    end

to_ptr() click to toggle source

Get {Pointer} to struct content. @return [AbstractMemory]

    # File lib/ffi/struct.rb, line 145
    def to_ptr
      pointer
    end

values() click to toggle source

@return [Array] Get array of values from Struct fields.

    # File lib/ffi/struct.rb, line 127
    def values
      members.map { |m| self[m] }
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.