safe_union
en HIDL representa un tipo de unión etiquetado de forma explícita.
Esto es similar a un union
, excepto que safe_union
realiza un seguimiento del tipo subyacente y es compatible con Java. El
El tipo safe_union
está disponible en Android 10.
y versiones posteriores para dispositivos nuevos y actualizados.
Sintaxis
Un safe_union
se expresa en HIDL de la misma manera que un
union
o struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Uso
Durante el tiempo de ejecución, un safe_union
siempre es de un solo tipo. De forma predeterminada, es el primer tipo de la unión. Por ejemplo, arriba,
MySafeUnion
es TypeA
de forma predeterminada.
hidl-gen
genera una clase o una estructura personalizadas para un safe_union
en C++ y Java. Esta clase incluye un discriminador para cada miembro (en hidl_discriminator
), un método para obtener el discriminador actual (getDiscriminator
), y set y get para cada miembro. Cada set y get se nombra exactamente como su miembro.
Por ejemplo, el método get de TypeA a
se llama “a” y muestra algo de TypeA
. El método set correspondiente también es
llamarse “a” y toma un parámetro de TypeA
. Establecer el valor en un safe_union
actualiza el valor del discriminador como lo muestra getDiscriminator
. Acceder a un valor desde un
como discriminador que no es el discriminador actual anula el programa. Por ejemplo, si llamar a getDiscriminator
en una instancia de MySafeUnion
muestra hidl_discriminator::b
, intentar recuperar a
aborta el programa.
Monoestado
Un safe_union
siempre tiene un valor, pero si no se desea tener un valor, usa android.hidl.safe_union@1.0::Monostate
como marcador de posición. Por ejemplo, la siguiente unión puede ser
noinit
(vacío) o foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };