<?xml encoding="UTF-8"?>
<!-- ?xml encoding="ISO-8859-1"? -->
<!ELEMENT gdd ((import*, package+)+)>
<!ATTLIST gdd
        version          CDATA                             "1.0"
>

<!ELEMENT import EMPTY>
<!ATTLIST import
        name             CDATA                             #REQUIRED
        std              (TRUE | FALSE)                    "FALSE"
        soft             (TRUE | FALSE | FORWARDONLY)      "FALSE"
        namespace        CDATA                             #IMPLIED
>

<!ELEMENT package ((import*, class*, namespace*, assoc*)*)>
<!ATTLIST package
        name             CDATA                             #REQUIRED
        namespace        CDATA                             #IMPLIED
>
<!-- ELEMENT class ((class?, ..... -->
<!ELEMENT class ((desc?, base?, copyconstructor?, assignmentoperator?, import?, location?, enum?, typedef?, constructor?, destructor?, method?, attribute?, relation?, template?)*)>
<!ATTLIST class
        name              CDATA                            #REQUIRED
        author            CDATA                            #REQUIRED
        desc              CDATA                            #REQUIRED
        id                CDATA                            #IMPLIED
        version           CDATA                            #IMPLIED
        location          CDATA                            #IMPLIED
        namespace         CDATA                            #IMPLIED
        stdVectorTypeDef  (TRUE | FALSE)                   "FALSE"  
        keyedContTypeDef  (TRUE | FALSE)                   "FALSE"  
        contObjectTypeDef (TRUE | FALSE)                   "FALSE"
        serializers       (TRUE | FALSE)                   "TRUE"    
        virtual           (TRUE | FALSE)                   "TRUE"
        allocator         (DEFAULT | NO | BOOST | BOOST2 | DEBUG )  "DEFAULT"    
        defaultconstructor (TRUE | FALSE)                  "TRUE"
        defaultdestructor  (TRUE | FALSE)                  "TRUE">
       
<!ELEMENT desc (#PCDATA)>
<!ATTLIST desc
        xml:space        (default | preserve)              #FIXED "preserve"
>
<!ELEMENT copyconstructor EMPTY>
<!ELEMENT assignmentoperator EMPTY>
<!ELEMENT location EMPTY>
<!ATTLIST location
        name             CDATA                             #REQUIRED
        place            CDATA                             #REQUIRED
        noQuote          (TRUE | FALSE)                    "FALSE"
>
<!ELEMENT namespace ((desc?, typedef?, enum?, class?, import?, attribute?, method?)*)>
<!ATTLIST namespace
        name             CDATA                             #REQUIRED
        author           CDATA                             #IMPLIED
        desc             CDATA                             #REQUIRED
        scope            CDATA                             #IMPLIED
>
<!ELEMENT base EMPTY>
<!ATTLIST base
        name             CDATA                             #REQUIRED
        virtual          (TRUE | FALSE)                    "FALSE"
        access           (PUBLIC | PROTECTED | PRIVATE)    "PUBLIC"
>
<!ELEMENT enum (enumval*)>
<!ATTLIST enum
        name             CDATA                             #REQUIRED
        desc             CDATA                             #REQUIRED
        value            CDATA                             #IMPLIED
        strTypConv       (TRUE | FALSE )                   "FALSE"
        access           (PUBLIC | PROTECTED | PRIVATE)    "PRIVATE"
        unknownValue     CDATA                             "Unknown"
>
<!ELEMENT enumval EMPTY>
<!ATTLIST enumval
        name             CDATA                             #REQUIRED
        value            CDATA                             #IMPLIED
        desc             CDATA                             #REQUIRED
>
<!ELEMENT typedef EMPTY>
<!ATTLIST typedef 
        desc             CDATA                             #REQUIRED
        type             CDATA                             #REQUIRED
        def              CDATA                             #REQUIRED
        access           (PUBLIC | PROTECTED | PRIVATE)    "PRIVATE"
>
<!ELEMENT constructor (arg*, code?, arg*)>
<!ATTLIST constructor
        desc             CDATA                             #REQUIRED
        argList          CDATA                             #IMPLIED
        initList         CDATA                             #IMPLIED
        explicit         (TRUE | FALSE)                    "FALSE"
>
<!ELEMENT destructor (arg*, code?, arg*)>
<!ATTLIST destructor
        desc             CDATA                             #REQUIRED
        argList          CDATA                             #IMPLIED
        virtual          (TRUE | FALSE)                    "FALSE"
>
<!ELEMENT method ((arg*, return?, arg*, code?, arg*) | (arg*, code?, arg*, return?, arg*))>
<!ATTLIST method
        name             CDATA                             #REQUIRED
        desc             CDATA                             #REQUIRED
        template         CDATA                             #IMPLIED
        access           (PUBLIC | PROTECTED | PRIVATE)    "PUBLIC"
        const            (TRUE | FALSE)                    "FALSE"
        virtual          (TRUE | FALSE | PURE)             "FALSE"
        static           (TRUE | FALSE)                    "FALSE"
        inline           (TRUE | FALSE)                    "FALSE"
        friend           (TRUE | FALSE)                    "FALSE"
        type             CDATA                             "void"
        argList          CDATA                             #IMPLIED
        useBase          CDATA                             #IMPLIED
>
<!ELEMENT arg EMPTY>
<!ATTLIST arg
        type             CDATA                             #REQUIRED
        name             CDATA                             #IMPLIED
        const            (TRUE | FALSE)                    "FALSE"
        inout            (BYVALUE | INPUT | INOUT | BOTH)  "INPUT"
>
<!ELEMENT return EMPTY>
<!ATTLIST return
        type             CDATA                             #REQUIRED
        const            (TRUE | FALSE)                    "FALSE"
>
<!ELEMENT code (#PCDATA)>
<!ATTLIST code
        xml:space        (default | preserve)              #FIXED "preserve"
>
<!ELEMENT attribute (bitfield*)>
<!ATTLIST attribute
        type             CDATA                            #REQUIRED
        name             CDATA                            #REQUIRED
        desc             CDATA                            #REQUIRED
        init             CDATA                            #IMPLIED
        dictalias        CDATA                            #IMPLIED
        access           (PUBLIC | PROTECTED | PRIVATE)   "PRIVATE"
        compression      (TRUE | FALSE)                   "TRUE"
        setMeth          (TRUE | FALSE)                   "TRUE"
        getMeth          (TRUE | FALSE)                   "TRUE"
        transient        (TRUE | FALSE)                   "FALSE"    
        nonconstaccessor (TRUE | FALSE)                   "FALSE"
>
<!ELEMENT relation EMPTY>
<!ATTLIST relation
        type             CDATA                            #REQUIRED
        name             CDATA                            #REQUIRED
        desc             CDATA                            #REQUIRED
        access           (PUBLIC | PROTECTED | PRIVATE)   "PRIVATE"
        multiplicity     (1 | N | n | M | m)              "1"
        serialize        (TRUE | FALSE)                   "TRUE"
        setMeth          (TRUE | FALSE)                   "TRUE"
        getMeth          (TRUE | FALSE)                   "TRUE"
        addMeth          (TRUE | FALSE)                   "TRUE"
        remMeth          (TRUE | FALSE)                   "TRUE"
        clrMeth          (TRUE | FALSE)                   "TRUE"
        nonconstaccessor (TRUE | FALSE)                   "FALSE"
>
<!ELEMENT bitfield EMPTY>
<!ATTLIST bitfield
        name             CDATA                             #REQUIRED
        type             CDATA                             #IMPLIED
        length           CDATA                             #REQUIRED
        desc             CDATA                             #REQUIRED
        startBit         CDATA                             #IMPLIED
        exclusive        (TRUE | FALSE)                    "TRUE"
        setMeth          (TRUE | FALSE)                    "TRUE"
        getMeth          (TRUE | FALSE)                    "TRUE"
        checkMeth        (TRUE | FALSE)                    "FALSE"
>
<!ELEMENT template EMPTY>
<!ATTLIST template
        name             CDATA                             #REQUIRED
        t1               CDATA                             "THIS"
        t2               CDATA                             #IMPLIED
        t3               CDATA                             #IMPLIED
        t4               CDATA                             #IMPLIED
>

<!ELEMENT assoc EMPTY>
<!ATTLIST assoc
        type             (1D | 2D)                         "1D"
        weight           CDATA                             "NONE"
        from             CDATA                             #REQUIRED
        to               CDATA                             #REQUIRED
>

<!ENTITY KeyedObjectKey 'int'>
<!ENTITY Reference '<template name="SmartRef"/>
        <template name="SmartRefVector"/>'
>
<!ENTITY StlVector '<template name="vector" t1="THIS"/>'
>
<!ENTITY StlConstVector '<template name="vector" t1="const THIS"/>'
>
<!ENTITY StlPtrVector '<template name="vector" t1="THIS*"/>'
>
<!ENTITY StlConstPtrVector '<template name="vector" t1="const THIS*"/>'
>
<!ENTITY DataObject '<template name="SmartRef"/>
        <template name="SmartRefVector"/>'
>
<!ENTITY ContainedObject '<template name="SmartRef"/>
        <template name="SmartRefVector"/>
        <template name="vector" t1="THIS*"/>
        <template name="ObjectVector"/>'
>
<!ENTITY KeyedContainer '<template name="SmartRef"/>
        <template name="SmartRefVector"/>
        <template name="vector" t1="THIS*"/>
        <template name="ObjectVector"/>
        <template name="KeyedContainer"/>'
>
<!ENTITY KeyedObject '<template name="KeyedObject" t1="int"/>
        <template name="SmartRef"/>
        <template name="SmartRefVector"/>
        <template name="vector" t1="THIS*"/>
        <template name="ObjectVector"/>
        <template name="KeyedContainer"/>'
>
