safe_union
en HIDL representa un tipo de unión etiquetado de forma explícita.
Es similar a un elemento union
, excepto que safe_union
mantiene
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
es solo un tipo. De forma predeterminada, es
el primer tipo en la unión. Por ejemplo, arriba,
MySafeUnion
es TypeA
de forma predeterminada.
hidl-gen
genera una clase o struct personalizada para un
safe_union
en C++ y Java. Esta clase incluye un
discriminante por cada miembro (en hidl_discriminator
), un método para
obtener el discriminador actual (getDiscriminator
) y los métodos set y
métodos get para cada miembro. Cada método set y get se nombra exactamente como su miembro.
Por ejemplo, el método get para TypeA a
se llama “a”, y
muestra un valor de TypeA
. El método set correspondiente también es
llamarse “a” y toma un parámetro de TypeA
. Establecer el valor en
un elemento safe_union
actualiza el valor del discriminador como
que devuelve getDiscriminator
. Acceder a un valor desde un
como discriminador que no es el discriminador actual anula el programa. Para
por ejemplo, si llamas a getDiscriminator
en una instancia de
MySafeUnion
muestra hidl_discriminator::b
; luego,
Si intentas recuperar a
, se anula el programa.
Monoestado
Una safe_union
siempre tiene un valor, pero si no se desea
tienen 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; };