Class: Fiddle::CUnionEntity

Inherits:
CStructEntity show all
Includes:
PackInfo
Defined in:
lib/fiddle/struct.rb

Overview

A C union wrapper

Constant Summary

Constants included from PackInfo

PackInfo::ALIGN_MAP, PackInfo::PACK_MAP, PackInfo::SIZE_MAP

Class Method Summary collapse

Instance Method Summary collapse

Methods included from PackInfo

align

Methods inherited from CStructEntity

#[], #[]=, #assign_names, #initialize, #to_s

Methods included from ValueUtil

#signed_value, #unsigned_value, #wrap_arg, #wrap_args

Methods inherited from Pointer

#+, #+@, #-, #-@, #<=>, #==, [], #[], #[]=, #eql?, #free, #free=, #initialize, #inspect, #null?, #ptr, #ref, #size, #size=, #to_i, #to_int, to_ptr, #to_s, #to_str, #to_value

Constructor Details

This class inherits a constructor from Fiddle::CStructEntity

Class Method Details

.malloc(types, func = nil) ⇒ Object

Allocates a C union the types provided.

When the instance is garbage collected, the C function func is called.



216
217
218
219
# File 'lib/fiddle/struct.rb', line 216

def CUnionEntity.malloc(types, func=nil)
  addr = Fiddle.malloc(CUnionEntity.size(types))
  CUnionEntity.new(addr, types, func)
end

.size(types) ⇒ Object

Returns the size needed for the union with the given types.

Fiddle::CUnionEntity.size(
  [ Fiddle::TYPE_DOUBLE,
    Fiddle::TYPE_INT,
    Fiddle::TYPE_CHAR,
    Fiddle::TYPE_VOIDP ]) #=> 8


228
229
230
231
232
# File 'lib/fiddle/struct.rb', line 228

def CUnionEntity.size(types)
  types.map { |type, count = 1|
    PackInfo::SIZE_MAP[type] * count
  }.max
end

Instance Method Details

#set_ctypes(types) ⇒ Object

Calculate the necessary offset and for each union member with the given types



236
237
238
239
240
# File 'lib/fiddle/struct.rb', line 236

def set_ctypes(types)
  @ctypes = types
  @offset = Array.new(types.length, 0)
  @size   = self.class.size types
end