Union sécurisée

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