सेफ़ यूनियन

एचआईडीएल में safe_union, साफ़ तौर पर टैग किए गए यूनियन टाइप को दिखाता है. यह union की तरह ही है. हालांकि, safe_union, इस्तेमाल किए जा रहे टाइप को ट्रैक करता है और Java के साथ काम करता है. safe_union टाइप, नए और अपग्रेड किए गए डिवाइसों के लिए, Android 10 और उसके बाद के वर्शन में उपलब्ध है.

वाक्य-विन्यास

एचआईडीएल में 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;
};