safe_union in HIDL rappresenta un tipo di unione con tag espliciti.
È simile a union, ma safe_union tiene
traccia del tipo sottostante ed è compatibile con Java. Il tipo safe_union è disponibile in Android 10 e versioni successive per i dispositivi nuovi e aggiornati.
Sintassi
Un safe_union viene espresso in HIDL esattamente come un
union o struct.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};Utilizzo
In fase di runtime, un safe_union è sempre di un solo tipo. Per impostazione predefinita, è il primo tipo nell'unione. Ad esempio, sopra, MySafeUnion è per impostazione predefinita TypeA.
hidl-gen genera una classe o uno struct personalizzato per un safe_union sia in C++ che in Java. Questa classe include un discriminatore per ogni membro (in hidl_discriminator), un metodo per ottenere il discriminatore corrente (getDiscriminator) e setter e getter per ogni membro. Ogni setter e getter ha lo stesso nome del membro.
Ad esempio, il getter per TypeA a si chiama "a" e
restituisce qualcosa di TypeA. Anche il setter corrispondente si chiama "a" e accetta un parametro di TypeA. L'impostazione del valore in un safe_union aggiorna il valore del discriminatore restituito da getDiscriminator. L'accesso a un valore da un discriminatore diverso da quello corrente interrompe il programma. Ad
esempio, se la chiamata a getDiscriminator su un'istanza di
MySafeUnion restituisce hidl_discriminator::b, il
tentativo di recuperare a interrompe il programma.
Monostato
Un safe_union ha sempre un valore, ma se non vuoi che abbia un valore, utilizza android.hidl.safe_union@1.0::Monostate come segnaposto. Ad esempio, la seguente unione può essere noinit (vuota) o foo:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };