Sindacato sicuro

safe_union in HIDL rappresenta un tipo di unione con tag esplicito. È simile a un union, tranne per il fatto che 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 di cui è stato eseguito l'upgrade.

Sintassi

Un safe_union viene espresso in HIDL esattamente come un union o un struct.

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

Utilizzo

In fase di esecuzione, 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 una struttura personalizzata 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 è denominato esattamente come il relativo membro. Ad esempio, il getter per TypeA a si chiama "a" e restituisce qualcosa di TypeA. Il relativo settore può anche essere chiamato "a" e accetta un parametro TypeA. L'impostazione del valore in safe_union aggiorna il valore del discriminatore come restituito da getDiscriminator. L'accesso a un valore da un discriminatore diverso da quello corrente interrompe il programma. Ad esempio, se chiami 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 ne abbia uno, utilizza 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;
};