From a8ce5c380c69539fe0c7c62c397634d9d0c9fde2 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 18 Dec 2020 18:48:46 +0300 Subject: Switch to build2 --- xsd-examples/cxx/tree/streaming/serializer.hxx | 209 +++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 xsd-examples/cxx/tree/streaming/serializer.hxx (limited to 'xsd-examples/cxx/tree/streaming/serializer.hxx') diff --git a/xsd-examples/cxx/tree/streaming/serializer.hxx b/xsd-examples/cxx/tree/streaming/serializer.hxx new file mode 100644 index 0000000..585bd76 --- /dev/null +++ b/xsd-examples/cxx/tree/streaming/serializer.hxx @@ -0,0 +1,209 @@ +// file : cxx/tree/streaming/serializer.hxx +// author : Boris Kolpackov +// copyright : not copyrighted - public domain + +#ifndef SERIALIZER_HXX +#define SERIALIZER_HXX + +#include +#include +#include // std::unique_ptr + +#include + +#include +#include // namespace_infomap + +class serializer_impl; + +class serializer +{ +public: + typedef xsd::cxx::xml::dom::namespace_infomap namespace_infomap; + + ~serializer (); + serializer (); + + // Start the serialization process. + // + void + start (std::ostream& is, const std::string& encoding = "UTF-8"); + + // Serialize next object model fragment into an element with the specified + // name. + // + template + void + next (const std::string& name, const T& x); + + // Serialize next object model fragment into an element with the specified + // name and namespace declarations. + // + template + void + next (const std::string& name, const namespace_infomap&, const T& x); + + // Serialize next object model fragment into an element with the specified + // namespace and qualified name. + // + template + void + next (const std::string& ns, const std::string& name, const T& x); + + // Serialize next object model fragment into an element with the specified + // namespace and qualified name as well as namespace declarations. + // + template + void + next (const std::string& ns, + const std::string& name, + const namespace_infomap&, + const T& x); + + // The next_open/close functions are like next() but split into two steps. + // next_open() serializes the object model fragment into an element leaving + // it open while next_close() closes the element. + // + template + void + next_open (const std::string& name, const T& x); + + template + void + next_open (const std::string& name, const namespace_infomap&, const T& x); + + template + void + next_open (const std::string& ns, const std::string& name, const T& x); + + template + void + next_open (const std::string& ns, + const std::string& name, + const namespace_infomap&, + const T& x); + + void + next_close (const std::string& name); + +private: + serializer (const serializer&); + + serializer& + operator= (const serializer&); + +private: + xercesc::DOMElement* + create (const std::string& name, const namespace_infomap&); + + xercesc::DOMElement* + create (const std::string& ns, + const std::string& name, + const namespace_infomap&); + + void + serialize (xsd::cxx::xml::dom::unique_ptr); + + void + serialize_open (xsd::cxx::xml::dom::unique_ptr); + + void + serialize_close (const std::string& name); + +private: + std::unique_ptr impl_; +}; + +template +inline void serializer:: +next (const std::string& name, const T& x) +{ + xsd::cxx::xml::dom::unique_ptr e ( + create (name, namespace_infomap ())); + *e << x; + serialize (std::move (e)); +} + +template +inline void serializer:: +next (const std::string& name, const namespace_infomap& map, const T& x) +{ + xsd::cxx::xml::dom::unique_ptr e (create (name, map)); + *e << x; + serialize (std::move (e)); +} + +template +inline void serializer:: +next (const std::string& ns, const std::string& name, const T& x) +{ + xsd::cxx::xml::dom::unique_ptr e ( + create (ns, name, namespace_infomap ())); + *e << x; + serialize (std::move (e)); +} + +template +inline void serializer:: +next (const std::string& ns, + const std::string& name, + const namespace_infomap& map, + const T& x) +{ + xsd::cxx::xml::dom::unique_ptr e ( + create (ns, name, map)); + + *e << x; + serialize (std::move (e)); +} + +template +inline void serializer:: +next_open (const std::string& name, const T& x) +{ + xsd::cxx::xml::dom::unique_ptr e ( + create (name, namespace_infomap ())); + *e << x; + serialize_open (std::move (e)); +} + +template +inline void serializer:: +next_open (const std::string& name, const namespace_infomap& map, const T& x) +{ + xsd::cxx::xml::dom::unique_ptr e (create (name, map)); + *e << x; + serialize_open (std::move (e)); +} + +template +inline void serializer:: +next_open (const std::string& ns, const std::string& name, const T& x) +{ + xsd::cxx::xml::dom::unique_ptr e ( + create (ns, name, namespace_infomap ())); + *e << x; + serialize_open (std::move (e)); +} + +template +inline void serializer:: +next_open (const std::string& ns, + const std::string& name, + const namespace_infomap& map, + const T& x) +{ + xsd::cxx::xml::dom::unique_ptr e ( + create (ns, name, map)); + + *e << x; + serialize_open (std::move (e)); +} + +inline void serializer:: +next_close (const std::string& name) +{ + serialize_close (name); +} + +#endif // SERIALIZER_HXX -- cgit v1.1