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; };