Module: WGPU::Native::EnumHelper

Defined in:
lib/wgpu/native/enum_helper.rb

Class Method Summary collapse

Class Method Details

.coerce(enum, value, name: "enum") ⇒ Integer

Converts a symbolic enum member to its integer value.

Parameters:

  • enum (FFI::Enum, Hash)

    enum mapping

  • value (Symbol, Integer)

    member or native value

  • name (String) (defaults to: "enum")

    name used in validation errors

Returns:

  • (Integer)

Raises:

  • (ArgumentError)

    if the value is invalid



14
15
16
17
18
19
20
21
22
23
# File 'lib/wgpu/native/enum_helper.rb', line 14

def coerce(enum, value, name: "enum")
  return value if value.is_a?(Integer)
  raise ArgumentError, "#{name} must be a Symbol or Integer, got #{value.class}" unless value.is_a?(Symbol)

  mapping = mapping_for(enum)
  result = mapping[value]
  return result unless result.nil?

  raise ArgumentError, unknown_value_message(name, value, mapping.keys)
end

.coerce_flags(enum, value, name: "flags") ⇒ Integer

Converts symbolic flag names to their combined integer bitset.

Parameters:

  • enum (FFI::Enum, Hash)

    flag mapping

  • value (Symbol, Integer, Array<Symbol>)

    flags to convert

  • name (String) (defaults to: "flags")

    name used in validation errors

Returns:

  • (Integer)

    combined bitset

Raises:

  • (ArgumentError)

    if a flag is unknown or has an invalid type



32
33
34
35
36
37
38
39
40
41
# File 'lib/wgpu/native/enum_helper.rb', line 32

def coerce_flags(enum, value, name: "flags")
  return value if value.is_a?(Integer)

  values = value.is_a?(Array) ? value : [value]
  unless values.all? { |item| item.is_a?(Symbol) }
    raise ArgumentError, "#{name} must be a Symbol, Integer, or Array of Symbols"
  end

  values.reduce(0) { |flags, item| flags | coerce(enum, item, name:) }
end

.decompose_flags(enum, value) ⇒ Array<Symbol>

Expands a bitset into its independent symbolic flags.

Parameters:

  • enum (FFI::Enum, Hash)

    flag mapping

  • value (Integer)

    combined bitset

Returns:

  • (Array<Symbol>)

Raises:

  • (ArgumentError)


47
48
49
50
51
52
53
54
55
56
# File 'lib/wgpu/native/enum_helper.rb', line 47

def decompose_flags(enum, value)
  raise ArgumentError, "flag value must be an Integer" unless value.is_a?(Integer)

  mapping = mapping_for(enum)
  return [:none] if value.zero? && mapping.key?(:none)

  mapping.filter_map do |symbol, bit|
    symbol if bit.positive? && power_of_two?(bit) && (value & bit) == bit
  end
end