def CStruct.union symbol,&block
union_super = self.ancestors[1]
union_class = Class.new(union_super) do
def self.change_to_union
@fields.each_key { |symbol| @fields[symbol].offset = 0 }
max_field_size = @fields.values.inject(0)do |max,field|
dimension = field.dimension
dimension_product = 1
if dimension.is_a? Array
dimension_product = dimension.inject(1){|m,d| m *= d }
end
field_size = field.size* dimension_product
max = (field_size> max ? field_size : max)
end
@options[:layout_size] = max_field_size
end
end
union_class.instance_eval(&block)
union_class.instance_eval{change_to_union}
structfield symbol,union_class,union_class.size
end