HIDL'deki safe_union
açıkça etiketlenmiş bir birleşim türünü temsil eder. safe_union
temel türü takip etmesi ve Java ile uyumlu olması dışında bu union
benzer. safe_union
türü, yeni ve yükseltilmiş cihazlar için Android 10 ve üzeri sürümlerde mevcuttur.
Sözdizimi
safe_union
HIDL'de tam olarak bir union
veya struct
gibi ifade edilir.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Kullanım
Çalışma zamanında, safe_union
yalnızca bir türdür. Varsayılan olarak birleşimdeki ilk tür olacaktır. Örneğin, yukarıda MySafeUnion
varsayılan olarak TypeA
.
hidl-gen
hem C++ hem de Java'da bir safe_union
için özel bir sınıf veya yapı oluşturur. Bu sınıf, her üye için bir ayırıcı ( hidl_discriminator
içinde), geçerli ayırıcıyı ( getDiscriminator
) elde etmek için bir yöntem ve her üye için ayarlayıcılar ve alıcılar içerir. Her pasör ve alıcı, tam olarak üyesi olarak adlandırılır. Örneğin, TypeA a
alıcısına "a" adı verilecek ve TypeA
türünden bir şey döndürecektir. İlgili ayarlayıcı aynı zamanda "a" olarak adlandırılacak ve TypeA
parametresini alacaktır. Değerin bir safe_union
ayarlanması, getDiscriminator
tarafından döndürülen ayırıcının değerini güncelleyecektir. Geçerli ayırıcı olmayan bir ayırıcıdan bir değere erişilmesi programı iptal eder. Örneğin, MySafeUnion
örneğinde getDiscriminator
çağrıldığında hidl_discriminator::b
değeri döndürülürse, a
almaya çalışmak programın iptal edilmesine neden olur.
Tek durumlu
safe_union
her zaman bir değeri vardır, ancak bir değere sahip olmaması isteniyorsa yer tutucu olarak android.hidl.safe_union@1.0::Monostate
kullanın. Örneğin, aşağıdaki birleşim noinit
(boş) veya foo
olabilir:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };