safe_union
dans HIDL représente un type d'union tagué explicitement.
Cette méthode est semblable à union
, sauf que safe_union
garde le suivi du type sous-jacent et est compatible avec Java. Le type safe_union
est disponible sur Android 10 ou version ultérieure pour les appareils neufs et les appareils mis à niveau.
Syntaxe
Un safe_union
est exprimé en HIDL exactement comme un union
ou un struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Utilisation
Au moment de l'exécution, un 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 par défaut TypeA
.
hidl-gen
génère une classe ou une structure personnalisée pour un safe_union
en C++ et en Java. Cette classe inclut un discriminateur pour chaque membre (dans hidl_discriminator
), une méthode permettant d'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 de TypeA a
s'appelle "a" et renvoie TypeA
. Le "setter" correspondant peut également être appelé "a" et accepte un paramètre TypeA
. Définir la valeur dans un 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
, la tentative de récupération de a
interrompt le programme.
Monostate
Un 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; };