Union sûre

safe_union dans HIDL représente un type d'union explicitement balisé. Ceci est similaire à une union sauf que safe_union garde une trace 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

Une safe_union est exprimée en HIDL exactement comme une union ou struct .

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

Usage

Au moment de l'exécution, un safe_union n'est qu'un seul type. Par défaut, ce sera le 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 Java. Cette classe comprend un discriminateur pour chaque membre (dans hidl_discriminator ), une méthode pour obtenir le discriminateur actuel ( getDiscriminator ), ainsi que des setters et getters pour chaque membre. Chaque setter et getter est nommé exactement comme son membre. Par exemple, le getter pour TypeA a sera appelé "a", et il renverra quelque chose de TypeA . Le setter correspondant sera également appelé "a" et prendra un paramètre de TypeA . La définition de la valeur dans un safe_union mettra à jour la valeur du discriminateur telle que renvoyée par getDiscriminator . L'accès à une valeur d'un discriminateur qui n'est pas le discriminateur actuel abandonne le programme. Par exemple, si l'appel de getDiscriminator sur une instance de MySafeUnion renvoie hidl_discriminator::b , alors essayer de récupérer a annulera le programme.

Monoétat

Un safe_union a toujours une valeur, mais si vous souhaitez ne pas avoir de valeur, 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;
};