From 1a4099b78717b16f632b0e7e0980a27811221e52 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 3 Jul 2014 09:57:09 +0200 Subject: Implement anyType and anySimpleType content representation anyType as a DOM fragment, similar to wildcards. anySimpleType as a text string. --- xsd/cxx/tree/fundamental-header.hxx | 2 +- xsd/cxx/tree/options.cli | 7 +++++++ xsd/cxx/tree/stream-extraction-source.cxx | 22 ++++++++++++---------- xsd/cxx/tree/tree-header.cxx | 16 ++++++++++++++++ xsd/cxx/tree/tree-inline.cxx | 22 ++++++++++++++++++++++ xsd/cxx/tree/tree-source.cxx | 8 +++++++- 6 files changed, 65 insertions(+), 12 deletions(-) (limited to 'xsd/cxx') diff --git a/xsd/cxx/tree/fundamental-header.hxx b/xsd/cxx/tree/fundamental-header.hxx index 1145c0c..925d65e 100644 --- a/xsd/cxx/tree/fundamental-header.hxx +++ b/xsd/cxx/tree/fundamental-header.hxx @@ -241,7 +241,7 @@ namespace CXX traverse (SemanticGraph::AnySimpleType& t) { simple_type_ = built_in_type ( - t, L"::xsd::cxx::tree::simple_type< ", type_); + t, L"::xsd::cxx::tree::simple_type< " + char_type + L", ", type_); if (doxygen) os << "/**" << endl diff --git a/xsd/cxx/tree/options.cli b/xsd/cxx/tree/options.cli index 026e4a1..f1b343a 100644 --- a/xsd/cxx/tree/options.cli +++ b/xsd/cxx/tree/options.cli @@ -170,6 +170,13 @@ namespace CXX this option." }; + bool --generate-any-type + { + "Extract and store content of the XML Schema \cb{anyType} type as a + DOM fragment. Note that you need to initialize the Xerces-C++ runtime + if you are using this option." + }; + NarrowStrings --generate-insertion { "", diff --git a/xsd/cxx/tree/stream-extraction-source.cxx b/xsd/cxx/tree/stream-extraction-source.cxx index a1ca4bc..ceb56c1 100644 --- a/xsd/cxx/tree/stream-extraction-source.cxx +++ b/xsd/cxx/tree/stream-extraction-source.cxx @@ -321,6 +321,7 @@ namespace CXX SemanticGraph::Type& t (e.type ()); String type (etype (e)); + String tr (etraits (e)); // traits type name bool fund (false); { @@ -389,8 +390,8 @@ namespace CXX } else { - os << auto_ptr << "< " << type << " > r (new " << type << - " (s, f, this));"; + os << auto_ptr << "< " << type << " > r (" << endl + << tr << "::create (s, f, this));"; } os << "c.push_back (" << r << ");" @@ -438,8 +439,8 @@ namespace CXX } else { - os << auto_ptr << "< " << type << " > r (new " << type << - " (s, f, this));"; + os << auto_ptr << "< " << type << " > r (" << endl + << tr << "::create (s, f, this));"; } os << "this->" << member << ".set (" << r << ");" @@ -482,8 +483,8 @@ namespace CXX } else { - os << auto_ptr << "< " << type << " > r (new " << type << - " (s, f, this));"; + os << auto_ptr << "< " << type << " > r (" << endl + << tr << "::create (s, f, this));"; } os << "this->" << member << ".set (" << r << ");" @@ -507,6 +508,7 @@ namespace CXX { String const& member (emember (a)); String type (etype (a)); + String tr (etraits (a)); // traits type name bool fund (false); { @@ -530,8 +532,8 @@ namespace CXX } else { - os << "this->" << member << ".set (" << auto_ptr << "< " << - type << " > (new " << type << " (s, f, this)));"; + os << "this->" << member << ".set (" << tr << + "::create (s, f, this));"; } os << "}" // if (p) @@ -549,8 +551,8 @@ namespace CXX } else { - os << "this->" << member << ".set (" << auto_ptr << "< " << - type << " > (new " << type << " (s, f, this)));"; + os << "this->" << member << ".set (" << tr << + "::create (s, f, this));"; } os << "}"; diff --git a/xsd/cxx/tree/tree-header.cxx b/xsd/cxx/tree/tree-header.cxx index e6c2411..f0c3560 100644 --- a/xsd/cxx/tree/tree-header.cxx +++ b/xsd/cxx/tree/tree-header.cxx @@ -291,6 +291,22 @@ namespace CXX << "~" << name << " ();"; os << "};"; + + // Comparison operators. + // + if (options.generate_comparison ()) + { + os << inst_exp + << "bool" << endl + << "operator== (const " << name << "&, const " << name << "&);" + << endl; + + os << inst_exp + << "bool" << endl + << "operator!= (const " << name << "&, const " << name << "&);" + << endl + << endl; + } } private: diff --git a/xsd/cxx/tree/tree-inline.cxx b/xsd/cxx/tree/tree-inline.cxx index e6ed756..500ee73 100644 --- a/xsd/cxx/tree/tree-inline.cxx +++ b/xsd/cxx/tree/tree-inline.cxx @@ -82,6 +82,28 @@ namespace CXX << " " << base_type << " (o, f, this)" << "{" << "}"; + + // Comparison operators. + // + if (options.generate_comparison ()) + { + os << inl + << "bool" << endl + << "operator== (const " << name << "& x, " << + "const " << name << "& y)" + << "{" + << "const " << base_type << "& bx (x);" + << "return bx == y;" + << "}"; + + os << inl + << "bool" << endl + << "operator!= (const " << name << "& x, " << + "const " << name << "& y)" + << "{" + << "return !(x == y);" + << "}"; + } } private: diff --git a/xsd/cxx/tree/tree-source.cxx b/xsd/cxx/tree/tree-source.cxx index 110cb25..9524463 100644 --- a/xsd/cxx/tree/tree-source.cxx +++ b/xsd/cxx/tree/tree-source.cxx @@ -756,7 +756,13 @@ namespace CXX if (!fund) { os << auto_ptr << "< " << type << " > r (" << endl - << tr << "::create (i, f, this));" + << tr << "::create (i, f"; + + if (t.is_a () && + options.generate_any_type ()) + os << " | " << flags_type << "::extract_content"; + + os << ", this));" << endl; } } -- cgit v1.1