class GMSEC::Field

Constants

GMSEC_TYPEDEF

Map GMSEC values to deftypes. Note that we list backward compatible aliases first.

RUBY_TO_GMSEC_TYPE
TYPE_TO_GMSEC_VALUE

Public Class Methods

new(name=nil, value=nil, type: nil) click to toggle source
# File lib/gmsec/field.rb, line 55
def initialize(name=nil, value=nil, type: nil)
  if name
    self.name = name
  end

  if type
    self.type = type
  end

  if value
    self.value = value
  end
end

Public Instance Methods

name() click to toggle source
# File lib/gmsec/field.rb, line 69
def name
  with_string_pointer do |pointer|
    gmsec_GetFieldName(self, pointer, status)
  end
end
name=(value) click to toggle source
# File lib/gmsec/field.rb, line 75
def name=(value)
  gmsec_SetFieldName(self, value.to_s, status)
end
type() click to toggle source
# File lib/gmsec/field.rb, line 124
def type
  # Create a pointer to GMSEC_TYPE that we're going to read and convert to a symbol.
  pointer = FFI::MemoryPointer.new(find_type(:GMSEC_TYPE))

  gmsec_GetFieldType(self, pointer, status)

  # Default to GMSEC_STR if type is not registered in GMSEC_DEF
  GMSEC_TYPEDEF[pointer.read_ushort] || :str
end
type=(type) click to toggle source
# File lib/gmsec/field.rb, line 134
def type=(type)
  if type.nil?
    raise TypeError.new("#{value.class} is not supported as a GMSEC type.")
  end

  field_type = TYPE_TO_GMSEC_VALUE[type]
  gmsec_SetFieldType(self, field_type, status)

  if status.is_error?
    raise RuntimeError.new("Error in specifying type '#{type}': #{status}")
  end
end
value() click to toggle source
# File lib/gmsec/field.rb, line 79
def value
  field_type = "GMSEC_#{type.to_s.upcase}".to_sym
  pointer = FFI::MemoryPointer.new(find_type(field_type))
  send(get_field_value_method, self, pointer, status)
  read_pointer_value(pointer)
end
value=(value) click to toggle source
# File lib/gmsec/field.rb, line 86
def value=(value)
  if type == :unset
    # Guess what GMSEC type value is.
    self.type = RUBY_TO_GMSEC_TYPE[value.class]
  end

  # Determind method on value type
  method = "gmsec_SetFieldValue#{type.to_s.upcase}"

  # Cast value based on value type.
  value = case value
          when Symbol
            value.to_s
          when TrueClass, FalseClass
            value ? 1 : 0
          else
            value
          end

  # Cast value based on target type.
  value = case type
          when :bool
            value ? 1 : 0
          when :i16, :i32, :u16, :u32
            value.to_i
          when :f32, :f64
            value.to_f
          when :char
            value.ord
          when :str
            value.to_s
          else
            raise RuntimeError.new("Error in assigning value to field: type '#{type}' not supported")
          end

  send(method, self, value, status)
end

Protected Instance Methods

get_field_value_method() click to toggle source
# File lib/gmsec/field.rb, line 149
def get_field_value_method
  "gmsec_GetFieldValue#{type.to_s.upcase.split("_").last}"
end
read_pointer_value(pointer) click to toggle source
# File lib/gmsec/field.rb, line 153
def read_pointer_value(pointer)
  case type
  when :char
    pointer.read_string(1)
  when :bool
    pointer.read_int == self.class.enum_type(:GMSEC_BOOL)[:GMSEC_TRUE]
  when :short
    pointer.read_short
  when :ushort
    pointer.read_ushort
  when :long
    pointer.read_long
  when :double
    pointer.read_double
  when :str
    pointer.read_pointer.read_string_to_null
  when :i16
    pointer.read_int16
  when :i32
    pointer.read_int32
  when :i64
    pointer.read_int64
  when :u16
    pointer.read_uint16
  when :u32
    pointer.read_uint32
  when :f32, :float
    pointer.read_float
  when :f64
    pointer.read_double
  else
    raise TypeError.new("#{type} is not a supported type.")
  end
end