União segura

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