Class: UnitTypeCodecs

Inherits:
Object
  • Object
show all
Defined in:
lib/_aem/codecs.rb

Constant Summary collapse

DefaultUnitTypes =

and AE unit types. Each Codecs instance is allocated its own UnitTypeCodecs instance,

[
 [:centimeters, KAE::TypeCentimeters],
 [:meters, KAE::TypeMeters],
 [:kilometers, KAE::TypeKilometers],
 [:inches, KAE::TypeInches],
 [:feet, KAE::TypeFeet],
 [:yards, KAE::TypeYards],
 [:miles, KAE::TypeMiles],

 [:square_meters, KAE::TypeSquareMeters],
 [:square_kilometers, KAE::TypeSquareKilometers],
 [:square_feet, KAE::TypeSquareFeet],
 [:square_yards, KAE::TypeSquareYards],
 [:square_miles, KAE::TypeSquareMiles],

 [:cubic_centimeters, KAE::TypeCubicCentimeter],
 [:cubic_meters, KAE::TypeCubicMeters],
 [:cubic_inches, KAE::TypeCubicInches],
 [:cubic_feet, KAE::TypeCubicFeet],
 [:cubic_yards, KAE::TypeCubicYards],

 [:liters, KAE::TypeLiters],
 [:quarts, KAE::TypeQuarts],
 [:gallons, KAE::TypeGallons],

 [:grams, KAE::TypeGrams],
 [:kilograms, KAE::TypeKilograms],
 [:ounces, KAE::TypeOunces],
 [:pounds, KAE::TypePounds],

 [:degrees_Celsius, KAE::TypeDegreesC],
 [:degrees_Fahrenheit, KAE::TypeDegreesF],
 [:degrees_Kelvin, KAE::TypeDegreesK],
]
DefaultPacker =
proc { |units, code| AE::AEDesc.new(code, [units.value].pack('d')) }
DefaultUnpacker =
proc { |desc, name| MacTypes::Units.new(desc.data.unpack('d')[0], name) }

Instance Method Summary collapse

Constructor Details

#initializeUnitTypeCodecs

Returns a new instance of UnitTypeCodecs.



67
68
69
70
71
# File 'lib/_aem/codecs.rb', line 67

def initialize
  @type_by_name = {}
  @type_by_code = {}
  add_types(DefaultUnitTypes)
end

Instance Method Details

#add_types(type_defs) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/_aem/codecs.rb', line 73

def add_types(type_defs)
  # type_defs is a list of lists, where each sublist is of form:
  #   [typename, typecode, packproc, unpackproc]
  # or:
  #   [typename, typecode]
  # If optional packproc and unpackproc are omitted, default pack/unpack procs
  # are used instead; these pack/unpack AEDesc data as a double precision float.
  type_defs.each do |name, code, packer, unpacker|
    @type_by_name[name] = [code, (packer or DefaultPacker)]
    @type_by_code[code] = [name, (unpacker or DefaultUnpacker)]
  end
end

#pack(val) ⇒ Object



86
87
88
89
90
91
92
93
# File 'lib/_aem/codecs.rb', line 86

def pack(val)
  if val.is_a?(MacTypes::Units)
    code, packer = @type_by_name.fetch(val.type) { |v| raise IndexError, "Unknown unit type: #{v.inspect}" }
    return [true, packer.call(val, code)]
  else
    return [false, val]
  end
end

#unpack(desc) ⇒ Object



95
96
97
98
# File 'lib/_aem/codecs.rb', line 95

def unpack(desc)
  name, unpacker = @type_by_code.fetch(desc.type) { |d| return [false, d] }
  return [true, unpacker.call(desc, name)]
end