332 lines
8.9 KiB
Plaintext
332 lines
8.9 KiB
Plaintext
|
// file : xsd/cxx/tree/stream-extraction-map.txx
|
||
|
// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
|
||
|
|
||
|
#include <xsd/cxx/tree/types.hxx>
|
||
|
#include <xsd/cxx/tree/stream-extraction.hxx>
|
||
|
#include <xsd/cxx/tree/bits/literals.hxx>
|
||
|
|
||
|
namespace xsd
|
||
|
{
|
||
|
namespace cxx
|
||
|
{
|
||
|
namespace tree
|
||
|
{
|
||
|
// stream_extraction_map
|
||
|
//
|
||
|
template <typename S, typename C>
|
||
|
stream_extraction_map<S, C>::
|
||
|
stream_extraction_map ()
|
||
|
{
|
||
|
// Register extractors for 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),
|
||
|
&extractor_impl<S, type>,
|
||
|
false);
|
||
|
|
||
|
typedef simple_type<C, type> simple_type;
|
||
|
register_type (
|
||
|
qualified_name (bits::any_simple_type<C> (), xsd),
|
||
|
&extractor_impl<S, simple_type>,
|
||
|
false);
|
||
|
|
||
|
|
||
|
// Strings
|
||
|
//
|
||
|
typedef string<C, simple_type> string;
|
||
|
register_type (
|
||
|
qualified_name (bits::string<C> (), xsd),
|
||
|
&extractor_impl<S, string>,
|
||
|
false);
|
||
|
|
||
|
typedef normalized_string<C, string> normalized_string;
|
||
|
register_type (
|
||
|
qualified_name (bits::normalized_string<C> (), xsd),
|
||
|
&extractor_impl<S, normalized_string>,
|
||
|
false);
|
||
|
|
||
|
typedef token<C, normalized_string> token;
|
||
|
register_type (
|
||
|
qualified_name (bits::token<C> (), xsd),
|
||
|
&extractor_impl<S, token>,
|
||
|
false);
|
||
|
|
||
|
typedef name<C, token> name;
|
||
|
register_type (
|
||
|
qualified_name (bits::name<C> (), xsd),
|
||
|
&extractor_impl<S, name>,
|
||
|
false);
|
||
|
|
||
|
typedef nmtoken<C, token> nmtoken;
|
||
|
register_type (
|
||
|
qualified_name (bits::nmtoken<C> (), xsd),
|
||
|
&extractor_impl<S, nmtoken>,
|
||
|
false);
|
||
|
|
||
|
typedef nmtokens<C, simple_type, nmtoken> nmtokens;
|
||
|
register_type (
|
||
|
qualified_name (bits::nmtokens<C> (), xsd),
|
||
|
&extractor_impl<S, nmtokens>,
|
||
|
false);
|
||
|
|
||
|
typedef ncname<C, name> ncname;
|
||
|
register_type (
|
||
|
qualified_name (bits::ncname<C> (), xsd),
|
||
|
&extractor_impl<S, ncname>,
|
||
|
false);
|
||
|
|
||
|
typedef language<C, token> language;
|
||
|
register_type (
|
||
|
qualified_name (bits::language<C> (), xsd),
|
||
|
&extractor_impl<S, language>,
|
||
|
false);
|
||
|
|
||
|
|
||
|
// ID/IDREF.
|
||
|
//
|
||
|
typedef id<C, ncname> id;
|
||
|
register_type (
|
||
|
qualified_name (bits::id<C> (), xsd),
|
||
|
&extractor_impl<S, id>,
|
||
|
false);
|
||
|
|
||
|
typedef idref<C, ncname, type> idref;
|
||
|
register_type (
|
||
|
qualified_name (bits::idref<C> (), xsd),
|
||
|
&extractor_impl<S, idref>,
|
||
|
false);
|
||
|
|
||
|
typedef idrefs<C, simple_type, idref> idrefs;
|
||
|
register_type (
|
||
|
qualified_name (bits::idrefs<C> (), xsd),
|
||
|
&extractor_impl<S, idrefs>,
|
||
|
false);
|
||
|
|
||
|
|
||
|
// URI.
|
||
|
//
|
||
|
typedef uri<C, simple_type> uri;
|
||
|
register_type (
|
||
|
qualified_name (bits::any_uri<C> (), xsd),
|
||
|
&extractor_impl<S, uri>,
|
||
|
false);
|
||
|
|
||
|
|
||
|
// Qualified name.
|
||
|
//
|
||
|
typedef qname<C, simple_type, uri, ncname> qname;
|
||
|
register_type (
|
||
|
qualified_name (bits::qname<C> (), xsd),
|
||
|
&extractor_impl<S, qname>,
|
||
|
false);
|
||
|
|
||
|
|
||
|
// Binary.
|
||
|
//
|
||
|
typedef base64_binary<C, simple_type> base64_binary;
|
||
|
register_type (
|
||
|
qualified_name (bits::base64_binary<C> (), xsd),
|
||
|
&extractor_impl<S, base64_binary>,
|
||
|
false);
|
||
|
|
||
|
typedef hex_binary<C, simple_type> hex_binary;
|
||
|
register_type (
|
||
|
qualified_name (bits::hex_binary<C> (), xsd),
|
||
|
&extractor_impl<S, hex_binary>,
|
||
|
false);
|
||
|
|
||
|
|
||
|
// Date/time.
|
||
|
//
|
||
|
typedef gday<C, simple_type> gday;
|
||
|
register_type (
|
||
|
qualified_name (bits::gday<C> (), xsd),
|
||
|
&extractor_impl<S, gday>,
|
||
|
false);
|
||
|
|
||
|
typedef gmonth<C, simple_type> gmonth;
|
||
|
register_type (
|
||
|
qualified_name (bits::gmonth<C> (), xsd),
|
||
|
&extractor_impl<S, gmonth>,
|
||
|
false);
|
||
|
|
||
|
typedef gyear<C, simple_type> gyear;
|
||
|
register_type (
|
||
|
qualified_name (bits::gyear<C> (), xsd),
|
||
|
&extractor_impl<S, gyear>,
|
||
|
false);
|
||
|
|
||
|
typedef gmonth_day<C, simple_type> gmonth_day;
|
||
|
register_type (
|
||
|
qualified_name (bits::gmonth_day<C> (), xsd),
|
||
|
&extractor_impl<S, gmonth_day>,
|
||
|
false);
|
||
|
|
||
|
typedef gyear_month<C, simple_type> gyear_month;
|
||
|
register_type (
|
||
|
qualified_name (bits::gyear_month<C> (), xsd),
|
||
|
&extractor_impl<S, gyear_month>,
|
||
|
false);
|
||
|
|
||
|
typedef date<C, simple_type> date;
|
||
|
register_type (
|
||
|
qualified_name (bits::date<C> (), xsd),
|
||
|
&extractor_impl<S, date>,
|
||
|
false);
|
||
|
|
||
|
typedef time<C, simple_type> time;
|
||
|
register_type (
|
||
|
qualified_name (bits::time<C> (), xsd),
|
||
|
&extractor_impl<S, time>,
|
||
|
false);
|
||
|
|
||
|
typedef date_time<C, simple_type> date_time;
|
||
|
register_type (
|
||
|
qualified_name (bits::date_time<C> (), xsd),
|
||
|
&extractor_impl<S, date_time>,
|
||
|
false);
|
||
|
|
||
|
typedef duration<C, simple_type> duration;
|
||
|
register_type (
|
||
|
qualified_name (bits::duration<C> (), xsd),
|
||
|
&extractor_impl<S, duration>,
|
||
|
false);
|
||
|
|
||
|
|
||
|
// Entity.
|
||
|
//
|
||
|
typedef entity<C, ncname> entity;
|
||
|
register_type (
|
||
|
qualified_name (bits::entity<C> (), xsd),
|
||
|
&extractor_impl<S, entity>,
|
||
|
false);
|
||
|
|
||
|
typedef entities<C, simple_type, entity> entities;
|
||
|
register_type (
|
||
|
qualified_name (bits::entities<C> (), xsd),
|
||
|
&extractor_impl<S, entities>,
|
||
|
false);
|
||
|
}
|
||
|
|
||
|
template <typename S, typename C>
|
||
|
void stream_extraction_map<S, C>::
|
||
|
register_type (const qualified_name& name,
|
||
|
extractor e,
|
||
|
bool replace)
|
||
|
{
|
||
|
if (replace || type_map_.find (name) == type_map_.end ())
|
||
|
type_map_[name] = e;
|
||
|
}
|
||
|
|
||
|
template <typename S, typename C>
|
||
|
void stream_extraction_map<S, C>::
|
||
|
unregister_type (const qualified_name& name)
|
||
|
{
|
||
|
type_map_.erase (name);
|
||
|
}
|
||
|
|
||
|
template <typename S, typename C>
|
||
|
XSD_AUTO_PTR<type> stream_extraction_map<S, C>::
|
||
|
extract (istream<S>& s, flags f, container* c)
|
||
|
{
|
||
|
std::basic_string<C> ns, name;
|
||
|
|
||
|
// The namespace and name strings are pooled.
|
||
|
//
|
||
|
std::size_t id;
|
||
|
istream_common::as_size<std::size_t> as_size (id);
|
||
|
s >> as_size;
|
||
|
|
||
|
if (id != 0)
|
||
|
s.pool_string (id, ns);
|
||
|
else
|
||
|
{
|
||
|
s >> ns;
|
||
|
s.pool_add (ns);
|
||
|
}
|
||
|
|
||
|
s >> as_size;
|
||
|
|
||
|
if (id != 0)
|
||
|
s.pool_string (id, name);
|
||
|
else
|
||
|
{
|
||
|
s >> name;
|
||
|
s.pool_add (name);
|
||
|
}
|
||
|
|
||
|
if (extractor e = find (qualified_name (name, ns)))
|
||
|
{
|
||
|
return e (s, f, c);
|
||
|
}
|
||
|
else
|
||
|
throw no_type_info<C> (name, ns);
|
||
|
}
|
||
|
|
||
|
template <typename S, typename C>
|
||
|
typename stream_extraction_map<S, C>::extractor
|
||
|
stream_extraction_map<S, 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;
|
||
|
}
|
||
|
|
||
|
|
||
|
// stream_extraction_plate
|
||
|
//
|
||
|
template<unsigned long id, typename S, typename C>
|
||
|
stream_extraction_plate<id, S, C>::
|
||
|
stream_extraction_plate ()
|
||
|
{
|
||
|
if (count == 0)
|
||
|
map = new stream_extraction_map<S, C>;
|
||
|
|
||
|
++count;
|
||
|
}
|
||
|
|
||
|
template<unsigned long id, typename S, typename C>
|
||
|
stream_extraction_plate<id, S, C>::
|
||
|
~stream_extraction_plate ()
|
||
|
{
|
||
|
if (--count == 0)
|
||
|
delete map;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
template<typename S, typename T>
|
||
|
XSD_AUTO_PTR<type>
|
||
|
extractor_impl (istream<S>& s, flags f, container* c)
|
||
|
{
|
||
|
return XSD_AUTO_PTR<type> (new T (s, f, c));
|
||
|
}
|
||
|
|
||
|
|
||
|
// stream_extraction_initializer
|
||
|
//
|
||
|
template<unsigned long id, typename S, typename C, typename T>
|
||
|
stream_extraction_initializer<id, S, C, T>::
|
||
|
stream_extraction_initializer (const C* name, const C* ns)
|
||
|
: name_ (name), ns_ (ns)
|
||
|
{
|
||
|
stream_extraction_map_instance<id, S, C> ().register_type (
|
||
|
xml::qualified_name<C> (name, ns), &extractor_impl<S, T>);
|
||
|
}
|
||
|
|
||
|
template<unsigned long id, typename S, typename C, typename T>
|
||
|
stream_extraction_initializer<id, S, C, T>::
|
||
|
~stream_extraction_initializer ()
|
||
|
{
|
||
|
stream_extraction_map_instance<id, S, C> ().unregister_type (
|
||
|
xml::qualified_name<C> (name_, ns_));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|