[xsd-users] Feature request: c++11 support for examples/cxx/tree/streaming/parser.hxx

Erik Sjölund erik.sjolund at gmail.com
Sun Dec 14 03:24:17 EST 2014


I have successfully been using these files

examples/cxx/tree/streaming/serializer.cxx
examples/cxx/tree/streaming/serializer.hxx
examples/cxx/tree/streaming/parser.cxx
examples/cxx/tree/streaming/parser.hxx

when writing some software project. They can be really useful.

For the rest of the project I am defining the XSD_CXX11 macro, so I
thought it would be a good idea to adjust the files above to start
using std::unique_ptr.

It would be nice if the attached patch (or something similar) could be
merged into CodeSynthesis XSD. The patch is in public domain, so use
it in whatever way you like.

cheers,
Erik Sjölund
-------------- next part --------------
diff -ur old/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/parser.cxx new/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/parser.cxx
--- old/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/parser.cxx	2014-07-04 08:39:29.000000000 +0200
+++ new/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/parser.cxx	2014-12-14 08:52:58.882259596 +0100
@@ -14,8 +14,6 @@
 #include <xercesc/validators/common/Grammar.hpp> // xercesc::Grammar
 #include <xercesc/framework/XMLGrammarPoolImpl.hpp>
 
-#include <xsd/cxx/auto-array.hxx>
-
 #include <xsd/cxx/xml/sax/std-input-source.hxx>
 #include <xsd/cxx/xml/sax/bits/error-handler-proxy.hxx>
 
@@ -189,9 +187,9 @@
   }
 
   if (!r)
-    return document_ptr (0);
+    return document_ptr (nullptr);
 
-  return doc_;
+  return std::move(doc_);
 }
 
 document_ptr parser_impl::
@@ -207,14 +205,14 @@
     {
       // Copy doc to outer_doc.
       //
-      doc_ = outer_doc;
+      doc_ = std::move(outer_doc);
       cur_ = static_cast<DOMElement*> (
         doc_->importNode (doc->getDocumentElement (), true));
       doc_->getDocumentElement ()->appendChild (cur_);
     }
     else
     {
-      doc_ = doc;
+      doc_ = std::move(doc);
       cur_ = doc_->getDocumentElement ();
     }
 
@@ -225,7 +223,7 @@
     if (depth_ != next_depth_)
     {
       peek_ = false;
-      return doc_;
+      return std::move(doc_);
     }
   }
 
@@ -250,7 +248,7 @@
   }
 
   if (!r)
-    return document_ptr (0);
+    return document_ptr (nullptr);
 
   // If we are not at our start depth, keep calling parseNext() until we
   // get there again.
@@ -262,9 +260,9 @@
   }
 
   if (!r)
-    return document_ptr (0);
+    return document_ptr (nullptr);
 
-  return doc_;
+  return std::move(doc_);
 }
 
 // DOM builder.
@@ -368,5 +366,5 @@
 document_ptr parser::
 next (document_ptr doc, document_ptr outer_doc)
 {
-  return impl_->next (doc, outer_doc);
+  return impl_->next (std::move(doc), std::move(outer_doc));
 }
diff -ur old/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/parser.hxx new/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/parser.hxx
--- old/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/parser.hxx	2014-07-04 07:20:37.000000000 +0200
+++ new/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/parser.hxx	2014-08-09 16:11:45.528305058 +0200
@@ -26,7 +26,7 @@
   void
   start (std::istream& is, const std::string& id, bool validate);
 
-  typedef xsd::cxx::xml::dom::auto_ptr<xercesc::DOMDocument> document_ptr;
+  typedef XSD_DOM_AUTO_PTR<xercesc::DOMDocument> document_ptr;
 
   // The peek function parses just the next element (ignoring any
   // preceding content assuming it is whitespace) without parsing
@@ -61,7 +61,7 @@
   operator= (const parser&);
 
 private:
-  std::auto_ptr<parser_impl> impl_;
+  std::unique_ptr<parser_impl> impl_;
 };
 
 #endif // PARSER_HXX
diff -ur old/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/serializer.cxx new/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/serializer.cxx
--- old/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/serializer.cxx	2014-07-04 11:00:46.000000000 +0200
+++ new/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/serializer.cxx	2014-08-08 22:30:04.074777408 +0200
@@ -352,10 +352,10 @@
   create (const string& ns, const string& qname, const namespace_infomap&);
 
   void
-  serialize (xml::dom::auto_ptr<DOMElement>);
+  serialize (XSD_DOM_AUTO_PTR<DOMElement>);
 
   void
-  serialize_open (xml::dom::auto_ptr<DOMElement>);
+  serialize_open (XSD_DOM_AUTO_PTR<DOMElement>);
 
   void
   serialize_close (const string&);
@@ -369,8 +369,8 @@
 
   // Serializer.
   //
-  xml::dom::auto_ptr<DOMLSOutput> out_;
-  xml::dom::auto_ptr<StreamingDOMSerializer> serializer_;
+  XSD_DOM_AUTO_PTR<DOMLSOutput> out_;
+  XSD_DOM_AUTO_PTR<StreamingDOMSerializer> serializer_;
 
   auto_ptr<xml::dom::ostream_format_target> oft_;
 
@@ -380,7 +380,7 @@
   // DOM document that we use to create the elements.
   //
   DOMImplementation& dom_impl_;
-  xml::dom::auto_ptr<DOMDocument> doc_;
+  XSD_DOM_AUTO_PTR<DOMDocument> doc_;
   vector<DOMElement*> element_stack_;
 
   size_t element_count_; // Number of elements serialized using current doc.
@@ -460,7 +460,7 @@
 }
 
 void serializer_impl::
-serialize (xml::dom::auto_ptr<DOMElement> p)
+serialize (XSD_DOM_AUTO_PTR<DOMElement> p)
 {
   DOMElement* e (p.get ());
 
@@ -486,7 +486,7 @@
 }
 
 void serializer_impl::
-serialize_open (xml::dom::auto_ptr<DOMElement> p)
+serialize_open (XSD_DOM_AUTO_PTR<DOMElement> p)
 {
   DOMElement* e (p.get ());
 
@@ -534,7 +534,7 @@
   // internal heap. While Xerces-C++ DOM tries to re-use memory,
   // it still accumulates no longer used memory blocks.
   //
-  xml::dom::auto_ptr<DOMDocument> doc (dom_impl_.createDocument ());
+  XSD_DOM_AUTO_PTR<DOMDocument> doc (dom_impl_.createDocument ());
 
   if (!element_stack_.empty ())
   {
@@ -551,7 +551,7 @@
     }
   }
 
-  doc_ = doc;
+  doc_ = std::move(doc);
   element_count_ = 0;
 }
 
@@ -589,15 +589,15 @@
 }
 
 void serializer::
-serialize (xml::dom::auto_ptr<DOMElement> e)
+serialize (XSD_DOM_AUTO_PTR<DOMElement> e)
 {
-  impl_->serialize (e);
+  impl_->serialize (std::move(e));
 }
 
 void serializer::
-serialize_open (xml::dom::auto_ptr<DOMElement> e)
+serialize_open (XSD_DOM_AUTO_PTR<DOMElement> e)
 {
-  impl_->serialize_open (e);
+  impl_->serialize_open (std::move(e));
 }
 
 void serializer::
diff -ur old/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/serializer.hxx new/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/serializer.hxx
--- old/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/serializer.hxx	2014-01-23 07:05:55.000000000 +0100
+++ new/xsd-4.0.0-x86_64-linux-gnu/examples/cxx/tree/streaming/serializer.hxx	2014-08-09 13:07:15.860039592 +0200
@@ -102,45 +102,45 @@
           const namespace_infomap&);
 
   void
-  serialize (xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement>);
+  serialize (XSD_DOM_AUTO_PTR<xercesc::DOMElement>);
 
   void
-  serialize_open (xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement>);
+  serialize_open (XSD_DOM_AUTO_PTR<xercesc::DOMElement>);
 
   void
   serialize_close (const std::string& name);
 
 private:
-  std::auto_ptr<serializer_impl> impl_;
+  std::unique_ptr<serializer_impl> impl_;
 };
 
 template <typename T>
 inline void serializer::
 next (const std::string& name, const T& x)
 {
-  xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement> e (
+  XSD_DOM_AUTO_PTR<xercesc::DOMElement> e (
     create (name, namespace_infomap ()));
   *e << x;
-  serialize (e);
+  serialize (std::move(e));
 }
 
 template <typename T>
 inline void serializer::
 next (const std::string& name, const namespace_infomap& map, const T& x)
 {
-  xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement> e (create (name, map));
+  XSD_DOM_AUTO_PTR<xercesc::DOMElement> e (create (name, map));
   *e << x;
-  serialize (e);
+  serialize (std::move(e));
 }
 
 template <typename T>
 inline void serializer::
 next (const std::string& ns, const std::string& name, const T& x)
 {
-  xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement> e (
+  XSD_DOM_AUTO_PTR<xercesc::DOMElement> e (
     create (ns, name, namespace_infomap ()));
   *e << x;
-  serialize (e);
+  serialize (std::move(e));
 }
 
 template <typename T>
@@ -150,38 +150,38 @@
       const namespace_infomap& map,
       const T& x)
 {
-  xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement> e (create (ns, name, map));
+  XSD_DOM_AUTO_PTR<xercesc::DOMElement> e (create (ns, name, map));
   *e << x;
-  serialize (e);
+  serialize (std::move(e));
 }
 
 template <typename T>
 inline void serializer::
 next_open (const std::string& name, const T& x)
 {
-  xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement> e (
+  XSD_DOM_AUTO_PTR<xercesc::DOMElement> e (
     create (name, namespace_infomap ()));
   *e << x;
-  serialize_open (e);
+  serialize_open (std::move(e));
 }
 
 template <typename T>
 inline void serializer::
 next_open (const std::string& name, const namespace_infomap& map, const T& x)
 {
-  xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement> e (create (name, map));
+  XSD_DOM_AUTO_PTR<xercesc::DOMElement> e (create (name, map));
   *e << x;
-  serialize_open (e);
+  serialize_open (std::move(e));
 }
 
 template <typename T>
 inline void serializer::
 next_open (const std::string& ns, const std::string& name, const T& x)
 {
-  xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement> e (
+  XSD_DOM_AUTO_PTR<xercesc::DOMElement> e (
     create (ns, name, namespace_infomap ()));
   *e << x;
-  serialize_open (e);
+  serialize_open (std::move(e));
 }
 
 template <typename T>
@@ -191,9 +191,9 @@
       const namespace_infomap& map,
       const T& x)
 {
-  xsd::cxx::xml::dom::auto_ptr<xercesc::DOMElement> e (create (ns, name, map));
+  XSD_DOM_AUTO_PTR<xercesc::DOMElement> e (create (ns, name, map));
   *e << x;
-  serialize_open (e);
+  serialize_open (std::move(e));
 }
 
 inline void serializer::


More information about the xsd-users mailing list