class FFI::Enum

Represents a C enum.

For a C enum:

enum fruits {
  apple,
  banana,
  orange,
  pineapple
};

are defined this vocabulary:

  • a symbol is a word from the enumeration (ie. apple, by example);

  • a value is the value of a symbol in the enumeration (by example, apple has value 0 and banana 1).

Attributes

Public Class Methods

@overload initialize(info, tag=nil)

@param [nil, Enumerable] info
@param [nil, Symbol] tag enum tag

@overload initialize(native_type, info, tag=nil)

@param [FFI::Type] native_type Native type for new Enum
@param [nil, Enumerable] info symbols and values for new Enum
@param [nil, Symbol] tag name of new Enum
# File lib/ffi/enum.rb, line 96
def initialize(*args)
  @native_type = args.first.kind_of?(FFI::Type) ? args.shift : Type::INT
  info, @tag = *args
  @kv_map = Hash.new
  unless info.nil?
    last_cst = nil
    value = 0
    info.each do |i|
      case i
      when Symbol
        raise ArgumentError, "duplicate enum key" if @kv_map.has_key?(i)
        @kv_map[i] = value
        last_cst = i
        value += 1
      when Integer
        @kv_map[last_cst] = i
        value = i+1
      end
    end
  end
  @vk_map = @kv_map.invert
end

Public Instance Methods

Get a symbol or a value from the enum. @overload [](query)

Get enum value from symbol.
@param [Symbol] query
@return [Integer]

@overload [](query)

Get enum symbol from value.
@param [Integer] query
@return [Symbol]
# File lib/ffi/enum.rb, line 133
def [](query)
  case query
  when Symbol
    @kv_map[query]
  when Integer
    @vk_map[query]
  end
end
Also aliased as: find
Alias for: []

@param val @return symbol name if it exists for val.

# File lib/ffi/enum.rb, line 167
def from_native(val, ctx)
  @vk_map[val] || val
end

Get the symbol map. @return [Hash]

# File lib/ffi/enum.rb, line 145
def symbol_map
  @kv_map
end
Also aliased as: to_h, to_hash

@return [Array] enum symbol names

# File lib/ffi/enum.rb, line 120
def symbols
  @kv_map.keys
end

@param [Symbol, Integer, to_int] val @param ctx unused @return [Integer] value of a enum symbol

# File lib/ffi/enum.rb, line 155
def to_native(val, ctx)
  @kv_map[val] || if val.is_a?(Integer)
    val
  elsif val.respond_to?(:to_int)
    val.to_int
  else
    raise ArgumentError, "invalid enum value, #{val.inspect}"
  end
end