<?xml version="1.0" encoding="UTF-8"?>

<!-- This file contains the XML Schema Document (XSD) for the XML Types
     Representation defined by the OMG specification "DDS Consolidated XML
     Syntax" (DDS-XML). -->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">

    <!-- ================================================================== -->
    <!-- Identifiers -->
    <!-- ================================================================== -->

    <xs:simpleType name="identifierName">
        <xs:restriction base="xs:string">
            <xs:pattern value="([a-zA-Z]|::)([a-zA-Z_0-9]|::)*" />
        </xs:restriction>
    </xs:simpleType>


    <!-- ================================================================== -->
    <!-- File Inclusion -->
    <!-- ================================================================== -->

    <xs:simpleType name="fileName">
        <xs:restriction base="xs:string">
        </xs:restriction>
    </xs:simpleType>


    <xs:complexType name="includeDecl">
        <xs:attribute name="file" type="fileName" use="required" />
    </xs:complexType>


    <!-- ================================================================== -->
    <!-- Forward Declarations -->
    <!-- ================================================================== -->

    <xs:simpleType name="forwardDeclTypeKind">
        <xs:restriction base="xs:string">
            <xs:enumeration value="enum" />
            <xs:enumeration value="struct" />
            <xs:enumeration value="union" />
            <xs:enumeration value="bitmask" />
        </xs:restriction>
    </xs:simpleType>


    <xs:complexType name="forwardDecl">
        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="kind" type="forwardDeclTypeKind" use="required" />
    </xs:complexType>


    <!-- ================================================================== -->
    <!-- Basic Types -->
    <!-- ================================================================== -->

    <xs:simpleType name="allTypeKind">
        <xs:restriction base="xs:string">
            <!-- Primitive Types -->
            <xs:enumeration value="boolean" />
            <xs:enumeration value="byte" />
            <xs:enumeration value="char8" />
            <xs:enumeration value="char16" />
            <xs:enumeration value="int16" />
            <xs:enumeration value="uint16" />
            <xs:enumeration value="int32" />
            <xs:enumeration value="uint32" />
            <xs:enumeration value="int64" />
            <xs:enumeration value="uint64" />
            <xs:enumeration value="float32" />
            <xs:enumeration value="float64" />
            <xs:enumeration value="float128" />

            <!-- String containers -->
            <xs:enumeration value="string" />
            <xs:enumeration value="wstring" />

            <!-- Some other type -->
            <xs:enumeration value="nonBasic" />
        </xs:restriction>
    </xs:simpleType>


    <xs:simpleType name="arrayDimensionsKind">
        <xs:restriction base="xs:string">
        </xs:restriction>
    </xs:simpleType>


    <!-- ================================================================== -->
    <!-- Constants -->
    <!-- ================================================================== -->

    <xs:complexType name="constDecl">
        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="type" type="allTypeKind" use="required" />
        <xs:attribute name="nonBasicTypeName" type="identifierName"
                      use="optional" />
        <xs:attribute name="value" type="xs:string" use="required" />
        <xs:attribute name="stringMaxLength" type="xs:string" use="optional" />
    </xs:complexType>


    <!-- ================================================================== -->
    <!-- Aggregated Types (General) -->
    <!-- ================================================================== -->

    <xs:simpleType name="memberId">
        <xs:restriction base="xs:unsignedInt">
            <xs:minInclusive value="0" />
            <xs:maxInclusive value="268435455" /> <!-- 0x0FFFFFFF -->
        </xs:restriction>
    </xs:simpleType>


    <xs:complexType name="simpleMemberDecl">
        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="type" type="allTypeKind" use="required" />
        <xs:attribute name="nonBasicTypeName" type="identifierName"
                      use="optional" />
    </xs:complexType>


    <xs:simpleType name="tryConstructKind">
        <xs:restriction base="xs:string">
            <xs:enumeration value="discard" />
            <xs:enumeration value="use_default" />
            <xs:enumeration value="trim" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="memberDecl">
        <xs:complexContent>
            <xs:extension base="simpleMemberDecl">
                <xs:sequence>
                    <xs:element name="annotate" type="annotationDecl"
                                minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>

                <xs:attribute name="external" type="xs:boolean"
                              use="optional" default="true" />
                <xs:attribute name="tryConstruct" type="tryConstructKind"
                              use="optional" default="use_default" />
                <xs:attribute name="mapKeyType" type="allTypeKind"
                              use="optional" />
                <xs:attribute name="mapKeyNonBasicTypeName"
                              type="identifierName" use="optional" />
                <xs:attribute name="stringMaxLength" type="xs:string"
                              use="optional" />
                <xs:attribute name="mapKeyStringMaxLength" type="xs:string"
                              use="optional" />
                <xs:attribute name="sequenceMaxLength" type="xs:string"
                              use="optional" />
                <xs:attribute name="mapMaxLength" type="xs:string"
                              use="optional" />
                <xs:attribute name="arrayDimensions" type="arrayDimensionsKind"
                              use="optional" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="verbatimDecl">
        <xs:sequence>
            <xs:element name="text" type="xs:string" minOccurs="1"
                        maxOccurs="1" />
        </xs:sequence>

        <xs:attribute name="language" type="xs:string" use="optional"
                      default="*" />
        <xs:attribute name="placement" type="xs:string" use="optional"
                      default="before-declaration" />
    </xs:complexType>

    <xs:simpleType name="extensibilityKind">
        <xs:restriction base="xs:string">
            <xs:enumeration value="final" />
            <xs:enumeration value="append" />
            <xs:enumeration value="mutable" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="autoIdKind">
        <xs:restriction base="xs:string">
            <xs:enumeration value="hash" />
            <xs:enumeration value="sequencial" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="structOrUnionTypeDecl">
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="annotate" type="annotationDecl" />
                <xs:element name="verbatim" type="verbatimDecl" />
            </xs:choice>
        </xs:sequence>

        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="nested" type="xs:boolean" use="optional"
                      default="false" />
        <xs:attribute name="extensibility" type="extensibilityKind"
                      use="optional" default="append" />
        <xs:attribute name="autoid" type="autoIdKind" use="optional"
                      default="hash" />
    </xs:complexType>


    <!-- =================================================================== -->
    <!-- Annotations -->
    <!-- =================================================================== -->

    <xs:complexType name="annotationTypeDecl">
        <xs:sequence>
            <xs:element name="member" type="simpleMemberDecl"
                        minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="baseType" type="identifierName" use="optional" />
    </xs:complexType>

    <xs:complexType name="annotationMemberValueDecl">
        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="value" type="xs:string" use="optional" />
    </xs:complexType>

    <xs:complexType name="annotationDecl">
        <xs:sequence>
            <xs:element name="member" type="annotationMemberValueDecl"
                        minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="name" type="identifierName" use="required" />
    </xs:complexType>


    <!-- ================================================================== -->
    <!-- Structures -->
    <!-- ================================================================== -->

    <xs:complexType name="structMemberDecl">
        <xs:complexContent>
            <xs:extension base="memberDecl">
                <xs:attribute name="id" type="memberId" use="optional" />
                <xs:attribute name="optional" type="xs:boolean"
                              use="optional" default="true" />
                <xs:attribute name="mustUnderstand" type="xs:boolean"
                              use="optional" default="true" />
                <xs:attribute name="nonSerialized" type="xs:boolean"
                              use="optional" default="true" />
                <xs:attribute name="key" type="xs:boolean" use="optional"
                              default="true" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <xs:complexType name="structDecl">
        <xs:complexContent>
            <xs:extension base="structOrUnionTypeDecl">
                <xs:sequence>
                    <xs:choice maxOccurs="unbounded">
                        <xs:element name="member" type="structMemberDecl"
                                    minOccurs="1" />
                        <xs:element name="const" type="constDecl"
                                    minOccurs="0" />
                    </xs:choice>
                </xs:sequence>

                <xs:attribute name="baseType" type="identifierName"
                              use="optional" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <!-- =================================================================== -->
    <!-- Unions -->
    <!-- =================================================================== -->

    <xs:complexType name="unionMemberDecl">
        <xs:complexContent>
            <xs:extension base="memberDecl" />
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="discriminatorDecl">
        <xs:sequence>
            <xs:element name="annotate" type="annotationDecl"
                        minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="type" type="allTypeKind" use="required" />
        <xs:attribute name="nonBasicTypeName" type="identifierName"
                      use="optional" />
        <xs:attribute name="key" type="xs:boolean" use="optional"
                      default="false" />
    </xs:complexType>

    <xs:complexType name="caseDiscriminatorDecl">
        <xs:attribute name="value" type="xs:string" use="required" />
    </xs:complexType>

    <xs:complexType name="caseDecl">
        <xs:sequence>
            <xs:element name="caseDiscriminator" type="caseDiscriminatorDecl"
                        minOccurs="1" maxOccurs="unbounded" />
            <xs:element name="member" type="unionMemberDecl"
                        minOccurs="1" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="unionDecl">
        <xs:complexContent>
            <xs:extension base="structOrUnionTypeDecl">
                <xs:sequence>
                    <xs:element name="discriminator" type="discriminatorDecl"
                                minOccurs="1" maxOccurs="1" />
                    <xs:element name="case" type="caseDecl"
                                minOccurs="1" maxOccurs="unbounded" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <!-- =================================================================== -->
    <!-- Aliases -->
    <!-- =================================================================== -->

    <xs:complexType name="typedefDecl">
        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="type" type="allTypeKind" use="required" />
        <xs:attribute name="nonBasicTypeName" type="identifierName"
                      use="optional" />
        <xs:attribute name="mapKeyType" type="allTypeKind" use="optional" />
        <xs:attribute name="mapKeyNonBasicTypeName" type="identifierName"
                      use="optional" />
        <xs:attribute name="stringMaxLength" type="xs:string" use="optional" />
        <xs:attribute name="mapKeyStringMaxLength" type="xs:string"
                      use="optional" />
        <xs:attribute name="sequenceMaxLength" type="xs:string"
                      use="optional" />
        <xs:attribute name="mapMaxLength" type="xs:string" use="optional" />
        <xs:attribute name="arrayDimensions" type="arrayDimensionsKind"
                      use="optional" />
        <xs:attribute name="external" type="xs:boolean" use="optional" />
    </xs:complexType>


    <!-- =================================================================== -->
    <!-- Enumerations -->
    <!-- =================================================================== -->

    <xs:simpleType name="enumBitBound">
        <xs:restriction base="xs:unsignedShort">
            <xs:minInclusive value="1" />
            <xs:maxInclusive value="32" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="enumeratorDecl">
        <xs:sequence>
            <xs:element name="annotate" type="annotationDecl"
                        minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="value" type="xs:string" use="optional" />
        <xs:attribute name="defaultLiteral" type="xs:boolean" use="optional"
                      default="true" />
    </xs:complexType>

    <xs:complexType name="enumDecl">
        <xs:sequence>
            <xs:element name="annotate" type="annotationDecl"
                        minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="verbatim" type="verbatimDecl"
                        minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="enumerator" type="enumeratorDecl"
                        minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="bitBound" type="enumBitBound" use="optional"
                      default="32" />
    </xs:complexType>


    <!-- =================================================================== -->
    <!-- Bit Masks -->
    <!-- =================================================================== -->

    <xs:simpleType name="bitmaskBitBound">
        <xs:restriction base="xs:unsignedShort">
            <xs:minInclusive value="1" />
            <xs:maxInclusive value="64" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="flagIndex">
        <xs:restriction base="xs:unsignedShort">
            <xs:minInclusive value="0" />
            <xs:maxInclusive value="63" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="flagDecl">
        <xs:sequence>
            <xs:element name="annotate" type="annotationDecl"
                        minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="position" type="flagIndex" use="required" />
    </xs:complexType>

    <xs:complexType name="bitmaskDecl">
        <xs:sequence>
            <xs:element name="annotate" type="annotationDecl"
                        minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="flag" type="flagDecl" minOccurs="0"
                        maxOccurs="64" />
        </xs:sequence>

        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="bitBound" type="bitmaskBitBound" use="optional"
                      default="32" />
    </xs:complexType>


    <!-- ================================================================== -->
    <!-- Modules -->
    <!-- ================================================================== -->

    <xs:group name="moduleElements">
        <xs:sequence>
            <xs:choice maxOccurs="unbounded">
                <xs:element name="include2" type="includeDecl"
                            minOccurs="0" />
                <xs:element name="forward_dcl" type="forwardDecl"
                            minOccurs="0" />
                <xs:element name="const" type="constDecl" minOccurs="0" />
                <xs:element name="module" type="moduleDecl"
                            minOccurs="0" />
                <xs:element name="struct" type="structDecl"
                            minOccurs="0" />
                <xs:element name="union" type="unionDecl" minOccurs="0" />
                <xs:element name="annotation" type="annotationTypeDecl"
                            minOccurs="0" />
                <xs:element name="typedef" type="typedefDecl"
                            minOccurs="0" />
                <xs:element name="enum" type="enumDecl" minOccurs="0" />
                <xs:element name="bitmask" type="bitmaskDecl"
                            minOccurs="0" />
            </xs:choice>
        </xs:sequence>
    </xs:group>

    <xs:complexType name="moduleDecl">
        <xs:sequence>
            <xs:element name="include" type="includeDecl" minOccurs="0"
                        maxOccurs="unbounded" />
            <xs:group ref="moduleElements" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>

        <xs:attribute name="name" type="identifierName" use="required" />
        <xs:attribute name="autoid" type="autoIdKind" use="optional"
                      default="hash" />
    </xs:complexType>

    <xs:complexType name="typeLibrary">
        <xs:group ref="moduleElements" />
    </xs:complexType>

</xs:schema>
