Class: FFI::Enum

Inherits:
Object
  • Object
show all
Includes:
DataConverter
Defined in:
lib/ffi/enum.rb

Overview

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).

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(info, tag = nil) ⇒ Enum #initialize(native_type, info, tag = nil) ⇒ Enum

Returns a new instance of Enum

Overloads:

  • #initialize(info, tag = nil) ⇒ Enum

    Parameters:

    • info (nil, Enumerable)
    • tag (nil, Symbol) (defaults to: nil)

      enum tag

  • #initialize(native_type, info, tag = nil) ⇒ Enum

    Parameters:

    • native_type (FFI::Type)

      Native type for new Enum

    • info (nil, Enumerable)

      symbols and values for new Enum

    • tag (nil, Symbol) (defaults to: nil)

      name of new Enum



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/ffi/enum.rb', line 96

def initialize(*args)
  @native_type = args.shift if args.first.kind_of?(FFI::Type)
  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

Instance Attribute Details

#tagObject (readonly)

Returns the value of attribute tag



87
88
89
# File 'lib/ffi/enum.rb', line 87

def tag
  @tag
end

Instance Method Details

#[](query) ⇒ Integer #[](query) ⇒ Symbol Also known as: find

Get a symbol or a value from the enum.

Overloads:

  • #[](query) ⇒ Integer

    Get enum value from symbol.

    Parameters:

    • query (Symbol)

    Returns:

    • (Integer)
  • #[](query) ⇒ Symbol

    Get enum symbol from value.

    Parameters:

    • query (Integer)

    Returns:

    • (Symbol)


133
134
135
136
137
138
139
140
# File 'lib/ffi/enum.rb', line 133

def [](query)
  case query
  when Symbol
    @kv_map[query]
  when Integer
    @vk_map[query]
  end
end

#from_native(val, ctx) ⇒ Object

Returns symbol name if it exists for val.

Parameters:

  • val

Returns:

  • symbol name if it exists for val.



173
174
175
# File 'lib/ffi/enum.rb', line 173

def from_native(val, ctx)
  @vk_map[val] || val
end

#native_typeType

Get native type of Enum

Returns:



154
155
156
# File 'lib/ffi/enum.rb', line 154

def native_type
  @native_type || Type::INT
end

#symbol_mapHash Also known as: to_h, to_hash

Get the symbol map.

Returns:

  • (Hash)


145
146
147
# File 'lib/ffi/enum.rb', line 145

def symbol_map
  @kv_map
end

#symbolsArray

Returns enum symbol names

Returns:

  • (Array)

    enum symbol names



120
121
122
# File 'lib/ffi/enum.rb', line 120

def symbols
  @kv_map.keys
end

#to_native(val, ctx) ⇒ Integer

Returns value of a enum symbol

Parameters:

  • val (Symbol, Integer, #to_int)
  • ctx

    unused

Returns:

  • (Integer)

    value of a enum symbol



161
162
163
164
165
166
167
168
169
# File 'lib/ffi/enum.rb', line 161

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