summaryrefslogtreecommitdiff
path: root/libxsd/xsd/cxx/tree/elements.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libxsd/xsd/cxx/tree/elements.hxx')
-rw-r--r--libxsd/xsd/cxx/tree/elements.hxx1865
1 files changed, 0 insertions, 1865 deletions
diff --git a/libxsd/xsd/cxx/tree/elements.hxx b/libxsd/xsd/cxx/tree/elements.hxx
deleted file mode 100644
index 808b35e..0000000
--- a/libxsd/xsd/cxx/tree/elements.hxx
+++ /dev/null
@@ -1,1865 +0,0 @@
-// file : xsd/cxx/tree/elements.hxx
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-/**
- * @file
- *
- * @brief Contains C++ class definitions for XML Schema anyType and
- * anySimpleType types as well as supporting code.
- *
- * This is an internal header and is included by the generated code. You
- * normally should not include it directly.
- *
- */
-
-#ifndef XSD_CXX_TREE_ELEMENTS_HXX
-#define XSD_CXX_TREE_ELEMENTS_HXX
-
-#include <xsd/cxx/config.hxx> // XSD_AUTO_PTR, XSD_CXX11
-
-#include <map>
-#include <string>
-#include <memory> // std::auto_ptr/unique_ptr
-#include <cstddef> // std::size_t
-#include <istream>
-#include <sstream>
-#include <cassert>
-
-#ifdef XSD_CXX11
-# include <utility> // std::move
-#endif
-
-#include <xercesc/dom/DOMNode.hpp>
-#include <xercesc/dom/DOMAttr.hpp>
-#include <xercesc/dom/DOMElement.hpp>
-#include <xercesc/dom/DOMDocument.hpp>
-#include <xercesc/dom/DOMNamedNodeMap.hpp>
-
-#include <xercesc/util/XercesVersion.hpp>
-
-#include <xsd/cxx/xml/elements.hxx> // xml::properties
-#include <xsd/cxx/xml/dom/auto-ptr.hxx> // dom::auto_ptr/unique_ptr
-#include <xsd/cxx/xml/dom/wildcard-source.hxx> // dom::create_document()
-
-#include <xsd/cxx/tree/facet.hxx>
-#include <xsd/cxx/tree/exceptions.hxx>
-#include <xsd/cxx/tree/istream-fwd.hxx>
-#include <xsd/cxx/tree/containers-wildcard.hxx>
-
-#if _XERCES_VERSION < 30000
-# error Xerces-C++ 2-series is not supported
-#endif
-
-namespace xsd
-{
- namespace cxx
- {
- /**
- * @brief C++/Tree mapping runtime namespace.
- *
- * This is an internal namespace and normally should not be referenced
- * directly. Instead you should use the aliases for types in this
- * namespaces that are created in the generated code.
- *
- */
- namespace tree
- {
- /**
- * @brief Parsing and %serialization %flags.
- *
- * Flags are used to modify the default behavior of %parsing and
- * %serialization functions as well as %parsing constructors.
- *
- * @nosubgrouping
- */
- class flags
- {
- public:
- /**
- * @name Flag constants
- */
- //@{
-
- /**
- * @brief Keep DOM association in the resulting tree.
- */
- static const unsigned long keep_dom = 0x00000100UL;
-
- /**
- * @brief Assume ownership of the DOM document.
- *
- * This flag only makes sense together with the @c keep_dom
- * flag in the call to the %parsing function with the
- * @c dom::auto_ptr/unique_ptr\<DOMDocument> argument.
- *
- */
- static const unsigned long own_dom = 0x00000200UL;
-
- /**
- * @brief Turn off XML Schema validation in the underlying XML
- * parser.
- */
- static const unsigned long dont_validate = 0x00000400UL;
-
- /**
- * @brief Extract XML content for anyType or anySimpleType.
- * Normally you don't need to specify this flag explicitly.
- */
- static const unsigned long extract_content = 0x00000800UL;
-
- /**
- * @brief Do not initialize the Xerces-C++ runtime.
- */
- static const unsigned long dont_initialize = 0x00000001UL;
-
- /**
- * @brief Do not write XML declaration during %serialization.
- */
- static const unsigned long no_xml_declaration = 0x00010000UL;
-
- /**
- * @brief Do not add extra spaces or new lines that make the
- * resulting XML easier to read.
- */
- static const unsigned long dont_pretty_print = 0x00020000UL;
-
- //@cond
-
- // The following flags are for internal use.
- //
- static const unsigned long base = 0x01000000UL;
-
- //@endcond
-
- // Notes on flag blocks:
- //
- // 0x000000FF - common (applicable to both parsing and serialization)
- // 0x0000FF00 - parsing (values aligned with XML parsing)
- // 0x00FF0000 - serialization (values aligned with XML serialization)
- // 0xFF000000 - internal
-
- //@}
-
- public:
- /**
- * @brief Initialize an instance with an integer value.
- *
- * @param x A %flags value as an integer.
- */
- flags (unsigned long x = 0)
- : x_ (x)
- {
- }
-
- /**
- * @brief Convert an instance to an integer value.
- *
- * @return An integer %flags value.
- */
- operator unsigned long () const
- {
- return x_;
- }
-
- /**
- * @brief Combine two %flags.
- *
- * @return A %flags object that is a combination of the arguments.
- */
- friend flags
- operator| (const flags& a, const flags& b)
- {
- return flags (a.x_ | b.x_);
- }
-
- /**
- * @brief Combine two %flags.
- *
- * @return A %flags object that is a combination of the arguments.
- */
- friend flags
- operator| (const flags& a, unsigned long b)
- {
- return flags (a.x_ | b);
- }
-
- /**
- * @brief Combine two %flags.
- *
- * @return A %flags object that is a combination of the arguments.
- */
- friend flags
- operator| (unsigned long a, const flags& b)
- {
- return flags (a | b.x_);
- }
-
- private:
- unsigned long x_;
- };
-
- // Parsing properties. Refer to xsd/cxx/xml/elements.hxx for XML-
- // related properties.
- //
- template <typename C>
- class properties: public xml::properties<C>
- {
- };
-
- /**
- * @brief Content order sequence entry.
- *
- * @nosubgrouping
- */
- struct content_order
- {
- /**
- * @brief Initialize an instance with passed id and index.
- *
- * @param id Content id.
- * @param index Content index in the corresponding sequence.
- */
- content_order (std::size_t id, std::size_t index = 0)
- : id (id), index (index)
- {
- }
-
- /**
- * @brief Content id.
- */
- std::size_t id;
-
- /**
- * @brief Content index.
- */
- std::size_t index;
- };
-
- bool
- operator== (const content_order&, const content_order&);
-
- bool
- operator!= (const content_order&, const content_order&);
-
- bool
- operator< (const content_order&, const content_order&);
-
- //@cond
-
- // DOM user data keys.
- //
- template <int dummy>
- struct user_data_keys_template
- {
- // Back pointers to tree nodes.
- //
- static const XMLCh node[21];
- };
-
- typedef user_data_keys_template<0> user_data_keys;
-
- //
- //
- struct identity
- {
- virtual
- ~identity ()
- {
- }
-
- identity ()
- {
- }
-
- virtual bool
- before (const identity&) const = 0;
-
- virtual void
- throw_duplicate_id () const = 0;
-
- private:
- identity (const identity&);
-
- identity&
- operator= (const identity&);
- };
-
- //@endcond
-
-
- // anyType. VC++ has a name injection bug that makes it impossible
- // to have a member with the same name as a base type. To address
- // that we will have to choose some unique name for the definition
- // and typedef it to 'type'.
- //
- class _type;
-
- /**
- * @brief Class corresponding to the XML Schema anyType built-in type.
- *
- */
- typedef _type type;
-
- /**
- * @brief Container type.
- *
- */
- typedef _type container;
-
- /**
- * @brief Class corresponding to the XML Schema anyType built-in type.
- *
- * This class is a base for every generated and built-in type in the
- * C++/Tree mapping.
- *
- * @nosubgrouping
- */
- class _type
- {
- public:
- virtual
- ~_type ()
- {
- // Everything should have been unregistered by now.
- //
- assert (map_.get () == 0 || map_->size () == 0);
- }
-
- public:
- /**
- * @name Constructors
- */
- //@{
-
- /**
- * @brief Default constructor.
- */
- _type ();
-
- /**
- * @brief Create an instance from a C string.
- *
- * @param s A string to initialize the instance with.
- *
- * Note that this constructor ignores the string and creates an
- * empty anyType instance. In particular, it will not convert the
- * string into DOM content. The purpose of such a strange constructor
- * is to allow statically-initialized default values of anyType type.
- */
- template <typename C>
- explicit
- _type (const C* s);
-
- public:
- /**
- * @brief Copy constructor.
- *
- * @param x An instance to make a copy of.
- * @param f Flags to create the copy with.
- * @param c A pointer to the object that will contain the copy.
- *
- * For polymorphic object models use the @c _clone function instead.
- */
- _type (const type& x, flags f = 0, container* c = 0);
-
- /**
- * @brief Copy the instance polymorphically.
- *
- * @param f Flags to create the copy with.
- * @param c A pointer to the object that will contain the copy.
- * @return A pointer to the dynamically allocated copy.
- *
- * This function ensures that the dynamic type of the instance
- * is used for copying and should be used for polymorphic object
- * models instead of the copy constructor.
- */
- virtual type*
- _clone (flags f = 0, container* c = 0) const
- {
- return new type (*this, f, c);
- }
-
- public:
- /**
- * @brief Create an instance from a data representation
- * stream.
- *
- * @param s A stream to extract the data from.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- template <typename S>
- _type (istream<S>& s, flags f = 0, container* c = 0);
-
- /**
- * @brief Create an instance from a DOM element.
- *
- * @param e A DOM element to extract the data from.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- _type (const xercesc::DOMElement& e,
- flags f = flags::extract_content,
- container* c = 0);
-
- /**
- * @brief Create an instance from a DOM Attribute.
- *
- * @param a A DOM attribute to extract the data from.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- _type (const xercesc::DOMAttr& a, flags f = 0, container* c = 0);
-
- /**
- * @brief Create an instance from a %string fragment.
- *
- * @param s A %string fragment to extract the data from.
- * @param e A pointer to DOM element containing the %string fragment.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- template <typename C>
- _type (const std::basic_string<C>& s,
- const xercesc::DOMElement* e,
- flags f = 0,
- container* c = 0);
- //@}
-
- public:
- /**
- * @brief Copy assignment operator.
- *
- * @param x An instance to assign.
- * @return A reference to the instance.
- */
- type&
- operator= (const type& x)
- {
- if (this != &x)
- {
- if (x.content_.get () == 0)
- content_.reset ();
- else
- content_ = x.content_->clone ();
-
- // Drop DOM association.
- //
- dom_info_.reset ();
- }
-
- return *this;
- }
-
- // anyType content API.
- //
- public:
- typedef element_optional dom_content_optional;
-
- /**
- * @brief Return a read-only (constant) reference to the anyType
- * DOM content.
- *
- * @return A constant reference to the optional container.
- *
- * The DOM content is returned as an optional element container,
- * the same container as used for optional element wildcards.
- */
- const dom_content_optional&
- dom_content () const;
-
- /**
- * @brief Return a read-write reference to the anyType DOM content.
- *
- * @return A reference to the optional container.
- *
- * The DOM content is returned as an optional element container,
- * the same container as used for optional element wildcards.
- */
- dom_content_optional&
- dom_content ();
-
- /**
- * @brief Set the anyType DOM content.
- *
- * @param e A new element to set.
- *
- * This function makes a copy of its argument and sets it as the
- * new DOM content.
- */
- void
- dom_content (const xercesc::DOMElement& e);
-
- /**
- * @brief Set the anyType DOM content.
- *
- * @param e A new element to use.
- *
- * This function will use the passed element directly instead
- * of making a copy. For this to work the element should belong
- * to the DOM document associated with this anyType instance.
- *
- * @see dom_content_document
- */
- void
- dom_content (xercesc::DOMElement* e);
-
- /**
- * @brief Set the anyType DOM content.
- *
- * @param d An optional container with the new element to set.
- *
- * If the element is present in @a d then this function makes a
- * copy of this element and sets it as the new wildcard content.
- * Otherwise the element container is set the 'not present' state.
- */
- void
- dom_content (const dom_content_optional& d);
-
- /**
- * @brief Return a read-only (constant) reference to the DOM
- * document associated with this anyType instance.
- *
- * @return A constant reference to the DOM document.
- *
- * The DOM document returned by this function is used to store
- * the raw XML content corresponding to the anyType instance.
- */
- const xercesc::DOMDocument&
- dom_content_document () const;
-
- /**
- * @brief Return a read-write reference to the DOM document
- * associated with this anyType instance.
- *
- * @return A reference to the DOM document.
- *
- * The DOM document returned by this function is used to store
- * the raw XML content corresponding to the anyType instance.
- */
- xercesc::DOMDocument&
- dom_content_document ();
-
- /**
- * @brief Check for absence of DOM (anyType) and text (anySimpleType)
- * content.
- *
- * @return True if there is no content and false otherwise.
- *
- * This is an optimization function that allows us to check for the
- * lack of content without actually creating its empty representation
- * (that is, empty DOM document for DOM or empty string for text).
- */
- bool
- null_content () const;
-
- //
- //
- public:
- /**
- * @brief Comparison operator. It uses DOM (anyType) or text
- * (anySimpleType) content if present. If the content is missing
- * then the types are assumed unequal.
- *
- * @return True if the instances are equal, false otherwise.
- */
- friend bool
- operator== (const type& x, const type& y)
- {
- return x.content_.get () != 0 &&
- x.content_->compare (y.content_.get ());
- }
-
- /**
- * @brief Comparison operator. It uses DOM (anyType) or text
- * (anySimpleType) content if present. If the content is missing
- * then the types are assumed unequal.
- *
- * @return True if the instances are not equal, false otherwise.
- */
- friend bool
- operator!= (const type& x, const type& y) {return !(x == y);}
-
- // Container API.
- //
- public:
- /**
- * @brief Get a constant pointer to container, an object model
- * node that contains this instance.
- *
- * @return A constant pointer to container, or 0 if this instance
- * is not contained.
- */
- const container*
- _container () const
- {
- return container_;
- }
-
- /**
- * @brief Get a pointer to container, an object model node that
- * contains this instance.
- *
- * @return A pointer to container, or 0 if this instance is not
- * contained.
- */
- container*
- _container ()
- {
- return container_;
- }
-
- /**
- * @brief Set this instance's new container, an object model node
- * that contains this instance.
- *
- * @param c A pointer to container.
- */
- virtual void
- _container (container* c)
- {
- container* dr (0);
-
- if (c != 0)
- {
- dr = c->_root ();
-
- if (dr == 0)
- dr = c;
- }
-
- XSD_AUTO_PTR<map>& m (dr ? dr->map_ : map_);
-
- if (container_ == 0)
- {
- if (c != 0 && map_.get () != 0)
- {
- // Transfer our IDs to the new root.
- //
- if (m.get () != 0)
- {
- m->insert (map_->begin (), map_->end ());
- map_.reset ();
- }
- else
- {
-#ifdef XSD_CXX11
- m = std::move (map_);
-#else
- m = map_;
-#endif
- }
- }
- }
- else
- {
- container* sr (_root ());
-
- if (sr->map_.get () != 0)
- {
- // Transfer IDs that belong to this subtree.
- //
- for (map::iterator i (sr->map_->begin ()), e (sr->map_->end ());
- i != e;)
- {
- type* x (i->second);
- for (; x != this && x != sr; x = x->_container ()) ;
-
- if (x != sr)
- {
- // Part of our subtree.
- //
- if (m.get () == 0)
- m.reset (new map);
-
- m->insert (*i);
- sr->map_->erase (i++);
- }
- else
- ++i;
- }
- }
- }
-
- container_ = c;
- }
-
- /**
- * @brief Get a constant pointer to object model's root node.
- *
- * @return A constant pointer to root node, or 0 if this instance
- * is not contained.
- */
- const container*
- _root () const
- {
- const container* r (container_);
-
- for (const container* c (r); c != 0; c = c->container_)
- r = c;
-
- return r;
- }
-
- /**
- * @brief Get a pointer to object model's root node.
- *
- * @return A pointer to root node, or 0 if this instance is not
- * contained.
- */
- container*
- _root ()
- {
- container* r (container_);
-
- for (container* c (r); c != 0; c = c->container_)
- r = c;
-
- return r;
- }
-
- // DOM association.
- //
- public:
- /**
- * @brief Get a constant pointer to a DOM node associated with
- * this object model node.
- *
- * @return A constant pointer to DOM node, or 0 if none associated.
- */
- const xercesc::DOMNode*
- _node () const
- {
- return dom_info_.get () ? dom_info_->node() : 0;
- }
-
- /**
- * @brief Get a pointer to a DOM node associated with this object
- * model node.
- *
- * @return A pointer to DOM node, or 0 if none associated.
- */
- xercesc::DOMNode*
- _node ()
- {
- return dom_info_.get () ? dom_info_->node () : 0;
- }
-
- /**
- * @brief Exception indicating that a DOM node cannot be associated
- * with an object model node.
- */
- class bad_dom_node_type: public std::exception //@@ Inherit exception<C>.
- {
- public:
- /**
- * @brief Get %exception description.
- *
- * @return A C %string describing the %exception.
- */
- virtual const char*
- what () const throw ()
- {
- return "DOM node is not an attribute node or element node";
- }
- };
-
- /**
- * @brief Manually set a DOM node associated with this object
- * model node.
- *
- * The DOM node should be a child of the parent's DOM node. If
- * this object model node is a root of the tree, then it will
- * assume the ownership of the whole DOM document to which this
- * DOM node belongs.
- *
- * @param n A pointer to DOM node (should be either an element or
- * an attribute).
- */
- void
- _node (xercesc::DOMNode* n)
- {
- switch (n->getNodeType ())
- {
- case xercesc::DOMNode::ELEMENT_NODE:
- {
- if (container_ != 0)
- {
- assert (_root ()->_node () != 0);
- assert (_root ()->_node ()->getOwnerDocument () ==
- n->getOwnerDocument ());
- }
-
- dom_info_ =
- dom_info_factory::create (
- *static_cast<xercesc::DOMElement*> (n),
- *this,
- container_ == 0);
-
- break;
- }
- case xercesc::DOMNode::ATTRIBUTE_NODE:
- {
- assert (container_ != 0);
- assert (_root ()->_node () != 0);
- assert (_root ()->_node ()->getOwnerDocument () ==
- n->getOwnerDocument ());
-
- dom_info_ =
- dom_info_factory::create (
- *static_cast<xercesc::DOMAttr*> (n),
- *this);
-
- break;
- }
- default:
- {
- throw bad_dom_node_type ();
- }
- }
- }
-
- public:
- //@cond
-
- void
- _register_id (const identity& i, type* t)
- {
- // We should be the root.
- //
- assert (container_ == 0);
-
- if (map_.get () == 0)
- map_.reset (new map);
-
- if (!map_->insert (
- std::pair<const identity*, type*> (&i, t)).second)
- {
- i.throw_duplicate_id ();
- }
- }
-
- //@@ Does not inherit from exception<C>.
- //
- struct not_registered: std::exception
- {
- virtual const char*
- what () const throw ()
- {
- return "attempt to unregister non-existent id";
- }
- };
-
- void
- _unregister_id (const identity& id)
- {
- // We should be the root.
- //
- assert (container_ == 0);
-
- if (map_.get () == 0 || map_->erase (&id) == 0)
- throw not_registered ();
- }
-
- type*
- _lookup_id (const identity& id) const
- {
- if (map_.get ())
- {
- map::const_iterator it (map_->find (&id));
-
- if (it != map_->end ())
- return it->second;
- }
-
- return 0;
- }
-
- //@endcond
-
- private:
- //@cond
-
- struct dom_info
- {
- virtual
- ~dom_info () {}
-
- dom_info () {}
-
- virtual XSD_AUTO_PTR<dom_info>
- clone (type& tree_node, container*) const = 0;
-
- virtual xercesc::DOMNode*
- node () = 0;
-
- private:
- dom_info (const dom_info&);
- dom_info& operator= (const dom_info&);
- };
-
- struct dom_element_info: public dom_info
- {
- dom_element_info (xercesc::DOMElement& e, type& n, bool root)
- : e_ (e)
- {
- e_.setUserData (user_data_keys::node, &n, 0);
-
- if (root)
- {
- // The caller should have associated a dom::auto/unique_ptr
- // object that owns this document with the document node
- // using the xml_schema::dom::tree_node_key key.
- //
- XSD_DOM_AUTO_PTR<xercesc::DOMDocument>* pd (
- reinterpret_cast<XSD_DOM_AUTO_PTR<xercesc::DOMDocument>*> (
- e.getOwnerDocument ()->getUserData (user_data_keys::node)));
-
- assert (pd != 0);
- assert (pd->get () == e.getOwnerDocument ());
-
- // Transfer ownership.
-#ifdef XSD_CXX11
- doc_ = std::move (*pd);
-#else
- doc_ = *pd;
-#endif
- }
- }
-
- virtual XSD_AUTO_PTR<dom_info>
- clone (type& tree_node, container* c) const
- {
- // Check if we are a document root.
- //
- if (c == 0)
- {
- // We preserver DOM associations only in complete
- // copies from root.
- //
- return XSD_AUTO_PTR<dom_info> (
- doc_.get () == 0
- ? 0
- : new dom_element_info (*doc_, tree_node));
- }
-
- // Check if our container does not have DOM association (e.g.,
- // because it wasn't a complete copy of the tree).
- //
- using xercesc::DOMNode;
-
- DOMNode* cn (c->_node ());
-
- if (cn == 0)
- return XSD_AUTO_PTR<dom_info> ();
-
- // Now we are going to find the corresponding element in
- // the new tree.
- //
- {
- using xercesc::DOMElement;
-
- DOMNode& pn (*e_.getParentNode ());
- assert (pn.getNodeType () == DOMNode::ELEMENT_NODE);
-
- DOMNode* sn (pn.getFirstChild ()); // Source.
- DOMNode* dn (cn->getFirstChild ()); // Destination.
-
- // We should have at least one child.
- //
- assert (sn != 0);
-
- // Move in parallel until we get to the needed node.
- //
- for (; sn != 0 && !e_.isSameNode (sn);)
- {
- sn = sn->getNextSibling ();
- dn = dn->getNextSibling ();
- }
-
- // e_ should be on the list.
- //
- assert (sn != 0);
-
- assert (dn->getNodeType () == DOMNode::ELEMENT_NODE);
-
- return XSD_AUTO_PTR<dom_info> (
- new dom_element_info (static_cast<DOMElement&> (*dn),
- tree_node,
- false));
- }
- }
-
- virtual xercesc::DOMNode*
- node ()
- {
- return &e_;
- }
-
- private:
- dom_element_info (const xercesc::DOMDocument& d, type& n)
- : doc_ (static_cast<xercesc::DOMDocument*> (
- d.cloneNode (true))),
- e_ (*doc_->getDocumentElement ())
- {
- e_.setUserData (user_data_keys::node, &n, 0);
- }
-
- private:
- XSD_DOM_AUTO_PTR<xercesc::DOMDocument> doc_;
- xercesc::DOMElement& e_;
- };
-
-
- struct dom_attribute_info: public dom_info
- {
- dom_attribute_info (xercesc::DOMAttr& a, type& n)
- : a_ (a)
- {
- a_.setUserData (user_data_keys::node, &n, 0);
- }
-
- virtual XSD_AUTO_PTR<dom_info>
- clone (type& tree_node, container* c) const
- {
- // Check if we are a document root.
- //
- if (c == 0)
- {
- // We preserver DOM associations only in complete
- // copies from root.
- //
- return XSD_AUTO_PTR<dom_info> ();
- }
-
- // Check if our container does not have DOM association (e.g.,
- // because it wasn't a complete copy of the tree).
- //
- using xercesc::DOMNode;
-
- DOMNode* cn (c->_node ());
-
- if (cn == 0)
- return XSD_AUTO_PTR<dom_info> ();
-
- // We are going to find the corresponding attribute in
- // the new tree.
- //
- using xercesc::DOMAttr;
- using xercesc::DOMElement;
- using xercesc::DOMNamedNodeMap;
-
- DOMElement& p (*a_.getOwnerElement ());
- DOMNamedNodeMap& nl (*p.getAttributes ());
-
- XMLSize_t size (nl.getLength ()), i (0);
-
- // We should have at least one child.
- //
- assert (size != 0);
-
- for ( ;i < size && !a_.isSameNode (nl.item (i)); ++i)/*noop*/;
-
- // a_ should be in the list.
- //
- assert (i < size);
-
- DOMNode& n (*cn->getAttributes ()->item (i));
- assert (n.getNodeType () == DOMNode::ATTRIBUTE_NODE);
-
- return XSD_AUTO_PTR<dom_info> (
- new dom_attribute_info (static_cast<DOMAttr&> (n), tree_node));
- }
-
- virtual xercesc::DOMNode*
- node ()
- {
- return &a_;
- }
-
- private:
- xercesc::DOMAttr& a_;
- };
-
- // For Sun C++ 5.6.
- //
- struct dom_info_factory;
- friend struct _type::dom_info_factory;
-
- struct dom_info_factory
- {
- static XSD_AUTO_PTR<dom_info>
- create (const xercesc::DOMElement& e, type& n, bool root)
- {
- return XSD_AUTO_PTR<dom_info> (
- new dom_element_info (
- const_cast<xercesc::DOMElement&> (e), n, root));
- }
-
- static XSD_AUTO_PTR<dom_info>
- create (const xercesc::DOMAttr& a, type& n)
- {
- return XSD_AUTO_PTR<dom_info> (
- new dom_attribute_info (
- const_cast<xercesc::DOMAttr&> (a), n));
- }
- };
-
- //@endcond
-
- XSD_AUTO_PTR<dom_info> dom_info_;
-
-
- // ID/IDREF map.
- //
- private:
-
- //@cond
-
- struct identity_comparator
- {
- bool operator () (const identity* x, const identity* y) const
- {
- return x->before (*y);
- }
- };
-
- //@endcond
-
- typedef
- std::map<const identity*, type*, identity_comparator>
- map;
-
- XSD_AUTO_PTR<map> map_;
-
- // anyType and anySimpleType content.
- //
- protected:
-
- //@cond
-
- struct content_type
- {
- virtual
- ~content_type () {}
-
- content_type () {}
-
- virtual XSD_AUTO_PTR<content_type>
- clone () const = 0;
-
- virtual bool
- compare (const content_type*) const = 0;
-
- private:
- content_type (const content_type&);
- content_type& operator= (const content_type&);
- };
-
- struct dom_content_type: content_type
- {
- dom_content_type ()
- : doc (xml::dom::create_document<char> ()), dom (*doc) {}
-
- explicit
- dom_content_type (const xercesc::DOMElement& e)
- : doc (xml::dom::create_document<char> ()), dom (e, *doc) {}
-
- explicit
- dom_content_type (xercesc::DOMElement* e)
- : doc (xml::dom::create_document<char> ()), dom (e, *doc) {}
-
- explicit
- dom_content_type (const dom_content_optional& d)
- : doc (xml::dom::create_document<char> ()), dom (d, *doc) {}
-
- virtual XSD_AUTO_PTR<content_type>
- clone () const
- {
- return XSD_AUTO_PTR<content_type> (new dom_content_type (dom));
- }
-
- virtual bool
- compare (const content_type* c) const
- {
- if (const dom_content_type* dc =
- dynamic_cast<const dom_content_type*> (c))
- return dom == dc->dom;
-
- return false;
- }
-
- public:
- XSD_DOM_AUTO_PTR<xercesc::DOMDocument> doc;
- dom_content_optional dom;
- };
-
- //@endcond
-
- mutable XSD_AUTO_PTR<content_type> content_;
-
- private:
- container* container_;
- };
-
- /**
- * @brief Class corresponding to the XML Schema anySimpleType built-in
- * type.
- *
- * @nosubgrouping
- */
- template <typename C, typename B>
- class simple_type: public B
- {
- public:
- /**
- * @name Constructors
- */
- //@{
-
- /**
- * @brief Default constructor.
- */
- simple_type ();
-
- /**
- * @brief Create an instance from a C string.
- *
- * @param s A string to initialize the instance with.
- */
- simple_type (const C* s);
-
- /**
- * @brief Create an instance from a string.
- *
- * @param s A string to initialize the instance with.
- */
- simple_type (const std::basic_string<C>& s);
-
- public:
- /**
- * @brief Copy constructor.
- *
- * @param x An instance to make a copy of.
- * @param f Flags to create the copy with.
- * @param c A pointer to the object that will contain the copy.
- *
- * For polymorphic object models use the @c _clone function instead.
- */
- simple_type (const simple_type& x, flags f = 0, container* c = 0);
-
- /**
- * @brief Copy the instance polymorphically.
- *
- * @param f Flags to create the copy with.
- * @param c A pointer to the object that will contain the copy.
- * @return A pointer to the dynamically allocated copy.
- *
- * This function ensures that the dynamic type of the instance
- * is used for copying and should be used for polymorphic object
- * models instead of the copy constructor.
- */
- virtual simple_type*
- _clone (flags f = 0, container* c = 0) const;
-
- public:
- /**
- * @brief Create an instance from a data representation
- * stream.
- *
- * @param s A stream to extract the data from.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- template <typename S>
- simple_type (istream<S>& s,
- flags f = flags::extract_content,
- container* c = 0);
-
- /**
- * @brief Create an instance from a DOM element.
- *
- * @param e A DOM element to extract the data from.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- simple_type (const xercesc::DOMElement& e,
- flags f = flags::extract_content,
- container* c = 0);
-
- /**
- * @brief Create an instance from a DOM Attribute.
- *
- * @param a A DOM attribute to extract the data from.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- simple_type (const xercesc::DOMAttr& a,
- flags f = flags::extract_content,
- container* c = 0);
-
- /**
- * @brief Create an instance from a %string fragment.
- *
- * @param s A %string fragment to extract the data from.
- * @param e A pointer to DOM element containing the %string fragment.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- simple_type (const std::basic_string<C>& s,
- const xercesc::DOMElement* e,
- flags f = flags::extract_content,
- container* c = 0);
- //@}
-
- // anySimpleType content API.
- //
- public:
- /**
- * @brief Return a read-only (constant) reference to the anySimpleType
- * text content.
- *
- * @return A constant reference to the text string.
- */
- const std::basic_string<C>&
- text_content () const;
-
- /**
- * @brief Return a read-write reference to the anySimpleType text
- * content.
- *
- * @return A reference to the text string.
- */
- std::basic_string<C>&
- text_content ();
-
- /**
- * @brief Set the anySimpleType text content.
- *
- * @param t A new text string to set.
- */
- void
- text_content (const std::basic_string<C>& t);
-
- protected:
- //@cond
-
- typedef typename B::content_type content_type;
-
- struct text_content_type: content_type
- {
- text_content_type () {}
-
- explicit
- text_content_type (const std::basic_string<C>& t): text (t) {}
-
- explicit
- text_content_type (const C* t): text (t) {}
-
- virtual XSD_AUTO_PTR<content_type>
- clone () const
- {
- return XSD_AUTO_PTR<content_type> (new text_content_type (text));
- }
-
- virtual bool
- compare (const content_type* c) const
- {
- if (const text_content_type* tc =
- dynamic_cast<const text_content_type*> (c))
- return text == tc->text;
-
- return false;
- }
-
- public:
- // It would have been more elegant to store text content as DOMText.
- // However, that would require Xerces-C++ initialization. Also
- // having a separate DOMDocument for each text node seems like
- // an overkill.
- //
- std::basic_string<C> text;
- };
-
- //@endcond
- };
-
-
- /**
- * @brief Base class for element types.
- *
- * This class is a base for every generated element type.
- *
- * @nosubgrouping
- */
- template <typename C, typename T>
- class element_type
- {
- public:
- virtual
- ~element_type ()
- {
- }
-
- /**
- * @brief Copy the instance polymorphically.
- *
- * @param f Flags to create the copy with.
- * @return A pointer to the dynamically allocated copy.
- *
- * This function ensures that the dynamic type of the instance
- * is used for copying and should be used for polymorphic object
- * models instead of the copy constructor.
- */
- virtual element_type*
- _clone (flags f = 0) const = 0;
-
- /**
- * @brief Return the element name.
- *
- * @return A read-only string reference containing the element
- * name.
- */
- virtual const std::basic_string<C>&
- _name () const = 0;
-
- /**
- * @brief Return the element namespace.
- *
- * @return A read-only string reference containing the element
- * namespace. Empty string is returned if the element is
- * unqualified.
- */
- virtual const std::basic_string<C>&
- _namespace () const = 0;
-
- /**
- * @brief Return the element value.
- *
- * @return A pointer to the element value or 0 if the element
- * is of a fundamental type.
- */
- virtual T*
- _value () = 0;
-
- /**
- * @brief Return the element value.
- *
- * @return A read-only pointer to the element value or 0 if the
- * element is of a fundamental type.
- */
- virtual const T*
- _value () const = 0;
- };
-
-
- //@cond
-
- // Extra schema type id to disambiguate certain cases where
- // different XML Schema types (e.g., double and decimal) are
- // mapped to the same fundamental C++ type (e.g., double).
- //
- struct schema_type
- {
- enum value
- {
- other,
- double_,
- decimal
- };
- };
-
- //@endcond
-
-
- //@cond
- template <typename T,
- typename C,
- schema_type::value ST = schema_type::other>
- struct traits
- {
- typedef T type;
-
- static XSD_AUTO_PTR<T>
- create (const xercesc::DOMElement& e, flags f, container* c)
- {
- return XSD_AUTO_PTR<T> (new T (e, f, c));
- }
-
- static XSD_AUTO_PTR<T>
- create (const xercesc::DOMAttr& a, flags f, container* c)
- {
- return XSD_AUTO_PTR<T> (new T (a, f, c));
- }
-
- static XSD_AUTO_PTR<T>
- create (const std::basic_string<C>& s,
- const xercesc::DOMElement* e,
- flags f,
- container* c)
- {
- return XSD_AUTO_PTR<T> (new T (s, e, f, c));
- }
-
- // For now for istream we only go through traits for non-
- // fundamental types.
- //
- template <typename S>
- static XSD_AUTO_PTR<T>
- create (istream<S>& s, flags f, container* c)
- {
- return XSD_AUTO_PTR<T> (new T (s, f, c));
- }
- };
-
- template <typename B,
- typename C,
- schema_type::value ST>
- struct traits<simple_type<C, B>, C, ST>
- {
- typedef simple_type<C, B> type;
-
- static XSD_AUTO_PTR<type>
- create (const xercesc::DOMElement& e, flags f, container* c)
- {
- return XSD_AUTO_PTR<type> (
- new type (e, f | flags::extract_content, c));
- }
-
- static XSD_AUTO_PTR<type>
- create (const xercesc::DOMAttr& a, flags f, container* c)
- {
- return XSD_AUTO_PTR<type> (
- new type (a, f | flags::extract_content, c));
- }
-
- static XSD_AUTO_PTR<type>
- create (const std::basic_string<C>& s,
- const xercesc::DOMElement* e,
- flags f,
- container* c)
- {
- return XSD_AUTO_PTR<type> (
- new type (s, e, f | flags::extract_content, c));
- }
-
- template <typename S>
- static XSD_AUTO_PTR<type>
- create (istream<S>& s, flags f, container* c)
- {
- return XSD_AUTO_PTR<type> (
- new type (s, f | flags::extract_content, c));
- }
- };
- //@endcond
-
-
- /**
- * @brief Class template that emulates inheritance from a
- * fundamental C++ type.
- *
- * @nosubgrouping
- */
- template <typename T,
- typename C,
- typename B,
- schema_type::value ST = schema_type::other>
- class fundamental_base: public B
- {
- public:
- /**
- * @name Constructors
- */
- //@{
-
- /**
- * @brief Default constructor.
- */
- fundamental_base ()
- : facet_table_ (0), x_ ()
- {
- }
-
- /**
- * @brief Initialize an instance with an underlying type value.
- *
- * @param x An underlying type value.
- */
- fundamental_base (T x)
- : facet_table_ (0), x_ (x)
- {
- }
-
- public:
- /**
- * @brief Copy constructor.
- *
- * @param x An instance to make a copy of.
- * @param f Flags to create the copy with.
- * @param c A pointer to the object that will contain the copy.
- *
- * For polymorphic object models use the @c _clone function instead.
- */
- fundamental_base (const fundamental_base& x,
- flags f = 0,
- container* c = 0)
- : B (x, f, c), facet_table_ (0), x_ (x.x_)
- {
- }
-
- /**
- * @brief Copy the instance polymorphically.
- *
- * @param f Flags to create the copy with.
- * @param c A pointer to the object that will contain the copy.
- * @return A pointer to the dynamically allocated copy.
- *
- * This function ensures that the dynamic type of the instance
- * is used for copying and should be used for polymorphic object
- * models instead of the copy constructor.
- */
- virtual fundamental_base*
- _clone (flags f = 0, container* c = 0) const;
-
- public:
- /**
- * @brief Create an instance from a data representation
- * stream.
- *
- * @param s A stream to extract the data from.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- template <typename S>
- fundamental_base (istream<S>& s, flags f = 0, container* c = 0);
-
- /**
- * @brief Create an instance from a DOM element.
- *
- * @param e A DOM element to extract the data from.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- fundamental_base (const xercesc::DOMElement& e,
- flags f = 0,
- container* c = 0);
-
- /**
- * @brief Create an instance from a DOM Attribute.
- *
- * @param a A DOM attribute to extract the data from.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- fundamental_base (const xercesc::DOMAttr& a,
- flags f = 0,
- container* c = 0);
-
- /**
- * @brief Create an instance from a %string fragment.
- *
- * @param s A %string fragment to extract the data from.
- * @param e A pointer to DOM element containing the %string fragment.
- * @param f Flags to create the new instance with.
- * @param c A pointer to the object that will contain the new
- * instance.
- */
- fundamental_base (const std::basic_string<C>& s,
- const xercesc::DOMElement* e,
- flags f = 0,
- container* c = 0);
- //@}
-
- public:
- /**
- * @brief Assign an underlying type value to the instance.
- *
- * @param x An underlying type value.
- * @return A reference to the instance.
- */
- fundamental_base&
- operator= (const T& x)
- {
- if (&x_ != &x)
- x_ = x;
-
- return *this;
- }
-
- public:
- /**
- * @brief Implicitly convert the instance to constant reference to
- * the underlying type.
- *
- * @return A constant reference to the underlying type.
- */
- operator const T& () const
- {
- return x_;
- }
-
- /**
- * @brief Implicitly convert the instance to reference to the
- * underlying type.
- *
- * @return A reference to the underlying type.
- */
- operator T& ()
- {
- return x_;
- }
-
- // The following extra conversion operators causes problems on
- // some compilers (notably VC 9.0) and are disabled by default.
- //
-#ifdef XSD_TREE_EXTRA_FUND_CONV
- /**
- * @brief Implicitly convert the instance to another type (const
- * version).
- *
- * @return A value converted to the target type.
- */
- template <typename T2>
- operator T2 () const
- {
- return x_;
- }
-
- /**
- * @brief Implicitly convert the instance to another type.
- *
- * @return A value converted to the target type.
- */
- template <typename T2>
- operator T2 ()
- {
- return x_;
- }
-#endif // XSD_TREE_EXTRA_FUND_CONV
-
- public:
- /**
- * @brief Get the facet table associated with this type.
- *
- * @return A pointer to read-only facet table or 0.
- */
- const facet*
- _facet_table () const
- {
- return facet_table_;
- }
-
- protected:
- /**
- * @brief Set the facet table associated with this type.
- *
- * @param ft A pointer to read-only facet table.
- */
- void
- _facet_table (const facet* ft)
- {
- facet_table_ = ft;
- }
-
- private:
- const facet* facet_table_;
- T x_;
- };
-
- // While thse operators are not normally necessary, they
- // help resolve ambiguities between implicit conversion and
- // construction.
- //
-
- /**
- * @brief %fundamental_base comparison operator.
- *
- * @return True if the underlying values are equal, false otherwise.
- */
- template <typename T, typename C, typename B, schema_type::value ST>
- inline bool
- operator== (const fundamental_base<T, C, B, ST>& x,
- const fundamental_base<T, C, B, ST>& y)
- {
- T x_ (x);
- T y_ (y);
- return x_ == y_;
- }
-
- /**
- * @brief %fundamental_base comparison operator.
- *
- * @return True if the underlying values are not equal, false otherwise.
- */
- template <typename T, typename C, typename B, schema_type::value ST>
- inline bool
- operator!= (const fundamental_base<T, C, B, ST>& x,
- const fundamental_base<T, C, B, ST>& y)
- {
- T x_ (x);
- T y_ (y);
- return x_ != y_;
- }
-
-
- //@cond
-
- // Comparator for enum tables.
- //
- template <typename C>
- struct enum_comparator
- {
- enum_comparator (const C* const* table)
- : table_ (table)
- {
- }
-
- bool
- operator() (std::size_t i, const std::basic_string<C>& s) const
- {
- return table_[i] < s;
- }
-
- bool
- operator() (const std::basic_string<C>& s, std::size_t i) const
- {
- return s < table_[i];
- }
-
- // This overload shouldn't be necessary according to the standard
- // and removing it doesn't appear to trip any old compilers that
- // we still support. But let's keeps preprocessed-out until we
- // go C++11-only.
- //
-#if 0
- bool
- operator() (std::size_t i, std::size_t j) const
- {
- return std::basic_string<C> (table_[i]) < table_[j];
- }
-#endif
-
- private:
- const C* const* table_;
- };
-
- //@endcond
- }
- }
-}
-
-#include <xsd/cxx/tree/elements.ixx>
-#include <xsd/cxx/tree/elements.txx>
-
-#endif // XSD_CXX_TREE_ELEMENTS_HXX