// file : XMLSchema/Writer.hpp // author : Boris Kolpackov // cvs-id : $Id$ #ifndef XMLSCHEMA_WRITER_HPP #define XMLSCHEMA_WRITER_HPP #include #include #include #include #include namespace XMLSchema { namespace Writer { template struct FundamentalType : Traversal::Traverser, virtual XSCRT::Writer { FundamentalType (XSCRT::XML::Element& e) : XSCRT::Writer (e) { } using XSCRT::Writer::top_; using XSCRT::Writer::attr_; virtual void traverse (T const& o) { using namespace XSCRT::XML; std::basic_ostringstream os; os << o; if (Attribute* a = attr_ ()) { a->value (os.str ()); } else { top_().value (os.str ()); } } protected: virtual void traverse (T &t) { Traversal::Traverser::traverse (t); } FundamentalType () { } }; template struct FundamentalType , C> : Traversal::Traverser >, virtual XSCRT::Writer { FundamentalType (XSCRT::XML::Element &e) : XSCRT::Writer (e) { } using XSCRT::Writer::top_; using XSCRT::Writer::attr_; virtual void traverse (XSCRT::FundamentalType const &o) { using namespace XSCRT::XML; std::basic_ostringstream os; if (o) { os << "true"; } else { os << "false"; } if (Attribute* a = attr_ ()) { a->value (os.str ()); } else { top_().value (os.str ()); } } protected: virtual void traverse (XSCRT::FundamentalType &t) { Traversal::Traverser >::traverse (t); } FundamentalType () { } }; template struct IDREF : Traversal::Traverser >, virtual XSCRT::Writer { IDREF (XSCRT::XML::Element& e) : XSCRT::Writer (e) { } virtual void traverse ( typename Traversal::Traverser >::Type const& o) { using namespace XSCRT::XML; if (Attribute* a = XSCRT::Writer::attr_ ()) { a->value (o.id ()); } else { XSCRT::Writer::top_().value (o.id ()); } } protected: virtual void traverse (typename Traversal::Traverser >::Type &o) { Traversal::Traverser >::traverse (o); } IDREF () { } }; } } #include #include #endif // XMLSCHEMA_WRITER_HPP