How do I use keys when using a union?
In general, rtiddsgen only recognizes keys in the outermost structure. To consider the keys in embedded structures, the outer member needs to be a key as well.
In the example below, rtiddsgen will not recognize mykey as a key for union A, struct B, or struct C.
struct D {
long mykey; //@key
long other;
};
struct B {
D d;
};
struct C {
D d;
};
union A switch (long) {
case 0:
struct B b;
case 1:
struct C c;
};You can choose to leave B and C as unkeyed types or mark their member d as a key. In that case, mykey will be the key.
However, as per the DDS-XTypes standard, unions don't support keys. You can define a new struct that contains A and move mykey there. For example:
struct MyType {
long mykey; //@key
A a;
};
If you must also keep mykey in D, then your application will have to assign MyType.mykey to a.b.d.mykey or a.c.d.mykey (depending on the key discriminator of a).