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