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
}

Reply via email to