module FFI::Library

Public Instance Methods

bitmask(*args) click to toggle source

@overload bitmask(name, values)

Create a named bitmask
@example
 bitmask :foo, [:red, :green, :blue] # bits 0,1,2 are used
 bitmask :foo, [:red, :green, 5, :blue] # bits 0,5,6 are used
@param [Symbol] name for new bitmask
@param [Array<Symbol, Integer>] values for new bitmask

@overload bitmask(*args)

Create an unamed bitmask
@example
 bm = bitmask :red, :green, :blue # bits 0,1,2 are used
 bm = bitmask :red, :green, 5, blue # bits 0,5,6 are used
@param [Symbol, Integer] args values for new bitmask

@overload bitmask(values)

Create an unamed bitmask
@example
 bm = bitmask [:red, :green, :blue] # bits 0,1,2 are used
 bm = bitmask [:red, :green, 5, blue] # bits 0,5,6 are used
@param [Array<Symbol, Integer>] values for new bitmask

@overload bitmask(native_type, name, values)

Create a named enum and specify the native type.
@example
 bitmask FFI::Type::UINT64, :foo, [:red, :green, :blue]
@param [FFI::Type] native_type native type for new bitmask
@param [Symbol] name for new bitmask
@param [Array<Symbol, Integer>] values for new bitmask

@overload bitmask(native_type, *args)

@example
 bitmask FFI::Type::UINT64, :red, :green, :blue
@param [FFI::Type] native_type native type for new bitmask
@param [Symbol, Integer] args values for new bitmask

@overload bitmask(native_type, values)

Create a named enum and specify the native type.
@example
 bitmask FFI::Type::UINT64, [:red, :green, :blue]
@param [FFI::Type] native_type native type for new bitmask
@param [Array<Symbol, Integer>] values for new bitmask

@return [FFI::Bitmask] Create a new FFI::Bitmask

# File lib/ffi/bitmask.rb, line 46
def bitmask(*args)
  native_type = args.first.kind_of?(FFI::Type) ? args.shift : nil
  name, values = if args[0].kind_of?(Symbol) && args[1].kind_of?(Array)
    [ args[0], args[1] ]
  elsif args[0].kind_of?(Array)
    [ nil, args[0] ]
  else
    [ nil, args ]
  end
  @ffi_enums = FFI::Enums.new unless defined?(@ffi_enums)
  @ffi_enums << (e = native_type ? FFI::Bitmask.new(native_type, values, name) : FFI::Bitmask.new(values, name))

  typedef(e, name) if name
  e
end