summaryrefslogtreecommitdiff
path: root/libxsd/xsd/cxx/tree/type-factory-map.txx
diff options
context:
space:
mode:
Diffstat (limited to 'libxsd/xsd/cxx/tree/type-factory-map.txx')
-rw-r--r--libxsd/xsd/cxx/tree/type-factory-map.txx481
1 files changed, 0 insertions, 481 deletions
diff --git a/libxsd/xsd/cxx/tree/type-factory-map.txx b/libxsd/xsd/cxx/tree/type-factory-map.txx
deleted file mode 100644
index 1eddb25..0000000
--- a/libxsd/xsd/cxx/tree/type-factory-map.txx
+++ /dev/null
@@ -1,481 +0,0 @@
-// file : xsd/cxx/tree/type-factory-map.txx
-// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
-
-#include <xercesc/validators/schema/SchemaSymbols.hpp>
-
-#include <xsd/cxx/xml/string.hxx> // xml::{string, transcode}
-#include <xsd/cxx/xml/elements.hxx> // xml::{prefix, uq_name}
-#include <xsd/cxx/xml/bits/literals.hxx> // xml::bits::{xml_namespace, etc}
-
-#include <xsd/cxx/tree/types.hxx>
-#include <xsd/cxx/tree/bits/literals.hxx>
-
-namespace xsd
-{
- namespace cxx
- {
- namespace tree
- {
- // type_factory_map
- //
- template <typename C>
- type_factory_map<C>::
- type_factory_map ()
- {
- // Register factories for default instantiations of built-in,
- // non-fundamental types.
- //
-
- std::basic_string<C> xsd (bits::xml_schema<C> ());
-
-
- // anyType and anySimpleType.
- //
- register_type (
- qualified_name (bits::any_type<C> (), xsd),
- &factory_impl<type>,
- false);
-
- typedef simple_type<C, type> simple_type;
- register_type (
- qualified_name (bits::any_simple_type<C> (), xsd),
- &factory_impl<simple_type>,
- false);
-
-
- // Strings
- //
- typedef string<C, simple_type> string;
- register_type (
- qualified_name (bits::string<C> (), xsd),
- &factory_impl<string>,
- false);
-
- typedef normalized_string<C, string> normalized_string;
- register_type (
- qualified_name (bits::normalized_string<C> (), xsd),
- &factory_impl<normalized_string>,
- false);
-
- typedef token<C, normalized_string> token;
- register_type (
- qualified_name (bits::token<C> (), xsd),
- &factory_impl<token>,
- false);
-
- typedef name<C, token> name;
- register_type (
- qualified_name (bits::name<C> (), xsd),
- &factory_impl<name>,
- false);
-
- typedef nmtoken<C, token> nmtoken;
- register_type (
- qualified_name (bits::nmtoken<C> (), xsd),
- &factory_impl<nmtoken>,
- false);
-
- typedef nmtokens<C, simple_type, nmtoken> nmtokens;
- register_type (
- qualified_name (bits::nmtokens<C> (), xsd),
- &factory_impl<nmtokens>,
- false);
-
- typedef ncname<C, name> ncname;
- register_type (
- qualified_name (bits::ncname<C> (), xsd),
- &factory_impl<ncname>,
- false);
-
- typedef language<C, token> language;
- register_type (
- qualified_name (bits::language<C> (), xsd),
- &factory_impl<language>,
- false);
-
-
- // ID/IDREF.
- //
- typedef id<C, ncname> id;
- register_type (
- qualified_name (bits::id<C> (), xsd),
- &factory_impl<id>,
- false);
-
- typedef idref<C, ncname, type> idref;
- register_type (
- qualified_name (bits::idref<C> (), xsd),
- &factory_impl<idref>,
- false);
-
- typedef idrefs<C, simple_type, idref> idrefs;
- register_type (
- qualified_name (bits::idrefs<C> (), xsd),
- &factory_impl<idrefs>,
- false);
-
-
- // URI.
- //
- typedef uri<C, simple_type> uri;
- register_type (
- qualified_name (bits::any_uri<C> (), xsd),
- &factory_impl<uri>,
- false);
-
-
- // Qualified name.
- //
- typedef qname<C, simple_type, uri, ncname> qname;
- register_type (
- qualified_name (bits::qname<C> (), xsd),
- &factory_impl<qname>,
- false);
-
-
- // Binary.
- //
- typedef base64_binary<C, simple_type> base64_binary;
- register_type (
- qualified_name (bits::base64_binary<C> (), xsd),
- &factory_impl<base64_binary>,
- false);
-
- typedef hex_binary<C, simple_type> hex_binary;
- register_type (
- qualified_name (bits::hex_binary<C> (), xsd),
- &factory_impl<hex_binary>,
- false);
-
-
- // Date/time.
- //
- typedef gday<C, simple_type> gday;
- register_type (
- qualified_name (bits::gday<C> (), xsd),
- &factory_impl<gday>,
- false);
-
- typedef gmonth<C, simple_type> gmonth;
- register_type (
- qualified_name (bits::gmonth<C> (), xsd),
- &factory_impl<gmonth>,
- false);
-
- typedef gyear<C, simple_type> gyear;
- register_type (
- qualified_name (bits::gyear<C> (), xsd),
- &factory_impl<gyear>,
- false);
-
- typedef gmonth_day<C, simple_type> gmonth_day;
- register_type (
- qualified_name (bits::gmonth_day<C> (), xsd),
- &factory_impl<gmonth_day>,
- false);
-
- typedef gyear_month<C, simple_type> gyear_month;
- register_type (
- qualified_name (bits::gyear_month<C> (), xsd),
- &factory_impl<gyear_month>,
- false);
-
- typedef date<C, simple_type> date;
- register_type (
- qualified_name (bits::date<C> (), xsd),
- &factory_impl<date>,
- false);
-
- typedef time<C, simple_type> time;
- register_type (
- qualified_name (bits::time<C> (), xsd),
- &factory_impl<time>,
- false);
-
- typedef date_time<C, simple_type> date_time;
- register_type (
- qualified_name (bits::date_time<C> (), xsd),
- &factory_impl<date_time>,
- false);
-
- typedef duration<C, simple_type> duration;
- register_type (
- qualified_name (bits::duration<C> (), xsd),
- &factory_impl<duration>,
- false);
-
-
- // Entity.
- //
- typedef entity<C, ncname> entity;
- register_type (
- qualified_name (bits::entity<C> (), xsd),
- &factory_impl<entity>,
- false);
-
- typedef entities<C, simple_type, entity> entities;
- register_type (
- qualified_name (bits::entities<C> (), xsd),
- &factory_impl<entities>,
- false);
- }
-
- template <typename C>
- void type_factory_map<C>::
- register_type (const qualified_name& name,
- factory f,
- bool replace)
- {
- if (replace || type_map_.find (name) == type_map_.end ())
- type_map_[name] = f;
- }
-
- template <typename C>
- void type_factory_map<C>::
- unregister_type (const qualified_name& name)
- {
- type_map_.erase (name);
- }
-
- template <typename C>
- void type_factory_map<C>::
- register_element (const qualified_name& root,
- const qualified_name& subst,
- factory f)
- {
- element_map_[root][subst] = f;
- }
-
- template <typename C>
- void type_factory_map<C>::
- unregister_element (const qualified_name& root,
- const qualified_name& subst)
- {
- typename element_map::iterator i (element_map_.find (root));
-
- if (i != element_map_.end ())
- {
- i->second.erase (subst);
-
- if (i->second.empty ())
- element_map_.erase (i);
- }
- }
-
- template <typename C>
- typename type_factory_map<C>::factory type_factory_map<C>::
- find (const qualified_name& name) const
- {
- typename type_map::const_iterator i (type_map_.find (name));
- return i == type_map_.end () ? 0 : i->second;
- }
-
- template <typename C>
- XSD_AUTO_PTR<type> type_factory_map<C>::
- create (const C* name,
- const C* ns,
- factory static_type,
- bool global,
- bool qualified,
- const xercesc::DOMElement& e,
- const qualified_name& qn,
- tree::flags flags,
- container* c) const
- {
- factory f = 0;
-
- // See if we've got a straight match.
- //
- if (qn.name () == name &&
- (qualified ? qn.namespace_ () == ns : ns[0] == C ('\0')))
- {
- f = static_type; // NULL for abstract types.
- }
- else
- {
- // See if we have a substitution.
- //
- if (global)
- {
- typename element_map::const_iterator i (
- element_map_.find (qualified_name (name, ns)));
-
- if (i != element_map_.end ())
- {
- f = find_substitution (i->second, qn);
- }
- }
-
- if (f == 0)
- return XSD_AUTO_PTR<type> (); // No match.
- }
-
- // Check for xsi:type
- //
- {
- const XMLCh* v (
- e.getAttributeNS (
- xercesc::SchemaSymbols::fgURI_XSI,
- xercesc::SchemaSymbols::fgXSI_TYPE));
-
- if (v != 0 && v[0] != XMLCh (0))
- f = find_type (xml::transcode<C> (v), e);
- }
-
- return f (e, flags, c);
- }
-
- template <typename C>
- template <typename T>
- XSD_AUTO_PTR<type> type_factory_map<C>::
- traits_adapter (const xercesc::DOMElement& e, flags f, container* c)
- {
- return XSD_AUTO_PTR<type> (traits<T, C>::create (e, f, c));
- }
-
- template <typename C>
- typename type_factory_map<C>::factory type_factory_map<C>::
- find_substitution (const subst_map& start,
- const qualified_name& name) const
- {
- typename subst_map::const_iterator i (start.find (name));
-
- if (i != start.end ())
- return i->second;
- else
- {
- for (i = start.begin (); i != start.end (); ++i)
- {
- typename element_map::const_iterator j (
- element_map_.find (i->first));
-
- if (j != element_map_.end ())
- {
- if (factory f = find_substitution (j->second, name))
- return f;
- }
- }
- }
-
- return 0;
- }
-
- template <typename C>
- typename type_factory_map<C>::factory type_factory_map<C>::
- find_type (const std::basic_string<C>& name,
- const xercesc::DOMElement& e) const
- {
- using std::basic_string;
-
- basic_string<C> ns_name, uq_name (xml::uq_name (name));
-
- // Copied with modifications from xml/dom/elements.hxx.
- //
- std::basic_string<C> p (xml::prefix (name));
-
- // 'xml' prefix requires special handling and Xerces folks refuse
- // to handle this in DOM so I have to do it myself.
- //
- if (p == xml::bits::xml_prefix<C> ())
- ns_name = xml::bits::xml_namespace<C> ();
- else
- {
- const XMLCh* xns (
- e.lookupNamespaceURI (
- p.empty () ? 0 : xml::string (p).c_str ()));
-
- if (xns != 0)
- ns_name = xml::transcode<C> (xns);
- else
- {
- // See if we've got any no-namespace types.
- //
- if (!p.empty ())
- throw no_prefix_mapping<C> (p);
- }
- }
-
- factory f (find (qualified_name (uq_name, ns_name)));
-
- if (f == 0)
- throw no_type_info<C> (uq_name, ns_name);
-
- return f;
- }
-
-
- // type_factory_plate
- //
- template<unsigned long id, typename C>
- type_factory_plate<id, C>::
- type_factory_plate ()
- {
- if (count == 0)
- map = new type_factory_map<C>;
-
- ++count;
- }
-
- template<unsigned long id, typename C>
- type_factory_plate<id, C>::
- ~type_factory_plate ()
- {
- if (--count == 0)
- delete map;
- }
-
-
- //
- //
- template<typename T>
- XSD_AUTO_PTR<type>
- factory_impl (const xercesc::DOMElement& e, flags f, container* c)
- {
- return XSD_AUTO_PTR<type> (new T (e, f, c));
- }
-
- //
- //
- template<unsigned long id, typename C, typename T>
- type_factory_initializer<id, C, T>::
- type_factory_initializer (const C* name, const C* ns)
- : name_ (name), ns_ (ns)
- {
- type_factory_map_instance<id, C> ().register_type (
- xml::qualified_name<C> (name, ns), &factory_impl<T>);
- }
-
- template<unsigned long id, typename C, typename T>
- type_factory_initializer<id, C, T>::
- ~type_factory_initializer ()
- {
- type_factory_map_instance<id, C> ().unregister_type (
- xml::qualified_name<C> (name_, ns_));
- }
-
- //
- //
- template<unsigned long id, typename C, typename T>
- element_factory_initializer<id, C, T>::
- element_factory_initializer (const C* root_name, const C* root_ns,
- const C* subst_name, const C* subst_ns)
- : root_name_ (root_name), root_ns_ (root_ns),
- subst_name_ (subst_name), subst_ns_ (subst_ns)
- {
- type_factory_map_instance<id, C> ().register_element (
- xml::qualified_name<C> (root_name, root_ns),
- xml::qualified_name<C> (subst_name, subst_ns),
- &factory_impl<T>);
- }
-
- template<unsigned long id, typename C, typename T>
- element_factory_initializer<id, C, T>::
- ~element_factory_initializer ()
- {
- type_factory_map_instance<id, C> ().unregister_element (
- xml::qualified_name<C> (root_name_, root_ns_),
- xml::qualified_name<C> (subst_name_, subst_ns_));
- }
- }
- }
-}