HIDL-এ safe_union স্পষ্টভাবে ট্যাগ করা ইউনিয়ন টাইপকে বোঝায়।
এটি union-এর মতোই, তবে safe_union অন্তর্নিহিত টাইপ ট্র্যাক করে
এবং Java-এর সাথে মানানসই। নতুন ও আপগ্রেড করা ডিভাইসের জন্য Android 10
ও তার পরবর্তী যেকোনও ভার্সনে safe_union টাইপ উপলভ্য।
সিনট্যাক্স
HIDL-এ safe_union-কে ঠিক union বা struct-এর মতো করে প্রকাশ করা হয়।
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};ব্যবহার
রানটাইমে, safe_union শুধুমাত্র এক ধরনের হয়। ডিফল্ট হিসেবে, এটি
ইউনিয়নের প্রথম ধরন। যেমন, উপরে,
MySafeUnion ডিফল্ট হিসেবে TypeA থাকে।
hidl-gen, C++ ও Java, দুটি ভাষাতেই a
safe_union-এর জন্য কাস্টম ক্লাস বা স্ট্রাকচার জেনারেট করে। এই ক্লাসে প্রতিটি মেম্বারের জন্য একটি
ডিসক্রিমিনেটর (hidl_discriminator), বর্তমান ডিসক্রিমিনেটর (getDiscriminator) পাওয়ার
একটি পদ্ধতি এবং প্রতিটি মেম্বারের জন্য সেটার ও
গেটার অন্তর্ভুক্ত। প্রতিটি সেটার ও গেটারের নাম তার মেম্বারের নামের সাথে হুবহু মেলে।
যেমন, TypeA a-এর গেটারকে "a" বলা হয় এবং এটি
TypeA-এর কিছু রিটার্ন করে। এর সাথে সম্পর্কিত সেটারকেও "a" বলা হয় এবং এটি TypeA প্যারামিটার নেয়। safe_union-এ ভ্যালু সেট করলে, getDiscriminator-এর
রিটার্ন করা ডিসক্রিমিনেটরের ভ্যালু
আপডেট হয়। বর্তমান ডিসক্রিমিনেটর নয় এমন ডিসক্রিমিনেটর থেকে
ভ্যালু অ্যাক্সেস করলে প্রোগ্রামটি বাতিল হয়ে যায়। যেমন, getDiscriminator কল করলে যদি
MySafeUnion-এর কোনও ইনস্ট্যান্স থেকে hidl_discriminator::b রিটার্ন করে, তাহলে
a রিট্রিভ করার চেষ্টা করলে প্রোগ্রামটি বাতিল হয়ে যায়।
Monostate
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; };