सेफ़ यूनियन

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

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

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