From f0510d2f90467de8e8f260b47d79a9baaf9bef17 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 17 Sep 2009 07:15:29 +0200 Subject: Start tracking XSD with git --- libxsd/xsd/cxx/tree/element-map.hxx | 146 ++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 libxsd/xsd/cxx/tree/element-map.hxx (limited to 'libxsd/xsd/cxx/tree/element-map.hxx') diff --git a/libxsd/xsd/cxx/tree/element-map.hxx b/libxsd/xsd/cxx/tree/element-map.hxx new file mode 100644 index 0000000..668a261 --- /dev/null +++ b/libxsd/xsd/cxx/tree/element-map.hxx @@ -0,0 +1,146 @@ +// file : xsd/cxx/tree/element-map.hxx +// author : Boris Kolpackov +// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef XSD_CXX_TREE_ELEMENT_MAP_HXX +#define XSD_CXX_TREE_ELEMENT_MAP_HXX + +#include +#include // std::auto_ptr +#include // std::size_t +#include + +#include +#include + +namespace xsd +{ + namespace cxx + { + namespace tree + { + /** + * @brief Root element map. + * + * This class allows uniform parsing/serialization of multiple + * root elements via the element_type base class. + * + * @nosubgrouping + */ + template + class element_map + { + public: + /** + * @brief Common base class for all element types. + */ + typedef tree::element_type element_type; + + /** + * @brief Parse a DOM element. + * + * @param e A DOM element to parse. + * @param f Flags to create the new element object with. + * @return An automatic pointer to the new element object. + */ + static std::auto_ptr + parse (const xercesc::DOMElement& e, flags f = 0); + + /** + * @brief Serialize an element object to a DOM element. + * + * @param e A DOM element to serialize to. + * @param x An element object to serialize. + */ + static void + serialize (xercesc::DOMElement& e, const element_type& x); + + public: + //@cond + + typedef xml::qualified_name qualified_name; + + typedef std::auto_ptr + (*parser) (const xercesc::DOMElement&, flags f); + + typedef void + (*serializer) (xercesc::DOMElement&, const element_type&); + + static void + register_parser (const qualified_name&, parser); + + static void + register_serializer (const qualified_name&, serializer); + + public: + struct map_entry + { + map_entry () : parser_ (0), serializer_ (0) {} + + parser parser_; + serializer serializer_; + }; + + typedef + std::map + map; + + static map* map_; + static std::size_t count_; + + private: + element_map (); + + //@endcond + }; + + //@cond + + template + typename element_map::map* element_map::map_ = 0; + + template + std::size_t element_map::count_ = 0; + + template + struct element_map_init + { + element_map_init (); + ~element_map_init (); + }; + + // + // + template + std::auto_ptr > + parser_impl (const xercesc::DOMElement&, flags); + + template + struct parser_init + { + parser_init (const std::basic_string& name, + const std::basic_string& ns); + }; + + // + // + template + void + serializer_impl (xercesc::DOMElement&, const element_type&); + + template + struct serializer_init + { + serializer_init (const std::basic_string& name, + const std::basic_string& ns); + }; + + //@endcond + } + } +} + +#include + +#endif // XSD_CXX_TREE_ELEMENT_MAP_HXX -- cgit v1.1