নিরাপদ ইউনিয়ন

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