איחוד בטוח

safe_union ב-HIDL מייצג סוג איחוד מתויג במפורש. זה דומה union חוץ מזה safe_union עוקב אחר הסוג הבסיסי ותואם ל-Java. סוג safe_union זמין באנדרואיד 10 ואילך עבור מכשירים חדשים ומשודרגים.

תחביר

safe_union מתבטא ב-HIDL בדיוק כמו union או struct .

safe_union MySafeUnion {
     TypeA a;
     TypeB b;
     ...
};

נוֹהָג

בזמן ריצה, safe_union הוא רק סוג אחד. כברירת מחדל, זה יהיה הסוג הראשון באיגוד. לדוגמה, למעלה, MySafeUnion הוא כברירת מחדל TypeA .

hidl-gen יוצר מחלקה או מבנה מותאם אישית עבור safe_union גם ב-C++ וגם ב-Java. מחלקה זו כוללת מפלה עבור כל איבר (ב- hidl_discriminator ), שיטה לקבל את המאפיין הנוכחי ( getDiscriminator ), ו-seters ו-getters עבור כל איבר. כל מגדיר וגטר נקרא בדיוק כחבר שלו. לדוגמה, המשבר עבור 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;
};