### Home Classes Methods

### In Files

- ext/ffi_c/ffi.c

### Parent

Object

### Methods

- ::new
- #alignment
- #get
- #name
- #offset
- #put
- #size
- #type

### Files

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

### Class/Module Index

Quicksearch

- FFI
- FFI::AutoPointer
- FFI::AutoPointer::CallableReleaser
- FFI::AutoPointer::DefaultReleaser
- FFI::AutoPointer::Releaser
- FFI::ConstGenerator
- FFI::ConstGenerator::Constant
- FFI::Enum
- FFI::Enums
- FFI::FunctionType
- FFI::Generator
- FFI::Generator::Task
- FFI::IO
- FFI::Library
- FFI::ManagedStruct
- FFI::NotFoundError
- FFI::Platform
- FFI::PlatformError
- FFI::Pointer
- FFI::StrPtrConverter
- FFI::Struct
- FFI::Struct::ManagedStructConverter
- FFI::StructGenerator
- FFI::StructGenerator::Field
- FFI::StructLayout
- FFI::StructLayout::Array
- FFI::StructLayout::Enum
- FFI::StructLayout::Field
- FFI::StructLayout::Function
- FFI::StructLayout::InnerStruct
- FFI::StructLayout::Mapped
- FFI::StructLayout::Number
- FFI::StructLayout::Pointer
- FFI::StructLayout::String
- FFI::StructLayoutBuilder
- FFI::TypesGenerator
- FFI::Union
- FFI::VariadicInvoker

No matching classes.

# FFI::StructLayout::Field

A field in a {StructLayout}.

### Public Class Methods

initialize(name, offset, type) click to toggle source
@param [String,Symbol] name
@param [Fixnum] offset
@param [FFI::Type] type
@return [self]
A new FFI::StructLayout::Field instance.

    static VALUE
    struct_field_initialize(int argc, VALUE* argv, VALUE self)
    {
        VALUE rbOffset = Qnil, rbName = Qnil, rbType = Qnil;
        StructField* field;
        int nargs;

        Data_Get_Struct(self, StructField, field);

        nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType);

        if (TYPE(rbName) != T_SYMBOL && TYPE(rbName) != T_STRING) {
            rb_raise(rb_eTypeError, "wrong argument type %s (expected Symbol/String)",
                    rb_obj_classname(rbName));
        }

        Check_Type(rbOffset, T_FIXNUM);

        if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) {
            rb_raise(rb_eTypeError, "wrong argument type %s (expected FFI::Type)",
                    rb_obj_classname(rbType));
        }

        field->offset = NUM2UINT(rbOffset);
        field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName);
        field->rbType = rbType;
        Data_Get_Struct(field->rbType, Type, field->type);
        field->memoryOp = get_memory_op(field->type);
        field->referenceIndex = -1;

        switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) {
            case NATIVE_FUNCTION:
            case NATIVE_CALLBACK:
            case NATIVE_POINTER:
                field->referenceRequired = true;
                break;

            default:
                field->referenceRequired = (rb_respond_to(self, rb_intern("reference_required?"))
                        && RTEST(rb_funcall2(self, rb_intern("reference_required?"), 0, NULL)))
                        || (rb_respond_to(rbType, rb_intern("reference_required?"))
                            && RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL)));
                break;
        }

        return self;
    }

### Public Instance Methods

alignment click to toggle source
@return [Numeric]
Get the field alignment.

    static VALUE
    struct_field_alignment(VALUE self)
    {
        StructField* field;
        Data_Get_Struct(self, StructField, field);
        return UINT2NUM(field->type->ffiType->alignment);
    }

get(pointer) click to toggle source
@param [AbstractMemory] pointer pointer on a {Struct}
@return [Object]
Get an object of type {#type} from memory pointed by +pointer+.

    static VALUE
    struct_field_get(VALUE self, VALUE pointer)
    {
        StructField* f;

        Data_Get_Struct(self, StructField, f);
        if (f->memoryOp == NULL) {
            rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType));
            return Qnil;
        }

        return (*f->memoryOp->get)(MEMORY(pointer), f->offset);
    }

name click to toggle source
@return [Symbol]
Get the field name.

    static VALUE
    struct_field_name(VALUE self)
    {
        StructField* field;
        Data_Get_Struct(self, StructField, field);
        return field->rbName;
    }

offset click to toggle source
@return [Numeric]
Get the field offset.

    static VALUE
    struct_field_offset(VALUE self)
    {
        StructField* field;
        Data_Get_Struct(self, StructField, field);
        return UINT2NUM(field->offset);
    }

put(pointer, value) click to toggle source
@param [AbstractMemory] pointer pointer on a {Struct}
@param [Object] value this object must be a kind of {#type}
@return [self]
Put an object to memory pointed by +pointer+.

    static VALUE
    struct_field_put(VALUE self, VALUE pointer, VALUE value)
    {
        StructField* f;

        Data_Get_Struct(self, StructField, f);
        if (f->memoryOp == NULL) {
            rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType));
            return self;
        }

        (*f->memoryOp->put)(MEMORY(pointer), f->offset, value);

        return self;
    }

size click to toggle source
@return [Numeric]
Get the field size.

    static VALUE
    struct_field_size(VALUE self)
    {
        StructField* field;
        Data_Get_Struct(self, StructField, field);
        return UINT2NUM(field->type->ffiType->size);
    }

type click to toggle source
@return [Type]
Get the field type.

    static VALUE
    struct_field_type(VALUE self)
    {
        StructField* field;
        Data_Get_Struct(self, StructField, field);

        return field->rbType;
    }

[Validate]

Generated with the Darkfish Rdoc Generator 2.