União segura

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