www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Meta-programming detecting anonymous unions inside structs.

reply TheFlyingFiddle <kurtyan student.chalmers.se> writes:
I am trying to port a serialization library I wrote in Lua some 
time ago. I've ran into a problem relating to types with 
anonymous unions inside.

Given this code:
enum Kind
{
    none = 0,
    array,
    integer,
    floating,
}

struct Foo
{
    Kind type;
    union
    {
        ulong  integer;
        double floating;
        void[] array;
    }
    int nonUnionField;
    //...
}

How can I tell that "integer", "floating" and "array" are part 
the union while "nonUnionField" is not?

Thanks in advance.
Oct 21 2016
parent reply rikki cattermole <rikki cattermole.co.nz> writes:
On 21/10/2016 8:55 PM, TheFlyingFiddle wrote:
 I am trying to port a serialization library I wrote in Lua some time
 ago. I've ran into a problem relating to types with anonymous unions
 inside.

 Given this code:
 enum Kind
 {
    none = 0,
    array,
    integer,
    floating,
 }

 struct Foo
 {
    Kind type;
    union
    {
        ulong  integer;
        double floating;
        void[] array;
    }
    int nonUnionField;
    //...
 }

 How can I tell that "integer", "floating" and "array" are part the union
 while "nonUnionField" is not?

 Thanks in advance.
You're gonna have to use UDA's for that.
Oct 21 2016
parent reply TheFlyingFiddle <kurtyan student.chalmers.se> writes:
On Friday, 21 October 2016 at 07:56:27 UTC, rikki cattermole 
wrote:
 You're gonna have to use UDA's for that.
Yes, to do the serialization you're right. But my usecase for this is for error reporting. Basically any struct that contains unions without serialization instructions cannot be serialized and I want to make such structures errors. So when I try to serialize the example struct Foo. It should assert with something along the lines of: "Don't know how to serialize overlapping fields: "Foo.integer", "Foo.floating" and "Foo.array".
Oct 21 2016
parent reply rikki cattermole <rikki cattermole.co.nz> writes:
On 21/10/2016 9:13 PM, TheFlyingFiddle wrote:
 On Friday, 21 October 2016 at 07:56:27 UTC, rikki cattermole wrote:
 You're gonna have to use UDA's for that.
Yes, to do the serialization you're right. But my usecase for this is for error reporting. Basically any struct that contains unions without serialization instructions cannot be serialized and I want to make such structures errors. So when I try to serialize the example struct Foo. It should assert with something along the lines of: "Don't know how to serialize overlapping fields: "Foo.integer", "Foo.floating" and "Foo.array".
I suppose you could use .offsetof to determine this.
Oct 21 2016
parent TheFlyingFiddle <kurtyan student.chalmers.se> writes:
On Friday, 21 October 2016 at 08:18:58 UTC, rikki cattermole 
wrote:
 On 21/10/2016 9:13 PM, TheFlyingFiddle wrote:
 On Friday, 21 October 2016 at 07:56:27 UTC, rikki cattermole 
 wrote:
 You're gonna have to use UDA's for that.
Yes, to do the serialization you're right. But my usecase for this is for error reporting. Basically any struct that contains unions without serialization instructions cannot be serialized and I want to make such structures errors. So when I try to serialize the example struct Foo. It should assert with something along the lines of: "Don't know how to serialize overlapping fields: "Foo.integer", "Foo.floating" and "Foo.array".
I suppose you could use .offsetof to determine this.
This is what I was looking for. Thanks!
Oct 21 2016