safe_union
en HIDL representa un tipo de unión etiquetado explícitamente.
Esto es similar a un union
, excepto que safe_union
realiza un seguimiento del tipo subyacente y es compatible con Java. 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, más 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 set correspondiente también se llama "a" y toma un parámetro de TypeA
. Establecer el valor en un safe_union
actualiza el valor del discriminador como lo muestra getDiscriminator
. El acceso a un valor de un discriminador que no es el discriminador actual anula el programa. Por ejemplo, si la llamada a getDiscriminator
en una instancia de MySafeUnion
muestra hidl_discriminator::b
, el programa se anula cuando se intenta recuperar a
.
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ía) o foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };