Syndicat sécurisé

safe_union dans HIDL représente un type d'union explicitement tagué. Cette méthode est semblable à union, sauf que safe_union assure le suivi du 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

Un safe_union est exprimé en HIDL exactement comme un union ou un struct.

safe_union MySafeUnion {
     TypeA a;
     TypeB b;
     ...
};

Utilisation

Lors 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 défini par défaut sur 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 pour obtenir le discriminateur actuel (getDiscriminator), ainsi que des setters et des getters pour chaque membre. Chaque setter et getter porte exactement le même nom que son membre. Par exemple, le getter pour TypeA a est appelé "a" et renvoie quelque chose de TypeA. Le setter correspondant est également appelé "a" et prend un paramètre de 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 définir une, 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;
};