Sindacato sicuro

safe_union in HIDL rappresenta un tipo di unione con tag esplicitamente. È simile a union, ad eccezione di safe_union che conserva del tipo sottostante ed è compatibile con Java. La Il tipo di safe_union è disponibile su Android 10 e superiori per i dispositivi nuovi e di cui è stato eseguito l'upgrade.

Sintassi

Un safe_union viene espresso in modalità HIDL esattamente come una union o struct.

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

Utilizzo

In fase di runtime, safe_union è sempre un solo tipo. Per impostazione predefinita, il primo tipo nell'unione. Ad esempio, sopra, Il valore predefinito di MySafeUnion è TypeA.

hidl-gen genera una classe o uno struct personalizzato per un safe_union sia in C++ che in Java. Questo corso include un discriminatore per ogni membro (in hidl_discriminator), un metodo per ottenere l'attuale discriminatore (getDiscriminator), getter per ogni membro. A ogni setter e getter è indicato il nome del rispettivo membro. Ad esempio, il getter per TypeA a si chiama "a" e restituisce un valore TypeA. Anche il setter corrispondente chiamati "a" e richiede un parametro di TypeA. Impostando il valore in safe_union aggiorna il valore del discriminatore restituito da getDiscriminator. Accesso a un valore da un il discriminatore corrente che non è quello attuale interrompe il programma. Per se chiami getDiscriminator su un'istanza di MySafeUnion restituisce hidl_discriminator::b, poi il tentativo di recuperare a interrompe il programma.

Monostato

Un safe_union ha sempre un valore, ma se si desidera non hanno un valore, usa android.hidl.safe_union@1.0::Monostate come segnaposto. Ad esempio, la seguente unione può essere noinit (vuoto) o foo:

import android.hidl.safe_union@1.0::Monostate;

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};