सेफ़ यूनियन

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

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

safe_union को HIDL में बिलकुल 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 ने वापस किया. किसी ऐसा डिस्क्रिमिनेटर जो मौजूदा डिस्क्रिमिनेटर नहीं है, प्रोग्राम को रद्द करता है. इसके लिए अगर getDiscriminator को MySafeUnion, 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;
};