safe_union
no HIDL representa um tipo de união marcado explicitamente.
Isso é semelhante a um union
, exceto que safe_union
acompanha
o tipo subjacente e é compatível com Java. O tipo
safe_union
está disponível no Android 10
e em versões mais recentes para dispositivos novos e atualizados.
Sintaxe
Um safe_union
é expresso em HIDL exatamente como um
union
ou struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Uso
Em tempo de execução, um safe_union
é sempre de um tipo. Por padrão, é 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 tem o mesmo nome do membro.
Por exemplo, o getter de 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 atual interrompe o programa. Por exemplo, se chamar getDiscriminator
em uma instância de MySafeUnion
retornar hidl_discriminator::b
, tentar recuperar a
vai interromper 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 de posição. 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; };