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

HIDL-এ safe_union একটি স্পষ্টভাবে ট্যাগ করা ইউনিয়ন টাইপ প্রতিনিধিত্ব করে। এটি একটি union অনুরূপ, ব্যতীত safe_union অন্তর্নিহিত প্রকারের উপর নজর রাখে এবং জাভার সাথে সামঞ্জস্যপূর্ণ। নতুন এবং আপগ্রেড করা ডিভাইসগুলির জন্য Android 10 এবং উচ্চতর সংস্করণে safe_union টাইপ উপলব্ধ।

সিনট্যাক্স

HIDL-এ একটি safe_union প্রকাশ করা হয় হুবহু একটি union বা struct মতো।

safe_union MySafeUnion {
     TypeA a;
     TypeB b;
     ...
};

ব্যবহার

রানটাইমে, একটি safe_union শুধুমাত্র এক প্রকার। ডিফল্টরূপে, এটি ইউনিয়নে প্রথম প্রকার। উদাহরণস্বরূপ, উপরে, MySafeUnion ডিফল্টভাবে TypeA

hidl-gen C++ এবং Java উভয় ক্ষেত্রেই safe_union জন্য একটি কাস্টম ক্লাস বা কাঠামো তৈরি করে। এই শ্রেণীতে প্রতিটি সদস্যের জন্য একটি বৈষম্যকারী অন্তর্ভুক্ত রয়েছে ( hidl_discriminator এ), বর্তমান বৈষম্যকারী ( getDiscriminator ) এবং প্রতিটি সদস্যের জন্য সেটার এবং গেটার পাওয়ার একটি পদ্ধতি। প্রতিটি সেটার এবং গেটারকে ঠিক তার সদস্য হিসাবে নাম দেওয়া হয়েছে। উদাহরণস্বরূপ, TypeA a এর গেটারকে "a" বলা হয়, এবং এটি TypeA এর কিছু প্রদান করে। সংশ্লিষ্ট সেটটারকে "a"ও বলা হয় এবং TypeA এর একটি প্যারামিটার নেয়। একটি safe_union এ মান সেট করা বৈষম্যকারীর মান আপডেট করে যা getDiscriminator দ্বারা প্রত্যাবর্তিত হয়। বর্তমান বৈষম্যকারী নয় এমন একটি বৈষম্যকারীর কাছ থেকে একটি মান অ্যাক্সেস করা প্রোগ্রামটি বাতিল করে দেয়। উদাহরণস্বরূপ, যদি MySafeUnion এর একটি উদাহরণে getDiscriminator কল করা 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;
};