O safe_union no HIDL representa um tipo de união marcado explicitamente.
Ele é semelhante a um union, exceto que o safe_union acompanha
o tipo subjacente e é compatível com Java. O tipo safe_union está disponível no Android 10 e versões mais recentes para dispositivos novos e atualizados.
Sintaxe
Um safe_union é expresso no HIDL exatamente como um
union ou struct.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};Uso
No momento da execução, um safe_union é sempre um tipo. Por padrão, ele é o primeiro tipo na união. Por exemplo, acima, MySafeUnion é TypeA por padrão.
O hidl-gen gera uma classe ou struct personalizada para um safe_union em C++ e Java. Essa classe inclui um discriminador para cada membro (em hidl_discriminator), um método para receber o discriminador atual (getDiscriminator) e setters e getters para cada membro. Cada setter e getter é nomeado exatamente como o membro.
Por exemplo, o getter para TypeA a é chamado de "a" e
retorna algo de TypeA. O setter correspondente também é chamado de "a" e usa um parâmetro de TypeA. Definir o valor em um safe_union atualiza o valor do discriminador retornado por getDiscriminator. Acessar um valor de um discriminador que não é o discriminador atual interrompe o programa. Por
exemplo, se chamar getDiscriminator em uma instância de
MySafeUnion retornar hidl_discriminator::b, então
tentar recuperar a interrompe o programa.
Monostate
Um safe_union sempre tem um valor, mas, se você não quiser
um valor, use android.hidl.safe_union@1.0::Monostate como um
marcador. Por exemplo, a união a seguir pode ser noinit (vazia) ou foo:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };