safe_union
in HIDL rappresenta un tipo di unione contrassegnata esplicitamente. È simile a union
, tranne che safe_union
tiene traccia del tipo sottostante ed è compatibile con Java. Il tipo safe_union
è disponibile in Android 10 e versioni successive per dispositivi nuovi e aggiornati.
Sintassi
Una safe_union
è espressa in HIDL esattamente come union
o struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Utilizzo
In fase di esecuzione, safe_union
è sempre e solo di un tipo. Per impostazione predefinita, sarà il primo tipo nell'unione. Ad esempio, sopra, MySafeUnion
è TypeA
per impostazione predefinita.
hidl-gen
genera una classe o una struttura personalizzata per una safe_union
sia in C++ che in Java. Questa classe include un discriminatore per ciascun membro (in hidl_discriminator
), un metodo per ottenere il discriminatore corrente ( getDiscriminator
) e setter e getter per ciascun membro. Ogni setter e getter viene chiamato esattamente come il suo membro. Ad esempio, il getter per TypeA a
si chiamerà "a" e restituirà qualcosa di TypeA
. Anche il setter corrispondente verrà chiamato "a" e accetterà un parametro di TypeA
. L'impostazione del valore in una safe_union
aggiornerà il valore del discriminatore restituito da getDiscriminator
. L'accesso a un valore da un discriminatore che non è il discriminatore corrente interrompe il programma. Ad esempio, se la chiamata getDiscriminator
su un'istanza di MySafeUnion
restituisce hidl_discriminator::b
, il tentativo di recuperare a
interromperà il programma.
Monostato
Una safe_union
ha sempre un valore, ma se si desidera non avere un valore, utilizzare 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; };