Unione sicura

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