// Copyright (c) 2005-2014 Code Synthesis Tools CC
//
// This program was generated by CodeSynthesis XSD, an XML Schema to
// C++ data binding compiler.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
// In addition, as a special exception, Code Synthesis Tools CC gives
// permission to link this program with the Xerces-C++ library (or with
// modified versions of Xerces-C++ that use the same license as Xerces-C++),
// and distribute linked combinations including the two. You must obey
// the GNU General Public License version 2 in all respects for all of
// the code used other than Xerces-C++. If you modify this copy of the
// program, you may extend this exception to your version of the program,
// but you are not obligated to do so. If you do not wish to do so, delete
// this exception statement from your version.
//
// Furthermore, Code Synthesis Tools CC makes a special exception for
// the Free/Libre and Open Source Software (FLOSS) which is described
// in the accompanying FLOSSE file.
//

#ifndef CXX_WORK_XSD_4_0_0_XSD_TESTS_CXX_TREE_ORDER_TEST_HXX
#define CXX_WORK_XSD_4_0_0_XSD_TESTS_CXX_TREE_ORDER_TEST_HXX

#ifndef XSD_USE_CHAR
#define XSD_USE_CHAR
#endif

#ifndef XSD_CXX_TREE_USE_CHAR
#define XSD_CXX_TREE_USE_CHAR
#endif

// Begin prologue.
//
//
// End prologue.

#include <xsd/cxx/config.hxx>

#if (XSD_INT_VERSION != 4000000L)
#error XSD runtime version mismatch
#endif

#include <xsd/cxx/pre.hxx>

#include <xsd/cxx/xml/char-utf8.hxx>

#include <xsd/cxx/tree/exceptions.hxx>
#include <xsd/cxx/tree/elements.hxx>
#include <xsd/cxx/tree/types.hxx>

#include <xsd/cxx/xml/error-handler.hxx>

#include <xsd/cxx/xml/dom/auto-ptr.hxx>

#include <xsd/cxx/tree/parsing.hxx>
#include <xsd/cxx/tree/parsing/byte.hxx>
#include <xsd/cxx/tree/parsing/unsigned-byte.hxx>
#include <xsd/cxx/tree/parsing/short.hxx>
#include <xsd/cxx/tree/parsing/unsigned-short.hxx>
#include <xsd/cxx/tree/parsing/int.hxx>
#include <xsd/cxx/tree/parsing/unsigned-int.hxx>
#include <xsd/cxx/tree/parsing/long.hxx>
#include <xsd/cxx/tree/parsing/unsigned-long.hxx>
#include <xsd/cxx/tree/parsing/boolean.hxx>
#include <xsd/cxx/tree/parsing/float.hxx>
#include <xsd/cxx/tree/parsing/double.hxx>
#include <xsd/cxx/tree/parsing/decimal.hxx>

#include <xsd/cxx/xml/dom/serialization-header.hxx>
#include <xsd/cxx/tree/serialization.hxx>
#include <xsd/cxx/tree/serialization/byte.hxx>
#include <xsd/cxx/tree/serialization/unsigned-byte.hxx>
#include <xsd/cxx/tree/serialization/short.hxx>
#include <xsd/cxx/tree/serialization/unsigned-short.hxx>
#include <xsd/cxx/tree/serialization/int.hxx>
#include <xsd/cxx/tree/serialization/unsigned-int.hxx>
#include <xsd/cxx/tree/serialization/long.hxx>
#include <xsd/cxx/tree/serialization/unsigned-long.hxx>
#include <xsd/cxx/tree/serialization/boolean.hxx>
#include <xsd/cxx/tree/serialization/float.hxx>
#include <xsd/cxx/tree/serialization/double.hxx>
#include <xsd/cxx/tree/serialization/decimal.hxx>

namespace xml_schema
{
  // anyType and anySimpleType.
  //
  typedef ::xsd::cxx::tree::type type;
  typedef ::xsd::cxx::tree::simple_type< char, type > simple_type;
  typedef ::xsd::cxx::tree::type container;

  // 8-bit
  //
  typedef signed char byte;
  typedef unsigned char unsigned_byte;

  // 16-bit
  //
  typedef short short_;
  typedef unsigned short unsigned_short;

  // 32-bit
  //
  typedef int int_;
  typedef unsigned int unsigned_int;

  // 64-bit
  //
  typedef long long long_;
  typedef unsigned long long unsigned_long;

  // Supposed to be arbitrary-length integral types.
  //
  typedef long long integer;
  typedef long long non_positive_integer;
  typedef unsigned long long non_negative_integer;
  typedef unsigned long long positive_integer;
  typedef long long negative_integer;

  // Boolean.
  //
  typedef bool boolean;

  // Floating-point types.
  //
  typedef float float_;
  typedef double double_;
  typedef double decimal;

  // String types.
  //
  typedef ::xsd::cxx::tree::string< char, simple_type > string;
  typedef ::xsd::cxx::tree::normalized_string< char, string > normalized_string;
  typedef ::xsd::cxx::tree::token< char, normalized_string > token;
  typedef ::xsd::cxx::tree::name< char, token > name;
  typedef ::xsd::cxx::tree::nmtoken< char, token > nmtoken;
  typedef ::xsd::cxx::tree::nmtokens< char, simple_type, nmtoken > nmtokens;
  typedef ::xsd::cxx::tree::ncname< char, name > ncname;
  typedef ::xsd::cxx::tree::language< char, token > language;

  // ID/IDREF.
  //
  typedef ::xsd::cxx::tree::id< char, ncname > id;
  typedef ::xsd::cxx::tree::idref< char, ncname, type > idref;
  typedef ::xsd::cxx::tree::idrefs< char, simple_type, idref > idrefs;

  // URI.
  //
  typedef ::xsd::cxx::tree::uri< char, simple_type > uri;

  // Qualified name.
  //
  typedef ::xsd::cxx::tree::qname< char, simple_type, uri, ncname > qname;

  // Binary.
  //
  typedef ::xsd::cxx::tree::buffer< char > buffer;
  typedef ::xsd::cxx::tree::base64_binary< char, simple_type > base64_binary;
  typedef ::xsd::cxx::tree::hex_binary< char, simple_type > hex_binary;

  // Date/time.
  //
  typedef ::xsd::cxx::tree::time_zone time_zone;
  typedef ::xsd::cxx::tree::date< char, simple_type > date;
  typedef ::xsd::cxx::tree::date_time< char, simple_type > date_time;
  typedef ::xsd::cxx::tree::duration< char, simple_type > duration;
  typedef ::xsd::cxx::tree::gday< char, simple_type > gday;
  typedef ::xsd::cxx::tree::gmonth< char, simple_type > gmonth;
  typedef ::xsd::cxx::tree::gmonth_day< char, simple_type > gmonth_day;
  typedef ::xsd::cxx::tree::gyear< char, simple_type > gyear;
  typedef ::xsd::cxx::tree::gyear_month< char, simple_type > gyear_month;
  typedef ::xsd::cxx::tree::time< char, simple_type > time;

  // Entity.
  //
  typedef ::xsd::cxx::tree::entity< char, ncname > entity;
  typedef ::xsd::cxx::tree::entities< char, simple_type, entity > entities;

  typedef ::xsd::cxx::tree::content_order content_order;
  // Namespace information and list stream. Used in
  // serialization functions.
  //
  typedef ::xsd::cxx::xml::dom::namespace_info< char > namespace_info;
  typedef ::xsd::cxx::xml::dom::namespace_infomap< char > namespace_infomap;
  typedef ::xsd::cxx::tree::list_stream< char > list_stream;
  typedef ::xsd::cxx::tree::as_double< double_ > as_double;
  typedef ::xsd::cxx::tree::as_decimal< decimal > as_decimal;
  typedef ::xsd::cxx::tree::facet facet;

  // Flags and properties.
  //
  typedef ::xsd::cxx::tree::flags flags;
  typedef ::xsd::cxx::tree::properties< char > properties;

  // Parsing/serialization diagnostics.
  //
  typedef ::xsd::cxx::tree::severity severity;
  typedef ::xsd::cxx::tree::error< char > error;
  typedef ::xsd::cxx::tree::diagnostics< char > diagnostics;

  // Exceptions.
  //
  typedef ::xsd::cxx::tree::exception< char > exception;
  typedef ::xsd::cxx::tree::bounds< char > bounds;
  typedef ::xsd::cxx::tree::duplicate_id< char > duplicate_id;
  typedef ::xsd::cxx::tree::parsing< char > parsing;
  typedef ::xsd::cxx::tree::expected_element< char > expected_element;
  typedef ::xsd::cxx::tree::unexpected_element< char > unexpected_element;
  typedef ::xsd::cxx::tree::expected_attribute< char > expected_attribute;
  typedef ::xsd::cxx::tree::unexpected_enumerator< char > unexpected_enumerator;
  typedef ::xsd::cxx::tree::expected_text_content< char > expected_text_content;
  typedef ::xsd::cxx::tree::no_prefix_mapping< char > no_prefix_mapping;
  typedef ::xsd::cxx::tree::serialization< char > serialization;

  // Error handler callback interface.
  //
  typedef ::xsd::cxx::xml::error_handler< char > error_handler;

  // DOM interaction.
  //
  namespace dom
  {
    // Automatic pointer for DOMDocument.
    //
    using ::xsd::cxx::xml::dom::auto_ptr;

#ifndef XSD_CXX_TREE_TREE_NODE_KEY__XML_SCHEMA
#define XSD_CXX_TREE_TREE_NODE_KEY__XML_SCHEMA
    // DOM user data key for back pointers to tree nodes.
    //
    const XMLCh* const tree_node_key = ::xsd::cxx::tree::user_data_keys::node;
#endif
  }
}

// Forward declarations.
//
namespace test
{
  class t1_base;
  class t1_interm;
  class t1_derived;
  class t2_base;
  class t2_derived;
  class t3_type;
  class t4_base;
  class t4_derived;
  class t5_base;
  class t5_derived;
  class t6_base;
  class t6_derived;
  class t7_type;
  class root;
}


#include <memory>    // ::std::auto_ptr
#include <limits>    // std::numeric_limits
#include <algorithm> // std::binary_search
#include <cstddef>   // std::size_t
#include <vector>

#include <xsd/cxx/xml/char-utf8.hxx>

#include <xsd/cxx/tree/exceptions.hxx>
#include <xsd/cxx/tree/elements.hxx>
#include <xsd/cxx/tree/containers.hxx>
#include <xsd/cxx/tree/list.hxx>

#include <xsd/cxx/xml/dom/parsing-header.hxx>

#include <xsd/cxx/tree/containers-wildcard.hxx>

#ifndef XSD_DONT_INCLUDE_INLINE
#define XSD_DONT_INCLUDE_INLINE

#undef XSD_DONT_INCLUDE_INLINE
#else

#endif // XSD_DONT_INCLUDE_INLINE

namespace test
{
  class t1_base: public ::xml_schema::type
  {
    public:
    // a
    //
    typedef ::xml_schema::string a_type;
    typedef ::xsd::cxx::tree::sequence< a_type > a_sequence;
    typedef a_sequence::iterator a_iterator;
    typedef a_sequence::const_iterator a_const_iterator;
    typedef ::xsd::cxx::tree::traits< a_type, char > a_traits;

    static const ::std::size_t a_id = 1UL;

    const a_sequence&
    a () const;

    a_sequence&
    a ();

    void
    a (const a_sequence& s);

    // b
    //
    typedef ::xml_schema::string b_type;
    typedef ::xsd::cxx::tree::sequence< b_type > b_sequence;
    typedef b_sequence::iterator b_iterator;
    typedef b_sequence::const_iterator b_const_iterator;
    typedef ::xsd::cxx::tree::traits< b_type, char > b_traits;

    static const ::std::size_t b_id = 2UL;

    const b_sequence&
    b () const;

    b_sequence&
    b ();

    void
    b (const b_sequence& s);

    // content_order
    //
    typedef ::xml_schema::content_order content_order_type;
    typedef ::std::vector< content_order_type > content_order_sequence;
    typedef content_order_sequence::iterator content_order_iterator;
    typedef content_order_sequence::const_iterator content_order_const_iterator;

    const content_order_sequence&
    content_order () const;

    content_order_sequence&
    content_order ();

    void
    content_order (const content_order_sequence& s);

    // Constructors.
    //
    t1_base ();

    t1_base (const ::xercesc::DOMElement& e,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    t1_base (const t1_base& x,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    virtual t1_base*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    t1_base&
    operator= (const t1_base& x);

    virtual 
    ~t1_base ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    content_order_sequence content_order_;

    a_sequence a_;
    b_sequence b_;
  };

  bool
  operator== (const t1_base&, const t1_base&);

  bool
  operator!= (const t1_base&, const t1_base&);


  class t1_interm: public ::test::t1_base
  {
    public:
    // c
    //
    typedef ::xml_schema::string c_type;
    typedef ::xsd::cxx::tree::sequence< c_type > c_sequence;
    typedef c_sequence::iterator c_iterator;
    typedef c_sequence::const_iterator c_const_iterator;
    typedef ::xsd::cxx::tree::traits< c_type, char > c_traits;

    const c_sequence&
    c () const;

    c_sequence&
    c ();

    void
    c (const c_sequence& s);

    // Constructors.
    //
    t1_interm ();

    t1_interm (const ::xercesc::DOMElement& e,
               ::xml_schema::flags f = 0,
               ::xml_schema::container* c = 0);

    t1_interm (const t1_interm& x,
               ::xml_schema::flags f = 0,
               ::xml_schema::container* c = 0);

    virtual t1_interm*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    t1_interm&
    operator= (const t1_interm& x);

    virtual 
    ~t1_interm ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    c_sequence c_;
  };

  bool
  operator== (const t1_interm&, const t1_interm&);

  bool
  operator!= (const t1_interm&, const t1_interm&);


  class t1_derived: public ::test::t1_interm
  {
    public:
    // d
    //
    typedef ::xml_schema::string d_type;
    typedef ::xsd::cxx::tree::sequence< d_type > d_sequence;
    typedef d_sequence::iterator d_iterator;
    typedef d_sequence::const_iterator d_const_iterator;
    typedef ::xsd::cxx::tree::traits< d_type, char > d_traits;

    static const ::std::size_t d_id = 3UL;

    const d_sequence&
    d () const;

    d_sequence&
    d ();

    void
    d (const d_sequence& s);

    // any
    //
    typedef ::xsd::cxx::tree::element_sequence any_sequence;
    typedef any_sequence::iterator any_iterator;
    typedef any_sequence::const_iterator any_const_iterator;

    static const ::std::size_t any_id = 4UL;

    const any_sequence&
    any () const;

    any_sequence&
    any ();

    void
    any (const any_sequence& s);

    // DOMDocument for wildcard content.
    //
    const ::xercesc::DOMDocument&
    dom_document () const;

    ::xercesc::DOMDocument&
    dom_document ();

    // Constructors.
    //
    t1_derived ();

    t1_derived (const ::xercesc::DOMElement& e,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    t1_derived (const t1_derived& x,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    virtual t1_derived*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    t1_derived&
    operator= (const t1_derived& x);

    virtual 
    ~t1_derived ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    ::xml_schema::dom::auto_ptr< ::xercesc::DOMDocument > dom_document_;

    d_sequence d_;
    any_sequence any_;
  };

  bool
  operator== (const t1_derived&, const t1_derived&);

  bool
  operator!= (const t1_derived&, const t1_derived&);


  class t2_base: public ::xml_schema::type
  {
    public:
    // content_order
    //
    typedef ::xml_schema::content_order content_order_type;
    typedef ::std::vector< content_order_type > content_order_sequence;
    typedef content_order_sequence::iterator content_order_iterator;
    typedef content_order_sequence::const_iterator content_order_const_iterator;

    const content_order_sequence&
    content_order () const;

    content_order_sequence&
    content_order ();

    void
    content_order (const content_order_sequence& s);

    // Constructors.
    //
    t2_base ();

    t2_base (const ::xercesc::DOMElement& e,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    t2_base (const ::xercesc::DOMAttr& a,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    t2_base (const ::std::string& s,
             const ::xercesc::DOMElement* e,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    t2_base (const t2_base& x,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    virtual t2_base*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    virtual 
    ~t2_base ();

    // Implementation.
    //
    protected:
    content_order_sequence content_order_;
  };

  bool
  operator== (const t2_base&, const t2_base&);

  bool
  operator!= (const t2_base&, const t2_base&);


  class t2_derived: public ::test::t2_base
  {
    public:
    // a
    //
    typedef ::xml_schema::string a_type;
    typedef ::xsd::cxx::tree::sequence< a_type > a_sequence;
    typedef a_sequence::iterator a_iterator;
    typedef a_sequence::const_iterator a_const_iterator;
    typedef ::xsd::cxx::tree::traits< a_type, char > a_traits;

    static const ::std::size_t a_id = 1UL;

    const a_sequence&
    a () const;

    a_sequence&
    a ();

    void
    a (const a_sequence& s);

    // b
    //
    typedef ::xml_schema::string b_type;
    typedef ::xsd::cxx::tree::sequence< b_type > b_sequence;
    typedef b_sequence::iterator b_iterator;
    typedef b_sequence::const_iterator b_const_iterator;
    typedef ::xsd::cxx::tree::traits< b_type, char > b_traits;

    static const ::std::size_t b_id = 2UL;

    const b_sequence&
    b () const;

    b_sequence&
    b ();

    void
    b (const b_sequence& s);

    // Constructors.
    //
    t2_derived ();

    t2_derived (const ::xercesc::DOMElement& e,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    t2_derived (const t2_derived& x,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    virtual t2_derived*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    t2_derived&
    operator= (const t2_derived& x);

    virtual 
    ~t2_derived ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    a_sequence a_;
    b_sequence b_;
  };

  bool
  operator== (const t2_derived&, const t2_derived&);

  bool
  operator!= (const t2_derived&, const t2_derived&);


  class t3_type: public ::xml_schema::type
  {
    public:
    // a
    //
    typedef ::xml_schema::string a_type;
    typedef ::xsd::cxx::tree::traits< a_type, char > a_traits;

    static const ::std::size_t a_id = 1UL;

    const a_type&
    a () const;

    a_type&
    a ();

    void
    a (const a_type& x);

    void
    a (::std::auto_ptr< a_type > p);

    // b
    //
    typedef ::xml_schema::string b_type;
    typedef ::xsd::cxx::tree::optional< b_type > b_optional;
    typedef ::xsd::cxx::tree::traits< b_type, char > b_traits;

    static const ::std::size_t b_id = 2UL;

    const b_optional&
    b () const;

    b_optional&
    b ();

    void
    b (const b_type& x);

    void
    b (const b_optional& x);

    void
    b (::std::auto_ptr< b_type > p);

    // c
    //
    typedef ::xml_schema::string c_type;
    typedef ::xsd::cxx::tree::sequence< c_type > c_sequence;
    typedef c_sequence::iterator c_iterator;
    typedef c_sequence::const_iterator c_const_iterator;
    typedef ::xsd::cxx::tree::traits< c_type, char > c_traits;

    static const ::std::size_t c_id = 3UL;

    const c_sequence&
    c () const;

    c_sequence&
    c ();

    void
    c (const c_sequence& s);

    // content_order
    //
    typedef ::xml_schema::content_order content_order_type;
    typedef ::std::vector< content_order_type > content_order_sequence;
    typedef content_order_sequence::iterator content_order_iterator;
    typedef content_order_sequence::const_iterator content_order_const_iterator;

    const content_order_sequence&
    content_order () const;

    content_order_sequence&
    content_order ();

    void
    content_order (const content_order_sequence& s);

    // Constructors.
    //
    t3_type (const a_type&);

    t3_type (const ::xercesc::DOMElement& e,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    t3_type (const t3_type& x,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    virtual t3_type*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    t3_type&
    operator= (const t3_type& x);

    virtual 
    ~t3_type ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    content_order_sequence content_order_;

    ::xsd::cxx::tree::one< a_type > a_;
    b_optional b_;
    c_sequence c_;
  };

  bool
  operator== (const t3_type&, const t3_type&);

  bool
  operator!= (const t3_type&, const t3_type&);


  class t4_base: public ::xml_schema::type
  {
    public:
    // a
    //
    typedef ::xml_schema::string a_type;
    typedef ::xsd::cxx::tree::sequence< a_type > a_sequence;
    typedef a_sequence::iterator a_iterator;
    typedef a_sequence::const_iterator a_const_iterator;
    typedef ::xsd::cxx::tree::traits< a_type, char > a_traits;

    static const ::std::size_t a_id = 1UL;

    const a_sequence&
    a () const;

    a_sequence&
    a ();

    void
    a (const a_sequence& s);

    // b
    //
    typedef ::xml_schema::string b_type;
    typedef ::xsd::cxx::tree::sequence< b_type > b_sequence;
    typedef b_sequence::iterator b_iterator;
    typedef b_sequence::const_iterator b_const_iterator;
    typedef ::xsd::cxx::tree::traits< b_type, char > b_traits;

    static const ::std::size_t b_id = 2UL;

    const b_sequence&
    b () const;

    b_sequence&
    b ();

    void
    b (const b_sequence& s);

    // text_content
    //
    typedef ::xml_schema::string text_content_type;
    typedef ::xsd::cxx::tree::sequence< text_content_type > text_content_sequence;
    typedef text_content_sequence::iterator text_content_iterator;
    typedef text_content_sequence::const_iterator text_content_const_iterator;

    static const ::std::size_t text_content_id = 3UL;

    const text_content_sequence&
    text_content () const;

    text_content_sequence&
    text_content ();

    void
    text_content (const text_content_sequence& s);

    // content_order
    //
    typedef ::xml_schema::content_order content_order_type;
    typedef ::std::vector< content_order_type > content_order_sequence;
    typedef content_order_sequence::iterator content_order_iterator;
    typedef content_order_sequence::const_iterator content_order_const_iterator;

    const content_order_sequence&
    content_order () const;

    content_order_sequence&
    content_order ();

    void
    content_order (const content_order_sequence& s);

    // Constructors.
    //
    t4_base ();

    t4_base (const ::xercesc::DOMElement& e,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    t4_base (const t4_base& x,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    virtual t4_base*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    t4_base&
    operator= (const t4_base& x);

    virtual 
    ~t4_base ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    text_content_sequence text_content_;

    content_order_sequence content_order_;

    a_sequence a_;
    b_sequence b_;
  };

  bool
  operator== (const t4_base&, const t4_base&);

  bool
  operator!= (const t4_base&, const t4_base&);


  class t4_derived: public ::test::t4_base
  {
    public:
    // c
    //
    typedef ::xml_schema::string c_type;
    typedef ::xsd::cxx::tree::sequence< c_type > c_sequence;
    typedef c_sequence::iterator c_iterator;
    typedef c_sequence::const_iterator c_const_iterator;
    typedef ::xsd::cxx::tree::traits< c_type, char > c_traits;

    static const ::std::size_t c_id = 4UL;

    const c_sequence&
    c () const;

    c_sequence&
    c ();

    void
    c (const c_sequence& s);

    // any
    //
    typedef ::xsd::cxx::tree::element_sequence any_sequence;
    typedef any_sequence::iterator any_iterator;
    typedef any_sequence::const_iterator any_const_iterator;

    static const ::std::size_t any_id = 5UL;

    const any_sequence&
    any () const;

    any_sequence&
    any ();

    void
    any (const any_sequence& s);

    // DOMDocument for wildcard content.
    //
    const ::xercesc::DOMDocument&
    dom_document () const;

    ::xercesc::DOMDocument&
    dom_document ();

    // Constructors.
    //
    t4_derived ();

    t4_derived (const ::xercesc::DOMElement& e,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    t4_derived (const t4_derived& x,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    virtual t4_derived*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    t4_derived&
    operator= (const t4_derived& x);

    virtual 
    ~t4_derived ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    ::xml_schema::dom::auto_ptr< ::xercesc::DOMDocument > dom_document_;

    c_sequence c_;
    any_sequence any_;
  };

  bool
  operator== (const t4_derived&, const t4_derived&);

  bool
  operator!= (const t4_derived&, const t4_derived&);


  class t5_base: public ::xml_schema::type
  {
    public:
    // text_content
    //
    typedef ::xml_schema::string text_content_type;
    typedef ::xsd::cxx::tree::sequence< text_content_type > text_content_sequence;
    typedef text_content_sequence::iterator text_content_iterator;
    typedef text_content_sequence::const_iterator text_content_const_iterator;

    static const ::std::size_t text_content_id = 1UL;

    const text_content_sequence&
    text_content () const;

    text_content_sequence&
    text_content ();

    void
    text_content (const text_content_sequence& s);

    // content_order
    //
    typedef ::xml_schema::content_order content_order_type;
    typedef ::std::vector< content_order_type > content_order_sequence;
    typedef content_order_sequence::iterator content_order_iterator;
    typedef content_order_sequence::const_iterator content_order_const_iterator;

    const content_order_sequence&
    content_order () const;

    content_order_sequence&
    content_order ();

    void
    content_order (const content_order_sequence& s);

    // Constructors.
    //
    t5_base ();

    t5_base (const ::xercesc::DOMElement& e,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    t5_base (const t5_base& x,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    virtual t5_base*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    virtual 
    ~t5_base ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    text_content_sequence text_content_;

    content_order_sequence content_order_;
  };

  bool
  operator== (const t5_base&, const t5_base&);

  bool
  operator!= (const t5_base&, const t5_base&);


  class t5_derived: public ::test::t5_base
  {
    public:
    // a
    //
    typedef ::xml_schema::string a_type;
    typedef ::xsd::cxx::tree::sequence< a_type > a_sequence;
    typedef a_sequence::iterator a_iterator;
    typedef a_sequence::const_iterator a_const_iterator;
    typedef ::xsd::cxx::tree::traits< a_type, char > a_traits;

    static const ::std::size_t a_id = 2UL;

    const a_sequence&
    a () const;

    a_sequence&
    a ();

    void
    a (const a_sequence& s);

    // b
    //
    typedef ::xml_schema::string b_type;
    typedef ::xsd::cxx::tree::sequence< b_type > b_sequence;
    typedef b_sequence::iterator b_iterator;
    typedef b_sequence::const_iterator b_const_iterator;
    typedef ::xsd::cxx::tree::traits< b_type, char > b_traits;

    static const ::std::size_t b_id = 3UL;

    const b_sequence&
    b () const;

    b_sequence&
    b ();

    void
    b (const b_sequence& s);

    // Constructors.
    //
    t5_derived ();

    t5_derived (const ::xercesc::DOMElement& e,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    t5_derived (const t5_derived& x,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    virtual t5_derived*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    t5_derived&
    operator= (const t5_derived& x);

    virtual 
    ~t5_derived ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    a_sequence a_;
    b_sequence b_;
  };

  bool
  operator== (const t5_derived&, const t5_derived&);

  bool
  operator!= (const t5_derived&, const t5_derived&);


  class t6_base: public ::xml_schema::type
  {
    public:
    // text_content
    //
    typedef ::xml_schema::string text_content_type;
    typedef ::xsd::cxx::tree::sequence< text_content_type > text_content_sequence;
    typedef text_content_sequence::iterator text_content_iterator;
    typedef text_content_sequence::const_iterator text_content_const_iterator;

    static const ::std::size_t text_content_id = 1UL;

    const text_content_sequence&
    text_content () const;

    text_content_sequence&
    text_content ();

    void
    text_content (const text_content_sequence& s);

    // content_order
    //
    typedef ::xml_schema::content_order content_order_type;
    typedef ::std::vector< content_order_type > content_order_sequence;
    typedef content_order_sequence::iterator content_order_iterator;
    typedef content_order_sequence::const_iterator content_order_const_iterator;

    const content_order_sequence&
    content_order () const;

    content_order_sequence&
    content_order ();

    void
    content_order (const content_order_sequence& s);

    // Constructors.
    //
    t6_base ();

    t6_base (const ::xercesc::DOMElement& e,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    t6_base (const t6_base& x,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    virtual t6_base*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    virtual 
    ~t6_base ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    text_content_sequence text_content_;

    content_order_sequence content_order_;
  };

  bool
  operator== (const t6_base&, const t6_base&);

  bool
  operator!= (const t6_base&, const t6_base&);


  class t6_derived: public ::test::t6_base
  {
    public:
    // Constructors.
    //
    t6_derived ();

    t6_derived (const ::xercesc::DOMElement& e,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    t6_derived (const t6_derived& x,
                ::xml_schema::flags f = 0,
                ::xml_schema::container* c = 0);

    virtual t6_derived*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    virtual 
    ~t6_derived ();
  };

  class t7_type: public ::xml_schema::type
  {
    public:
    // any
    //
    typedef ::xsd::cxx::tree::element_sequence any_sequence;
    typedef any_sequence::iterator any_iterator;
    typedef any_sequence::const_iterator any_const_iterator;

    static const ::std::size_t any_id = 1UL;

    const any_sequence&
    any () const;

    any_sequence&
    any ();

    void
    any (const any_sequence& s);

    // text_content
    //
    typedef ::xml_schema::string text_content_type;
    typedef ::xsd::cxx::tree::sequence< text_content_type > text_content_sequence;
    typedef text_content_sequence::iterator text_content_iterator;
    typedef text_content_sequence::const_iterator text_content_const_iterator;

    static const ::std::size_t text_content_id = 2UL;

    const text_content_sequence&
    text_content () const;

    text_content_sequence&
    text_content ();

    void
    text_content (const text_content_sequence& s);

    // DOMDocument for wildcard content.
    //
    const ::xercesc::DOMDocument&
    dom_document () const;

    ::xercesc::DOMDocument&
    dom_document ();

    // content_order
    //
    typedef ::xml_schema::content_order content_order_type;
    typedef ::std::vector< content_order_type > content_order_sequence;
    typedef content_order_sequence::iterator content_order_iterator;
    typedef content_order_sequence::const_iterator content_order_const_iterator;

    const content_order_sequence&
    content_order () const;

    content_order_sequence&
    content_order ();

    void
    content_order (const content_order_sequence& s);

    // Constructors.
    //
    t7_type ();

    t7_type (const ::xercesc::DOMElement& e,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    t7_type (const t7_type& x,
             ::xml_schema::flags f = 0,
             ::xml_schema::container* c = 0);

    virtual t7_type*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    t7_type&
    operator= (const t7_type& x);

    virtual 
    ~t7_type ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    ::xml_schema::dom::auto_ptr< ::xercesc::DOMDocument > dom_document_;

    text_content_sequence text_content_;

    content_order_sequence content_order_;

    any_sequence any_;
  };

  bool
  operator== (const t7_type&, const t7_type&);

  bool
  operator!= (const t7_type&, const t7_type&);


  class root: public ::xml_schema::type
  {
    public:
    // t1
    //
    typedef ::test::t1_derived t1_type;
    typedef ::xsd::cxx::tree::sequence< t1_type > t1_sequence;
    typedef t1_sequence::iterator t1_iterator;
    typedef t1_sequence::const_iterator t1_const_iterator;
    typedef ::xsd::cxx::tree::traits< t1_type, char > t1_traits;

    const t1_sequence&
    t1 () const;

    t1_sequence&
    t1 ();

    void
    t1 (const t1_sequence& s);

    // t2
    //
    typedef ::test::t2_derived t2_type;
    typedef ::xsd::cxx::tree::sequence< t2_type > t2_sequence;
    typedef t2_sequence::iterator t2_iterator;
    typedef t2_sequence::const_iterator t2_const_iterator;
    typedef ::xsd::cxx::tree::traits< t2_type, char > t2_traits;

    const t2_sequence&
    t2 () const;

    t2_sequence&
    t2 ();

    void
    t2 (const t2_sequence& s);

    // t3
    //
    typedef ::test::t3_type t3_type;
    typedef ::xsd::cxx::tree::sequence< t3_type > t3_sequence;
    typedef t3_sequence::iterator t3_iterator;
    typedef t3_sequence::const_iterator t3_const_iterator;
    typedef ::xsd::cxx::tree::traits< t3_type, char > t3_traits;

    const t3_sequence&
    t3 () const;

    t3_sequence&
    t3 ();

    void
    t3 (const t3_sequence& s);

    // t4
    //
    typedef ::test::t4_derived t4_type;
    typedef ::xsd::cxx::tree::sequence< t4_type > t4_sequence;
    typedef t4_sequence::iterator t4_iterator;
    typedef t4_sequence::const_iterator t4_const_iterator;
    typedef ::xsd::cxx::tree::traits< t4_type, char > t4_traits;

    const t4_sequence&
    t4 () const;

    t4_sequence&
    t4 ();

    void
    t4 (const t4_sequence& s);

    // t5a
    //
    typedef ::test::t5_base t5a_type;
    typedef ::xsd::cxx::tree::sequence< t5a_type > t5a_sequence;
    typedef t5a_sequence::iterator t5a_iterator;
    typedef t5a_sequence::const_iterator t5a_const_iterator;
    typedef ::xsd::cxx::tree::traits< t5a_type, char > t5a_traits;

    const t5a_sequence&
    t5a () const;

    t5a_sequence&
    t5a ();

    void
    t5a (const t5a_sequence& s);

    // t5b
    //
    typedef ::test::t5_derived t5b_type;
    typedef ::xsd::cxx::tree::sequence< t5b_type > t5b_sequence;
    typedef t5b_sequence::iterator t5b_iterator;
    typedef t5b_sequence::const_iterator t5b_const_iterator;
    typedef ::xsd::cxx::tree::traits< t5b_type, char > t5b_traits;

    const t5b_sequence&
    t5b () const;

    t5b_sequence&
    t5b ();

    void
    t5b (const t5b_sequence& s);

    // t6
    //
    typedef ::test::t6_derived t6_type;
    typedef ::xsd::cxx::tree::sequence< t6_type > t6_sequence;
    typedef t6_sequence::iterator t6_iterator;
    typedef t6_sequence::const_iterator t6_const_iterator;
    typedef ::xsd::cxx::tree::traits< t6_type, char > t6_traits;

    const t6_sequence&
    t6 () const;

    t6_sequence&
    t6 ();

    void
    t6 (const t6_sequence& s);

    // t7
    //
    typedef ::test::t7_type t7_type;
    typedef ::xsd::cxx::tree::sequence< t7_type > t7_sequence;
    typedef t7_sequence::iterator t7_iterator;
    typedef t7_sequence::const_iterator t7_const_iterator;
    typedef ::xsd::cxx::tree::traits< t7_type, char > t7_traits;

    const t7_sequence&
    t7 () const;

    t7_sequence&
    t7 ();

    void
    t7 (const t7_sequence& s);

    // Constructors.
    //
    root ();

    root (const ::xercesc::DOMElement& e,
          ::xml_schema::flags f = 0,
          ::xml_schema::container* c = 0);

    root (const root& x,
          ::xml_schema::flags f = 0,
          ::xml_schema::container* c = 0);

    virtual root*
    _clone (::xml_schema::flags f = 0,
            ::xml_schema::container* c = 0) const;

    root&
    operator= (const root& x);

    virtual 
    ~root ();

    // Implementation.
    //
    protected:
    void
    parse (::xsd::cxx::xml::dom::parser< char >&,
           ::xml_schema::flags);

    protected:
    t1_sequence t1_;
    t2_sequence t2_;
    t3_sequence t3_;
    t4_sequence t4_;
    t5a_sequence t5a_;
    t5b_sequence t5b_;
    t6_sequence t6_;
    t7_sequence t7_;
  };

  bool
  operator== (const root&, const root&);

  bool
  operator!= (const root&, const root&);
}

#ifndef XSD_DONT_INCLUDE_INLINE

#endif // XSD_DONT_INCLUDE_INLINE

#include <iosfwd>

#include <xercesc/sax/InputSource.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMErrorHandler.hpp>

namespace test
{
  // Parse a URI or a local file.
  //

  ::std::auto_ptr< ::test::root >
  root_ (const ::std::string& uri,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (const ::std::string& uri,
         ::xml_schema::error_handler& eh,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (const ::std::string& uri,
         ::xercesc::DOMErrorHandler& eh,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  // Parse std::istream.
  //

  ::std::auto_ptr< ::test::root >
  root_ (::std::istream& is,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (::std::istream& is,
         ::xml_schema::error_handler& eh,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (::std::istream& is,
         ::xercesc::DOMErrorHandler& eh,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (::std::istream& is,
         const ::std::string& id,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (::std::istream& is,
         const ::std::string& id,
         ::xml_schema::error_handler& eh,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (::std::istream& is,
         const ::std::string& id,
         ::xercesc::DOMErrorHandler& eh,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  // Parse xercesc::InputSource.
  //

  ::std::auto_ptr< ::test::root >
  root_ (::xercesc::InputSource& is,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (::xercesc::InputSource& is,
         ::xml_schema::error_handler& eh,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (::xercesc::InputSource& is,
         ::xercesc::DOMErrorHandler& eh,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  // Parse xercesc::DOMDocument.
  //

  ::std::auto_ptr< ::test::root >
  root_ (const ::xercesc::DOMDocument& d,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());

  ::std::auto_ptr< ::test::root >
  root_ (::xml_schema::dom::auto_ptr< ::xercesc::DOMDocument > d,
         ::xml_schema::flags f = 0,
         const ::xml_schema::properties& p = ::xml_schema::properties ());
}

#include <iosfwd>

#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMErrorHandler.hpp>
#include <xercesc/framework/XMLFormatter.hpp>

#include <xsd/cxx/xml/dom/auto-ptr.hxx>

namespace test
{
  void
  operator<< (::xercesc::DOMElement&, const t1_base&);

  void
  operator<< (::xercesc::DOMElement&, const t1_interm&);

  void
  operator<< (::xercesc::DOMElement&, const t1_derived&);

  void
  operator<< (::xercesc::DOMElement&, const t2_base&);

  void
  operator<< (::xercesc::DOMAttr&, const t2_base&);

  void
  operator<< (::xml_schema::list_stream&,
              const t2_base&);

  void
  operator<< (::xercesc::DOMElement&, const t2_derived&);

  void
  operator<< (::xercesc::DOMElement&, const t3_type&);

  void
  operator<< (::xercesc::DOMElement&, const t4_base&);

  void
  operator<< (::xercesc::DOMElement&, const t4_derived&);

  void
  operator<< (::xercesc::DOMElement&, const t5_base&);

  void
  operator<< (::xercesc::DOMElement&, const t5_derived&);

  void
  operator<< (::xercesc::DOMElement&, const t6_base&);

  void
  operator<< (::xercesc::DOMElement&, const t6_derived&);

  void
  operator<< (::xercesc::DOMElement&, const t7_type&);

  void
  operator<< (::xercesc::DOMElement&, const root&);

  // Serialize to std::ostream.
  //

  void
  root_ (::std::ostream& os,
         const ::test::root& x, 
         const ::xml_schema::namespace_infomap& m = ::xml_schema::namespace_infomap (),
         const ::std::string& e = "UTF-8",
         ::xml_schema::flags f = 0);

  void
  root_ (::std::ostream& os,
         const ::test::root& x, 
         ::xml_schema::error_handler& eh,
         const ::xml_schema::namespace_infomap& m = ::xml_schema::namespace_infomap (),
         const ::std::string& e = "UTF-8",
         ::xml_schema::flags f = 0);

  void
  root_ (::std::ostream& os,
         const ::test::root& x, 
         ::xercesc::DOMErrorHandler& eh,
         const ::xml_schema::namespace_infomap& m = ::xml_schema::namespace_infomap (),
         const ::std::string& e = "UTF-8",
         ::xml_schema::flags f = 0);

  // Serialize to xercesc::XMLFormatTarget.
  //

  void
  root_ (::xercesc::XMLFormatTarget& ft,
         const ::test::root& x, 
         const ::xml_schema::namespace_infomap& m = ::xml_schema::namespace_infomap (),
         const ::std::string& e = "UTF-8",
         ::xml_schema::flags f = 0);

  void
  root_ (::xercesc::XMLFormatTarget& ft,
         const ::test::root& x, 
         ::xml_schema::error_handler& eh,
         const ::xml_schema::namespace_infomap& m = ::xml_schema::namespace_infomap (),
         const ::std::string& e = "UTF-8",
         ::xml_schema::flags f = 0);

  void
  root_ (::xercesc::XMLFormatTarget& ft,
         const ::test::root& x, 
         ::xercesc::DOMErrorHandler& eh,
         const ::xml_schema::namespace_infomap& m = ::xml_schema::namespace_infomap (),
         const ::std::string& e = "UTF-8",
         ::xml_schema::flags f = 0);

  // Serialize to an existing xercesc::DOMDocument.
  //

  void
  root_ (::xercesc::DOMDocument& d,
         const ::test::root& x,
         ::xml_schema::flags f = 0);

  // Serialize to a new xercesc::DOMDocument.
  //

  ::xml_schema::dom::auto_ptr< ::xercesc::DOMDocument >
  root_ (const ::test::root& x, 
         const ::xml_schema::namespace_infomap& m = ::xml_schema::namespace_infomap (),
         ::xml_schema::flags f = 0);
}

#ifndef XSD_DONT_INCLUDE_INLINE
#include "test.ixx"
#endif // XSD_DONT_INCLUDE_INLINE

#include <xsd/cxx/post.hxx>

// Begin epilogue.
//
//
// End epilogue.

#endif // CXX_WORK_XSD_4_0_0_XSD_TESTS_CXX_TREE_ORDER_TEST_HXX
