safe_union
in HIDL represents an explicitly tagged union type.
This is similar to a union
except safe_union
keeps
track of the underlying type and is compatible with Java. The
safe_union
type is available in Android 10
and higher for new and upgraded devices.
Syntax
A safe_union
is expressed in HIDL exactly like a
union
or struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Usage
At runtime, a safe_union
is only ever one type. By default, it's
the first type in the union. For instance, above,
MySafeUnion
is by default TypeA
.
hidl-gen
generates a custom class or struct for a
safe_union
in both C++ and Java. This class includes a
discriminator for each member (in hidl_discriminator
), a method to
get the current discriminator (getDiscriminator
), and setters and
getters for each member. Each setter and getter is named exactly as its member.
For instance, the getter for TypeA a
is called "a", and it
returns something of TypeA
. The corresponding setter is also
be called "a" and takes a parameter of TypeA
. Setting the value in
a safe_union
updates the value of the discriminator as
returned by getDiscriminator
. Accessing a value from a
discriminator that isn't the current discriminator aborts the program. For
instance, if calling getDiscriminator
on an instance of
MySafeUnion
returns hidl_discriminator::b
, then
trying to retrieve a
aborts the program.
Monostate
A safe_union
always has a value, but if it is desired to not
have a value, use android.hidl.safe_union@1.0::Monostate
as a
placeholder. For instance, the following union can either be
noinit
(empty) or foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };