Using the Variant (Setting it's memory location)

Era Scarecrow rtcvb32 at yahoo.com
Wed Feb 8 00:46:22 PST 2012


On Tuesday, 7 February 2012 at 17:51:42 UTC, Pedro Lacerda wrote:
> You can roll your own tagged union instead. The S struct can 
> store long and
> byte[], S.ptr is a pointer to the data.


Yep, a bit like my code, except with switch cases covering all 
major types; That and trying to do comparison and setting 
functions, which seems a bit much. Testing it using templates and 
testing all the types seems like a nightmare. I've decided I need 
to pass it a ubyte array so I could do bounds checking before 
binding the memory to the union. One fewer things to worry about.

Let's see... not that I expect you to use this, but I sorta have 
this as my enum set for types.


enum ValueType {
	raw		= 0x00000000,		///default upon unknown
	mask_types	= 0xfff00000,		///Upper 4k defines general types, or 
12 flag types
	mask_size	= 0x000fffff,		///lower gives 1Million for size.

	i_types		= 0x00100000,		///integars types
	i_8 = i_types + byte.sizeof,
	i_16 = i_types + short.sizeof,
	i_32 = i_types + int.sizeof,
	i_64 = i_types + long.sizeof,

	u_types		= 0x00200000,		///unsigned numbers
	u_8 = u_types + ubyte.sizeof,
	u_16 = u_types + ushort.sizeof,
	u_32 = u_types + uint.sizeof,
	u_64 = u_types + ulong.sizeof,

	floating_types	= 0x00400000,
	float_32 = floating_types + float.sizeof, fl = float_32,
	double_64 = floating_types + double.sizeof, doub = double_64,		

	flags_types	= 0x00800000,
	flags_8 = flags_types + ubyte.sizeof,
	flags_16 = flags_types + ushort.sizeof,
	flags_32 = flags_types + uint.sizeof,
	flags_64 = flags_types + ulong.sizeof,

	ranged_types = 0x01000000,
	ranged_8 = ranged_types + ubyte.sizeof,
	ranged_16 = ranged_types + ushort.sizeof,
	ranged_32 = ranged_types + uint.sizeof,
	ranged_64 = ranged_types + ulong.sizeof,

	voidp = 0x02000000, pointer_types = voidp,	///pointers
	i_8p,		u_8p,
	i_16p,		u_16p,
	i_32p,		u_32p,
	i_64p,		u_64p,
	float_32p,	double_64p,

	var_str		= 0x04000000,
	fixed_str	= 0x08000000,
	var_ustr	= 0x10000000,
	fixed_ustr	= 0x20000000
}


More information about the Digitalmars-d-learn mailing list