सेफ़ यूनियन

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