safe_union
no HIDL representa um tipo de união marcado explicitamente.
Isso é semelhante a um union
, exceto pelo fato de que safe_union
mantém.
do tipo subjacente e é compatível com Java. A
O tipo safe_union
está disponível no Android 10
e superiores 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
é apenas um tipo. Por padrão, é
o primeiro tipo na união. Por exemplo, acima,
MySafeUnion
é, por padrão, TypeA
.
hidl-gen
gera uma classe ou struct personalizado para um
safe_union
em C++ e Java. Essa aula inclui
discriminador para cada membro (em hidl_discriminator
), um método para
recebe o discriminador atual (getDiscriminator
), setters e
getters para cada membro. Cada setter e getter é nomeado exatamente como seu respectivo membro.
Por exemplo, o getter de TypeA a
é chamado de "a"
retorna algo como TypeA
. O setter correspondente também é
ser chamado de "a" e usa um parâmetro de TypeA
. Definir o valor em
uma safe_union
atualiza o valor do discriminador como
retornado por getDiscriminator
. Acessar um valor de um
discriminador que não é o discriminador atual cancela o programa. Para
caso você chame getDiscriminator
em uma instância do
MySafeUnion
retorna hidl_discriminator::b
, então
tentar recuperar a
cancela o programa.
Monoestado
Uma safe_union
sempre tem um valor, mas, se você quiser não
tiver um valor, use android.hidl.safe_union@1.0::Monostate
como
marcador de posição. Por exemplo, a função UNION pode ser
noinit
(vazio) ou foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };