Program Listing for File dds-xtypes_typeobject.idl

Return to documentation for file (/tmp/ws/src/fastrtps/include/fastrtps/types/dds-xtypes_typeobject.idl)

/* dds-xtypes_typeobject.idl */

// The types in this file shall be serialized with XCDR encoding version 2
module DDS {
    module XTypes {

        // ---------- Equivalence Kinds ------------------
        typedef octet EquivalenceKind;
        const octet EK_MINIMAL   = 0xF1; // 0x1111 0001
        const octet EK_COMPLETE  = 0xF2; // 0x1111 0010
        const octet EK_BOTH      = 0xF3; // 0x1111 0011

        // ---------- TypeKinds (begin) ------------------
        typedef octet TypeKind;        // Primitive TKs

        const octet TK_NONE       = 0x00;
        const octet TK_BOOLEAN    = 0x01;
        const octet TK_BYTE       = 0x02;
        const octet TK_INT16      = 0x03;
        const octet TK_INT32      = 0x04;
        const octet TK_INT64      = 0x05;
        const octet TK_UINT16     = 0x06;
        const octet TK_UINT32     = 0x07;
        const octet TK_UINT64     = 0x08;
        const octet TK_FLOAT32    = 0x09;
        const octet TK_FLOAT64    = 0x0A;
        const octet TK_FLOAT128   = 0x0B;
        const octet TK_CHAR8      = 0x10;
        const octet TK_CHAR16     = 0x11;

        // String TKs
        const octet TK_STRING8    = 0x20;
        const octet TK_STRING16   = 0x21;


        // Constructed/Named types
        const octet TK_ALIAS      = 0x30;

        // Enumerated TKs
        const octet TK_ENUM       = 0x40;
        const octet TK_BITMASK    = 0x41;

        // Structured TKs
        const octet TK_ANNOTATION = 0x50;
        const octet TK_STRUCTURE  = 0x51;
        const octet TK_UNION      = 0x52;
        const octet TK_BITSET     = 0x53;

        // Collection TKs
        const octet TK_SEQUENCE   = 0x60;
        const octet TK_ARRAY      = 0x61;
        const octet TK_MAP        = 0x62;

        // ---------- TypeKinds (end) ------------------

        // ---------- Extra TypeIdentifiers (begin) -----------
        typedef octet TypeIdentiferKind;
        const octet TI_STRING8_SMALL        = 0x70;
        const octet TI_STRING8_LARGE        = 0x71;
        const octet TI_STRING16_SMALL       = 0x72;
        const octet TI_STRING16_LARGE       = 0x73;

        const octet TI_PLAIN_SEQUENCE_SMALL = 0x80;
        const octet TI_PLAIN_SEQUENCE_LARGE = 0x81;
        const octet TI_PLAIN_ARRAY_SMALL    = 0x90;
        const octet TI_PLAIN_ARRAY_LARGE    = 0x91;
        const octet TI_PLAIN_MAP_SMALL      = 0xA0;
        const octet TI_PLAIN_MAP_LARGE      = 0xA1;

        const octet TI_STRONGLY_CONNECTED_COMPONENT = 0xB0;

        // ---------- Extra TypeIdentifiers (end) -------------

        // The name of some element (e.g. type, type member, module)
        // Valid characters are alphanumeric plus the "_" cannot start with digit

        const long MEMBER_NAME_MAX_LENGTH = 256;    typedef string<MEMBER_NAME_MAX_LENGTH> MemberName;

        // Qualified type name includes the name of containing modules
        // using "::" as separator. No leading "::". E.g. "MyModule::MyType"
        const long TYPE_NAME_MAX_LENGTH = 256;
        typedef string<TYPE_NAME_MAX_LENGTH> QualifiedTypeName;

        // Every type has an ID. Those of the primitive types are pre-defined.
        typedef octet PrimitiveTypeId;

        // First 14 bytes of MD5 of the serialized TypeObject using XCDR
        // version 2 with Little Endian encoding
        typedef octet EquivalenceHash[14];

        // First 4 bytes of MD5 of of a member name converted to bytes
        // using UTF-8 encoding and without a 'nul' terminator.
        // Example: the member name "color" has NameHash {0x70, 0xDD, 0xA5, 0xDF}

        typedef octet NameHash[4];

        // Long Bound of a collection type
        typedef unsigned long LBound;
        typedef sequence<LBound> LBoundSeq;
        const LBound INVALID_LBOUND = 0;

        // Short Bound of a collection type
        typedef octet SBound;
        typedef sequence<SBound> SBoundSeq;
        const SBound INVALID_SBOUND = 0;

         @extensibility(FINAL) @nested
         union TypeObjectHashId switch (octet) {
            case EK_COMPLETE:
            case EK_MINIMAL:
                EquivalenceHash  hash;
        };

        // Flags that apply to struct/union/collection/enum/bitmask/bitset
        // members/elements and DO affect type assignability
        // Depending on the flag it may not apply to members of all types

        // When not all, the applicable member types are listed
        @bit_bound(16)
        bitmask MemberFlag {
            @position(0)  TRY_CONSTRUCT1,       // T1 | 00 = INVALID, 01 = DISCARD
            @position(1)  TRY_CONSTRUCT2,       // T2 | 10 = USE_DEFAULT, 11 = TRIM
            @position(2)  IS_EXTERNAL,          // X  StructMember, UnionMember,
                                                //    CollectionElement
            @position(3)  IS_OPTIONAL,          // O  StructMember
            @position(4)  IS_MUST_UNDERSTAND,   // M  StructMember
            @position(5)  IS_KEY,               // K  StructMember, UnionDiscriminator
            @position(6)  IS_DEFAULT            // D  UnionMember, EnumerationLiteral
        };

        typedef MemberFlag   CollectionElementFlag;   // T1, T2, X
        typedef MemberFlag   StructMemberFlag;        // T1, T2, O, M, K, X
        typedef MemberFlag   UnionMemberFlag;         // T1, T2, D, X
        typedef MemberFlag   UnionDiscriminatorFlag;  // T1, T2, K
        typedef MemberFlag   EnumeratedLiteralFlag;   // D
        typedef MemberFlag   AnnotationParameterFlag; // Unused. No flags apply
        typedef MemberFlag   AliasMemberFlag;         // Unused. No flags apply
        typedef MemberFlag   BitflagFlag;             // Unused. No flags apply
        typedef MemberFlag   BitsetMemberFlag;        // Unused. No flags apply

        // Mask used to remove the flags that do no affect assignability
        // Selects  T1, T2, O, M, K, D
        const   unsigned short  MemberFlagMinimalMask = 0x003f;

        // Flags that apply to type declarationa and DO affect assignability
        // Depending on the flag it may not apply to all types
        // When not all, the applicable  types are listed
        @bit_bound(16)    bitmask TypeFlag {
            @position(0) IS_FINAL,        // F |
            @position(1) IS_APPENDABLE,   // A |-  Struct, Union
            @position(2) IS_MUTABLE,      // M |   (exactly one flag)
            @position(3) IS_NESTED,       // N     Struct, Union
            @position(4) IS_AUTOID_HASH   // H     Struct
        };

        typedef TypeFlag   StructTypeFlag;      // All flags apply
        typedef TypeFlag   UnionTypeFlag;       // All flags apply
        typedef TypeFlag   CollectionTypeFlag;  // Unused. No flags apply
        typedef TypeFlag   AnnotationTypeFlag;  // Unused. No flags apply
        typedef TypeFlag   AliasTypeFlag;       // Unused. No flags apply
        typedef TypeFlag   EnumTypeFlag;        // Unused. No flags apply
        typedef TypeFlag   BitmaskTypeFlag;     // Unused. No flags apply
        typedef TypeFlag   BitsetTypeFlag;      // Unused. No flags apply

        // Mask used to remove the flags that do no affect assignability
        const   unsigned short TypeFlagMinimalMask = 0x0007; // Selects  M, A, F

       // Forward declaration
       union TypeIdentifier;

       // 1 Byte
       @extensibility(FINAL) @nested
       struct StringSTypeDefn {
            SBound                  bound;
        };

        // 4 Bytes
        @extensibility(FINAL) @nested
        struct StringLTypeDefn {
            LBound                  bound;
        };

        @extensibility(FINAL) @nested
        struct PlainCollectionHeader {
            EquivalenceKind        equiv_kind;
            CollectionElementFlag  element_flags;
        };

        @extensibility(FINAL) @nested
        struct PlainSequenceSElemDefn {
            PlainCollectionHeader  header;
            SBound                 bound;
            @external TypeIdentifier element_identifier;
        };

        @extensibility(FINAL) @nested
        struct PlainSequenceLElemDefn {
            PlainCollectionHeader  header;
            LBound                 bound;
            @external TypeIdentifier element_identifier;
        };

        @extensibility(FINAL) @nested
        struct PlainArraySElemDefn {
            PlainCollectionHeader  header;
            SBoundSeq              array_bound_seq;
            @external TypeIdentifier element_identifier;
        };

        @extensibility(FINAL) @nested
        struct PlainArrayLElemDefn {
            PlainCollectionHeader  header;
            LBoundSeq              array_bound_seq;
            @external TypeIdentifier element_identifier;
        };

        @extensibility(FINAL) @nested
        struct PlainMapSTypeDefn {
            PlainCollectionHeader  header;
            SBound                 bound;
            @external TypeIdentifier element_identifier;
            CollectionElementFlag  key_flags;
            @external TypeIdentifier key_identifier;
        };

        @extensibility(FINAL) @nested
        struct PlainMapLTypeDefn {
            PlainCollectionHeader  header;
            LBound                 bound;
            @external TypeIdentifier element_identifier;
            CollectionElementFlag  key_flags;
            @external TypeIdentifier key_identifier;
        };

        // Used for Types that have cyclic depencencies with other types
        @extensibility(APPENDABLE) @nested
        struct StronglyConnectedComponentId {
            TypeObjectHashId sc_component_id; // Hash StronglyConnectedComponent
            long   scc_length; // StronglyConnectedComponent.length
            long   scc_index ; // identify type in Strongly Connected Comp.
        };

        // Future extensibility
        @extensibility(MUTABLE) @nested
        struct ExtendedTypeDefn {
            // Empty. Available for future extension
        };


        // The TypeIdentifier uniquely identifies a type (a set of equivalent
        // types according to an equivalence relationship:  COMPLETE, MNIMAL).
        //
        // In some cases (primitive types, strings, plain types) the identifier
        // is a explicit description of the type.
        // In other cases the Identifier is a Hash of the type description
        //
        // In the case of primitive types and strings the implied equivalence
        // relation is the identity.
        //
        // For Plain Types and Hash-defined TypeIdentifiers there are three
        //  possibilities: MINIMAL, COMPLETE, and COMMON:
        //   - MINIMAL indicates the TypeIdentifier identifies equivalent types
        //     according to the MINIMAL equivalence relation
        //   - COMPLETE indicates the TypeIdentifier identifies equivalent types
        //     according to the COMPLETE equivalence relation
        //   - COMMON indicates the TypeIdentifier identifies equivalent types
        //     according to both the MINIMAL and the COMMON equivalence relation.
        //     This means the TypeIdentifier is the same for both relationships
        //

        @extensibility(FINAL) @nested
        union TypeIdentifier switch (octet) {
            // ============  Primitive types - use TypeKind ====================
            // All primitive types fall here.
            // Commented-out because Unions cannot have cases with no member.
            /*  case TK_NONE:
                case TK_BOOLEAN:
                case TK_BYTE_TYPE:
                case TK_INT16_TYPE:
                case TK_INT32_TYPE:
                case TK_INT64_TYPE:
                case TK_UINT16_TYPE:
                case TK_UINT32_TYPE:
                case TK_UINT64_TYPE:
                case TK_FLOAT32_TYPE:
                case TK_FLOAT64_TYPE:
                case TK_FLOAT128_TYPE:
                case TK_CHAR8_TYPE:
                case TK_CHAR16_TYPE:
                    // No Value
            */

            // ============ Strings - use TypeIdentifierKind ===================
            case TI_STRING8_SMALL:
            case TI_STRING16_SMALL:
                StringSTypeDefn         string_sdefn;

            case TI_STRING8_LARGE:
            case TI_STRING16_LARGE:
                StringLTypeDefn         string_ldefn;

            // ============  Plain collectios - use TypeIdentifierKind =========
            case TI_PLAIN_SEQUENCE_SMALL:
                PlainSequenceSElemDefn  seq_sdefn;
            case TI_PLAIN_SEQUENCE_LARGE:
                PlainSequenceLElemDefn  seq_ldefn;

            case TI_PLAIN_ARRAY_SMALL:
                PlainArraySElemDefn     array_sdefn;
            case TI_PLAIN_ARRAY_LARGE:
                PlainArrayLElemDefn     array_ldefn;

            case TI_PLAIN_MAP_SMALL:
                PlainMapSTypeDefn       map_sdefn;
            case TI_PLAIN_MAP_LARGE:
                PlainMapLTypeDefn       map_ldefn;

            // ============  Types that are mutually dependent on each other ===
            case TI_STRONGLY_CONNECTED_COMPONENT:
                StronglyConnectedComponentId  sc_component_id;

            // ============  The remaining cases - use EquivalenceKind =========
            case EK_COMPLETE:
            case EK_MINIMAL:
                EquivalenceHash         equivalence_hash;

            // ===================  Future extensibility  ============
            // Future extensions
            default:            ExtendedTypeDefn        extended_defn;
        };
        typedef sequence<TypeIdentifier> TypeIdentifierSeq;


        // --- Annotation usage: ----------------------------------------------

        // ID of a type member
        typedef unsigned long MemberId;
        const unsigned long ANNOTATION_STR_VALUE_MAX_LEN = 128;
        const unsigned long ANNOTATION_OCTETSEC_VALUE_MAX_LEN = 128;

        @extensibility(MUTABLE) @nested
        struct ExtendedAnnotationParameterValue {
            // Empty. Available for future extension
        };

        /* Literal value of an annotation member: either the default value in its
         * definition or the value applied in its usage.
         */

         @extensibility(FINAL) @nested
         union AnnotationParameterValue switch (octet) {
            case TK_BOOLEAN:
                boolean             boolean_value;
            case TK_BYTE:
                octet               byte_value;
            case TK_INT16:
                short               int16_value;
            case TK_UINT16:
                unsigned short      uint_16_value;
            case TK_INT32:
                long                int32_value;
            case TK_UINT32:
                unsigned long       uint32_value;
            case TK_INT64:
                long long           int64_value;
            case TK_UINT64:
                unsigned long long  uint64_value;
            case TK_FLOAT32:
                float               float32_value;
            case TK_FLOAT64:
                double              float64_value;
            case TK_FLOAT128:
                long double         float128_value;
            case TK_CHAR8:
                char                char_value;
            case TK_CHAR16:
                wchar               wchar_value;
            case TK_ENUM:
                long                enumerated_value;
            case TK_STRING8:
                string<ANNOTATION_STR_VALUE_MAX_LEN>  string8_value;
            case TK_STRING16:
                wstring<ANNOTATION_STR_VALUE_MAX_LEN> string16_value;
            default:
                ExtendedAnnotationParameterValue      extended_value;
        };

        // The application of an annotation to some type or type member
        @extensibility(APPENDABLE) @nested
        struct AppliedAnnotationParameter {
            NameHash                  paramname_hash;
            AnnotationParameterValue  value;
        };

        // Sorted by AppliedAnnotationParameter.paramname_hash
        typedef
        sequence<AppliedAnnotationParameter> AppliedAnnotationParameterSeq;

        @extensibility(APPENDABLE) @nested
        struct AppliedAnnotation {
            TypeIdentifier                     annotation_typeid;
            @optional AppliedAnnotationParameterSeq   param_seq;
        };

        // Sorted by AppliedAnnotation.annotation_typeid
        typedef sequence<AppliedAnnotation> AppliedAnnotationSeq;

        // @verbatim(placement="<placement>", language="<lang>", text="<text>")
        @extensibility(FINAL) @nested
        struct AppliedVerbatimAnnotation {
            string<32> placement;
            string<32> language;
            string     text;
        };

        // --- Aggregate types: -----------------------------------------------
        @extensibility(APPENDABLE) @nested
        struct AppliedBuiltinMemberAnnotations {
            @optional string                  unit; // @unit("<unit>")
            @optional AnnotationParameterValue min; // @min , @range
            @optional AnnotationParameterValue max; // @max , @range
            @optional string               hash_id; // @hash_id("<membername>")
        };

        @extensibility(FINAL) @nested
        struct CommonStructMember {
            MemberId                                   member_id;
            StructMemberFlag                           member_flags;
            TypeIdentifier                             member_type_id;
        };

        // COMPLETE Details for a member of an aggregate type
        @extensibility(FINAL) @nested
        struct CompleteMemberDetail {
            MemberName                                 name;
            @optional AppliedBuiltinMemberAnnotations  ann_builtin;
            @optional AppliedAnnotationSeq             ann_custom;
        };

        // MINIMAL Details for a member of an aggregate type
        @extensibility(FINAL) @nested    struct MinimalMemberDetail {
            NameHash                                  name_hash;
        };

        // Member of an aggregate type
        @extensibility(APPENDABLE) @nested
        struct CompleteStructMember {
            CommonStructMember                         common;
            CompleteMemberDetail                       detail;
        };

        // Ordered by the member_index
        typedef sequence<CompleteStructMember> CompleteStructMemberSeq;

        // Member of an aggregate type
        @extensibility(APPENDABLE) @nested
        struct MinimalStructMember {
            CommonStructMember                         common;
            MinimalMemberDetail                        detail;
        };

        // Ordered by common.member_id
        typedef sequence<MinimalStructMember> MinimalStructMemberSeq;

        @extensibility(APPENDABLE) @nested
        struct AppliedBuiltinTypeAnnotations {
            @optional AppliedVerbatimAnnotation verbatim;  // @verbatim(...)
        };

        @extensibility(FINAL) @nested
        struct MinimalTypeDetail {
            // Empty. Available for future extension
        };

        @extensibility(FINAL) @nested
        struct CompleteTypeDetail {
            @optional AppliedBuiltinTypeAnnotations  ann_builtin;
            @optional AppliedAnnotationSeq           ann_custom;
            QualifiedTypeName                        type_name;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteStructHeader {
            TypeIdentifier                           base_type;
            CompleteTypeDetail                       detail;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalStructHeader {
            TypeIdentifier                           base_type;
            MinimalTypeDetail                        detail;
        };

        @extensibility(FINAL) @nested
        struct CompleteStructType {
            StructTypeFlag             struct_flags;
            CompleteStructHeader       header;
            CompleteStructMemberSeq    member_seq;
        };

        @extensibility(FINAL) @nested
        struct MinimalStructType {
            StructTypeFlag             struct_flags;
            MinimalStructHeader        header;
            MinimalStructMemberSeq     member_seq;
        };

        // --- Union: ---------------------------------------------------------

        // Case labels that apply to a member of a union type
        // Ordered by their values
        typedef sequence<long> UnionCaseLabelSeq;

        @extensibility(FINAL) @nested
        struct CommonUnionMember {
            MemberId                    member_id;
            UnionMemberFlag             member_flags;
            TypeIdentifier              type_id;
            UnionCaseLabelSeq           label_seq;
        };

        // Member of a union type
        @extensibility(APPENDABLE) @nested
        struct CompleteUnionMember {
            CommonUnionMember      common;
            CompleteMemberDetail   detail;
        };

        // Ordered by member_index
        typedef sequence<CompleteUnionMember> CompleteUnionMemberSeq;

        // Member of a union type
        @extensibility(APPENDABLE) @nested
        struct MinimalUnionMember {
            CommonUnionMember   common;
            MinimalMemberDetail detail;
        };

        // Ordered by MinimalUnionMember.common.member_id
        typedef sequence<MinimalUnionMember> MinimalUnionMemberSeq;

        @extensibility(FINAL) @nested
        struct CommonDiscriminatorMember {
            UnionDiscriminatorFlag       member_flags;
            TypeIdentifier               type_id;
        };

        // Member of a union type
        @extensibility(APPENDABLE) @nested
        struct CompleteDiscriminatorMember {
            CommonDiscriminatorMember                common;
            @optional AppliedBuiltinTypeAnnotations  ann_builtin;
            @optional AppliedAnnotationSeq           ann_custom;
        };

        // Member of a union type
        @extensibility(APPENDABLE) @nested
        struct MinimalDiscriminatorMember {
            CommonDiscriminatorMember   common;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteUnionHeader {
            CompleteTypeDetail          detail;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalUnionHeader {
            MinimalTypeDetail           detail;
        };

        @extensibility(FINAL) @nested
        struct CompleteUnionType {
            UnionTypeFlag                union_flags;
            CompleteUnionHeader          header;
            CompleteDiscriminatorMember  discriminator;
            CompleteUnionMemberSeq       member_seq;
        };

        @extensibility(FINAL) @nested
        struct MinimalUnionType {
            UnionTypeFlag                union_flags;
            MinimalUnionHeader           header;
            MinimalDiscriminatorMember   discriminator;
            MinimalUnionMemberSeq        member_seq;
        };

        // --- Annotation: ---------------------------------------------------
        @extensibility(FINAL) @nested
        struct CommonAnnotationParameter {
            AnnotationParameterFlag      member_flags;
            TypeIdentifier               member_type_id;
        };

        // Member of an annotation type
        @extensibility(APPENDABLE) @nested
        struct CompleteAnnotationParameter {
            CommonAnnotationParameter  common;
            MemberName                 name;
            AnnotationParameterValue   default_value;
        };

        // Ordered by CompleteAnnotationParameter.name
        typedef    sequence<CompleteAnnotationParameter> CompleteAnnotationParameterSeq;

        @extensibility(APPENDABLE) @nested
        struct MinimalAnnotationParameter {
            CommonAnnotationParameter  common;
            NameHash                   name_hash;
            AnnotationParameterValue   default_value;
        };

        // Ordered by MinimalAnnotationParameter.name_hash
        typedef    sequence<MinimalAnnotationParameter> MinimalAnnotationParameterSeq;

        @extensibility(APPENDABLE) @nested
        struct CompleteAnnotationHeader {
            QualifiedTypeName         annotation_name;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalAnnotationHeader {
            // Empty. Available for future extension
        };

        @extensibility(FINAL) @nested
        struct CompleteAnnotationType {
            AnnotationTypeFlag             annotation_flag;
            CompleteAnnotationHeader       header;
            CompleteAnnotationParameterSeq member_seq;
        };

        @extensibility(FINAL) @nested
        struct MinimalAnnotationType {
            AnnotationTypeFlag             annotation_flag;
            MinimalAnnotationHeader        header;
            MinimalAnnotationParameterSeq  member_seq;
        };

        // --- Alias: ---------------------------------------------------------
        @extensibility(FINAL) @nested
        struct CommonAliasBody {
            AliasMemberFlag       related_flags;
            TypeIdentifier        related_type;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteAliasBody {
            CommonAliasBody       common;
            @optional AppliedBuiltinMemberAnnotations  ann_builtin;
            @optional AppliedAnnotationSeq             ann_custom;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalAliasBody {
            CommonAliasBody       common;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteAliasHeader {
            CompleteTypeDetail    detail;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalAliasHeader {
            // Empty. Available for future extension
        };

        @extensibility(FINAL) @nested
        struct CompleteAliasType {
            AliasTypeFlag         alias_flags;
            CompleteAliasHeader   header;
            CompleteAliasBody     body;
        };

        @extensibility(FINAL) @nested
        struct MinimalAliasType {
            AliasTypeFlag         alias_flags;
            MinimalAliasHeader    header;
            MinimalAliasBody      body;
        };

        // --- Collections: ---------------------------------------------------
        @extensibility(FINAL) @nested
        struct CompleteElementDetail {
            @optional AppliedBuiltinMemberAnnotations  ann_builtin;
            @optional AppliedAnnotationSeq             ann_custom;
        };

        @extensibility(FINAL) @nested
        struct CommonCollectionElement {
            CollectionElementFlag     element_flags;
            TypeIdentifier            type;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteCollectionElement {
            CommonCollectionElement   common;
            CompleteElementDetail     detail;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalCollectionElement {
            CommonCollectionElement   common;
        };

        @extensibility(FINAL) @nested
        struct CommonCollectionHeader {
            LBound                    bound;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteCollectionHeader {
            CommonCollectionHeader        common;
            @optional CompleteTypeDetail  detail; // not present for anonymous
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalCollectionHeader {
            CommonCollectionHeader        common;
        };

        // --- Sequence: -----------------------------------------------------
        @extensibility(FINAL) @nested
        struct CompleteSequenceType {
            CollectionTypeFlag         collection_flag;
            CompleteCollectionHeader   header;
            CompleteCollectionElement  element;
        };


        @extensibility(FINAL) @nested
        struct MinimalSequenceType {
            CollectionTypeFlag         collection_flag;
            MinimalCollectionHeader    header;
            MinimalCollectionElement   element;
        };

        // --- Array: -----------------------------------------------------
        @extensibility(FINAL) @nested
        struct CommonArrayHeader {
            LBoundSeq           bound_seq;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteArrayHeader {
            CommonArrayHeader   common;
            CompleteTypeDetail  detail;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalArrayHeader {
            CommonArrayHeader   common;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteArrayType  {
            CollectionTypeFlag          collection_flag;
            CompleteArrayHeader         header;
            CompleteCollectionElement   element;
        };

        @extensibility(FINAL) @nested
        struct MinimalArrayType  {
            CollectionTypeFlag         collection_flag;
            MinimalArrayHeader         header;
            MinimalCollectionElement   element;
        };

        // --- Map: -----------------------------------------------------
        @extensibility(FINAL) @nested
        struct CompleteMapType {
            CollectionTypeFlag            collection_flag;
            CompleteCollectionHeader      header;
            CompleteCollectionElement     key;
            CompleteCollectionElement     element;
        };

        @extensibility(FINAL) @nested
        struct MinimalMapType {
            CollectionTypeFlag          collection_flag;
            MinimalCollectionHeader     header;
            MinimalCollectionElement    key;
            MinimalCollectionElement    element;
        };

        // --- Enumeration: ---------------------------------------------------
        typedef unsigned short BitBound;

        // Constant in an enumerated type
        @extensibility(APPENDABLE) @nested
        struct CommonEnumeratedLiteral {
            long                     value;
            EnumeratedLiteralFlag    flags;
        };

        // Constant in an enumerated type
        @extensibility(APPENDABLE) @nested
        struct CompleteEnumeratedLiteral {
            CommonEnumeratedLiteral  common;
            CompleteMemberDetail     detail;
        };

        // Ordered by EnumeratedLiteral.common.value
        typedef sequence<CompleteEnumeratedLiteral> CompleteEnumeratedLiteralSeq;

        // Constant in an enumerated type
        @extensibility(APPENDABLE) @nested
        struct MinimalEnumeratedLiteral {
            CommonEnumeratedLiteral  common;
            MinimalMemberDetail      detail;
        };

        // Ordered by EnumeratedLiteral.common.value
        typedef sequence<MinimalEnumeratedLiteral> MinimalEnumeratedLiteralSeq;

        @extensibility(FINAL) @nested
        struct CommonEnumeratedHeader {
            BitBound                bit_bound;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteEnumeratedHeader {
            CommonEnumeratedHeader  common;
            CompleteTypeDetail      detail;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalEnumeratedHeader {
            CommonEnumeratedHeader  common;
        };

        // Enumerated type
        @extensibility(FINAL) @nested
        struct CompleteEnumeratedType  {
            EnumTypeFlag                    enum_flags; // unused
            CompleteEnumeratedHeader        header;
            CompleteEnumeratedLiteralSeq    literal_seq;
        };

        // Enumerated type
        @extensibility(FINAL) @nested
        struct MinimalEnumeratedType  {
            EnumTypeFlag                  enum_flags; // unused
            MinimalEnumeratedHeader       header;
            MinimalEnumeratedLiteralSeq   literal_seq;
        };

        // --- Bitmask: -------------------------------------------------------
        // Bit in a bit mask
        @extensibility(FINAL) @nested
        struct CommonBitflag {
            unsigned short         position;
            BitflagFlag            flags;
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteBitflag {
            CommonBitflag          common;
            CompleteMemberDetail   detail;
        };

        // Ordered by Bitflag.position
        typedef sequence<CompleteBitflag> CompleteBitflagSeq;

        @extensibility(APPENDABLE) @nested
        struct MinimalBitflag {
            CommonBitflag        common;
            MinimalMemberDetail  detail;
        };

        // Ordered by Bitflag.position
        typedef sequence<MinimalBitflag> MinimalBitflagSeq;

        @extensibility(FINAL) @nested
        struct CommonBitmaskHeader {
            BitBound             bit_bound;
        };

        typedef CompleteEnumeratedHeader CompleteBitmaskHeader;

        typedef MinimalEnumeratedHeader  MinimalBitmaskHeader;

        @extensibility(APPENDABLE) @nested
        struct CompleteBitmaskType {
            BitmaskTypeFlag          bitmask_flags; // unused
            CompleteBitmaskHeader    header;
            CompleteBitflagSeq       flag_seq;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalBitmaskType {
            BitmaskTypeFlag          bitmask_flags; // unused
            MinimalBitmaskHeader     header;
            MinimalBitflagSeq        flag_seq;
        };

        // --- Bitset: ---------------------------------------------------------
        @extensibility(FINAL) @nested
        struct CommonBitfield {
            unsigned short        position;
            BitsetMemberFlag      flags;
            octet                 bitcount;
            TypeKind              holder_type; // Must be primitive integer type
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteBitfield {
            CommonBitfield           common;
            CompleteMemberDetail     detail;
        };

        // Ordered by Bitfield.position
        typedef sequence<CompleteBitfield> CompleteBitfieldSeq;

        @extensibility(APPENDABLE) @nested
        struct MinimalBitfield {
            CommonBitfield       common;
            NameHash             name_hash;
        };

        // Ordered by Bitfield.position
        typedef sequence<MinimalBitfield> MinimalBitfieldSeq;

        @extensibility(APPENDABLE) @nested
        struct CompleteBitsetHeader {
            CompleteTypeDetail   detail;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalBitsetHeader {
            // Empty. Available for future extension
        };

        @extensibility(APPENDABLE) @nested
        struct CompleteBitsetType  {
            BitsetTypeFlag         bitset_flags; // unused
            CompleteBitsetHeader   header;
            CompleteBitfieldSeq    field_seq;
        };

        @extensibility(APPENDABLE) @nested
        struct MinimalBitsetType  {
            BitsetTypeFlag       bitset_flags; // unused
            MinimalBitsetHeader  header;
            MinimalBitfieldSeq   field_seq;
        };

        // --- Type Object: --------------------------------------------------
        // The types associated with each case selection must have extensibility
        // kind APPENDABLE or MUTABLE so that they can be extended in the future

        @extensibility(MUTABLE) @nested
        struct CompleteExtendedType {
            // Empty. Available for future extension
        };

        @extensibility(FINAL)     @nested
        union CompleteTypeObject switch (octet) {
            case TK_ALIAS:
                CompleteAliasType      alias_type;
            case TK_ANNOTATION:
                CompleteAnnotationType annotation_type;
            case TK_STRUCTURE:
                CompleteStructType     struct_type;
            case TK_UNION:
                CompleteUnionType      union_type;
            case TK_BITSET:
                CompleteBitsetType     bitset_type;
            case TK_SEQUENCE:
                CompleteSequenceType   sequence_type;
            case TK_ARRAY:
                CompleteArrayType      array_type;
            case TK_MAP:
                CompleteMapType        map_type;
            case TK_ENUM:
                CompleteEnumeratedType enumerated_type;
            case TK_BITMASK:
                CompleteBitmaskType    bitmask_type;

            // ===================  Future extensibility  ============
            default:
                CompleteExtendedType   extended_type;
        };

        @extensibility(MUTABLE) @nested
        struct MinimalExtendedType {
            // Empty. Available for future extension
        };


        @extensibility(FINAL)     @nested
        union MinimalTypeObject switch (octet) {
            case TK_ALIAS:
                MinimalAliasType       alias_type;
            case TK_ANNOTATION:
                MinimalAnnotationType  annotation_type;
            case TK_STRUCTURE:
                MinimalStructType      struct_type;
            case TK_UNION:
                MinimalUnionType       union_type;
            case TK_BITSET:
                MinimalBitsetType      bitset_type;
            case TK_SEQUENCE:
                MinimalSequenceType    sequence_type;
            case TK_ARRAY:
                MinimalArrayType       array_type;
            case TK_MAP:
                MinimalMapType         map_type;
            case TK_ENUM:
                MinimalEnumeratedType  enumerated_type;
            case TK_BITMASK:
                MinimalBitmaskType     bitmask_type;

            // ===================  Future extensibility  ============
            default:
                MinimalExtendedType    extended_type;
        };

        @extensibility(APPENDABLE)  @nested
        union TypeObject switch (octet) { // EquivalenceKind
            case EK_COMPLETE:
                CompleteTypeObject   complete;
            case EK_MINIMAL:
                MinimalTypeObject    minimal;
        };
        typedef sequence<TypeObject> TypeObjectSeq;

        // Set of TypeObjects representing a strong component: Equivalence class
        // for the Strong Connectivity relationship (mutual reachability between
        // types).
        // Ordered by fully qualified typename lexicographic order
        typedef TypeObjectSeq        StronglyConnectedComponent;

        @extensibility(FINAL)  @nested
        struct TypeIdentifierTypeObjectPair {
            TypeIdentifier  type_identifier;
            TypeObject      type_object;
        };
        typedef
        sequence<TypeIdentifierTypeObjectPair> TypeIdentifierTypeObjectPairSeq;

        @extensibility(FINAL)  @nested
        struct TypeIdentifierPair {
            TypeIdentifier  type_identifier1;
            TypeIdentifier  type_identifier2;
        };
        typedef sequence<TypeIdentifierPair> TypeIdentifierPairSeq;

        @extensibility(APPENDABLE) @nested
        struct TypeIdentifierWithSize {
            DDS::Xtypes::TypeIdentifier  type_id;
            unsigned long                typeobject_serialized_size;
        };
        typedef sequence<TypeIdentifierWithSize> TypeIdentfierWithSizeSeq;

        @extensibility(APPENDABLE) @nested
        struct TypeIdentifierWithDependencies {
            TypeIdentifierWithSize            typeid_with_size;
            // The total additional types related to minimal_type
            long                             dependent_typeid_count;
            sequence<TypeIdentifierWithSize>  dependent_typeids;
        };
        typedef    sequence<TypeIdentifierWithDependencies> TypeIdentifierWithDependenciesSeq;

        // This appears in the builtin DDS topics PublicationBuiltinTopicData
        // and SubscriptionBuiltinTopicData

        @extensibility(MUTABLE) @nested
        struct TypeInformation {
            @id(0x1001) TypeIdentifierWithDependencies minimal;
            @id(0x1002) TypeIdentifierWithDependencies complete;
        };
        typedef sequence<TypeInformation> TypeInformationSeq;

    };  // end of module XTypes
};  // end module DDS