safe_union dans HIDL représente un type d'union explicitement balisé.
Il est semblable à un union, sauf que safe_union suit
le type sous-jacent et est compatible avec Java. Le type safe_union est disponible dans Android 10 et versions ultérieures pour les appareils nouveaux et mis à niveau.
Syntaxe
Une safe_union est exprimée dans HIDL exactement comme une
union ou struct.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};Utilisation
Lors de l'exécution, une safe_union n'est jamais qu'un seul type. Par défaut, il s'agit du premier type de l'union. Par exemple, ci-dessus, MySafeUnion est TypeA par défaut.
hidl-gen génère une classe ou une structure personnalisée pour une safe_union en C++ et en Java. Cette classe inclut un discriminateur pour chaque membre (dans hidl_discriminator), une méthode pour obtenir le discriminateur actuel (getDiscriminator), ainsi que des setters et des getters pour chaque membre. Chaque setter et getter est nommé exactement comme son membre.
Par exemple, le getter pour TypeA a est appelé "a" et il
renvoie un élément de TypeA. Le setter correspondant est également appelé "a" et accepte un paramètre de TypeA. Définir la valeur dans une safe_union met à jour la valeur du discriminateur telle qu'elle est renvoyée par getDiscriminator. L'accès à une valeur à partir d'un discriminateur qui n'est pas le discriminateur actuel interrompt le programme. Par
exemple, si l'appel de getDiscriminator sur une instance de
MySafeUnion renvoie hidl_discriminator::b, alors
la tentative de récupération de a interrompt le programme.
Monostate
Une safe_union a toujours une valeur, mais si vous ne souhaitez pas en
avoir, utilisez android.hidl.safe_union@1.0::Monostate comme
espace réservé. Par exemple, l'union suivante peut être noinit (vide) ou foo :
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };