safe_union в HIDL представляет явно помеченный тип объединения. Это похоже на union , за исключением того safe_union отслеживает базовый тип и совместим с Java. Тип safe_union доступен в Android 10 и выше для новых и обновленных устройств.
Синтаксис
safe_union выражается в HIDL точно так же, как union или struct .
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};
Применение
Во время выполнения safe_union имеет только один тип. По умолчанию это будет первый тип в объединении. Например, выше MySafeUnion по умолчанию имеет тип TypeA
hidl-gen генерирует пользовательский класс или структуру для safe_union как в C++, так и в Java. Этот класс включает дискриминатор для каждого члена (в hidl_discriminator ), метод для получения текущего дискриминатора ( getDiscriminator ), а также сеттеры и геттеры для каждого члена. Каждый сеттер и геттер именуется точно так же, как его член. Например, геттер для TypeA a будет называться «a», и он вернет что-то вроде TypeA . Соответствующий сеттер также будет называться «a» и принимать параметр TypeA . Установка значения в safe_union обновит значение дискриминатора, возвращаемое getDiscriminator . Доступ к значению из дискриминатора, который не является текущим дискриминатором, прерывает программу. Например, если вызов getDiscriminator для экземпляра MySafeUnion возвращает hidl_discriminator::b , то попытка получить a приведет к прекращению работы программы.
моногосударство
У safe_union всегда есть значение, но если желательно, чтобы значение не было, используйте android.hidl.safe_union@1.0::Monostate в качестве заполнителя. Например, следующий союз может быть либо noinit (пустым), либо foo :
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};