Unión segura

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;
};