From 4c408a85759eb42b6b84b8cdab81453df31cd289 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 15 Dec 2011 13:09:25 +0200 Subject: Register substituting anonymous types with polymorphic maps --- xsd/cxx/tree/elements.cxx | 26 ++++++++++++++ xsd/cxx/tree/elements.hxx | 6 ++++ xsd/cxx/tree/serialization-source.cxx | 16 ++++++--- xsd/cxx/tree/stream-extraction-source.cxx | 16 ++++++--- xsd/cxx/tree/stream-insertion-source.cxx | 16 ++++++--- xsd/cxx/tree/stream-source.cxx | 16 ++++++--- xsd/cxx/tree/tree-source.cxx | 56 ++++++++++++++++++++++++------- 7 files changed, 124 insertions(+), 28 deletions(-) (limited to 'xsd/cxx') diff --git a/xsd/cxx/tree/elements.cxx b/xsd/cxx/tree/elements.cxx index 3c59e6a..0b69fff 100644 --- a/xsd/cxx/tree/elements.cxx +++ b/xsd/cxx/tree/elements.cxx @@ -622,6 +622,32 @@ namespace CXX return t.context ().get ("polymorphic"); } + Boolean Context:: + anonymous_substitutes_p (SemanticGraph::Type& t) + { + // ID/IDREF templates cannot match. + // + if (!t.named_p () && + (t.is_a () || + t.is_a ())) + return false; + + // See which elements this type classifies. + // + for (SemanticGraph::Type::ClassifiesIterator i (t.classifies_begin ()), + e (t.classifies_end ()); i != e; ++i) + { + if (SemanticGraph::Element* e = + dynamic_cast (&i->instance ())) + { + if (e->substitutes_p ()) + return true; + } + } + + return false; + } + // GenerateDefautCtor // GenerateDefaultCtor:: diff --git a/xsd/cxx/tree/elements.hxx b/xsd/cxx/tree/elements.hxx index 4977045..369dc3a 100644 --- a/xsd/cxx/tree/elements.hxx +++ b/xsd/cxx/tree/elements.hxx @@ -170,6 +170,12 @@ namespace CXX return t.context ().count ("anonymous"); } + // Return true if this anonymous type is defined in an element + // that belongs to a substitution group. + // + Boolean + anonymous_substitutes_p (SemanticGraph::Type&); + // Escaped names. // public: diff --git a/xsd/cxx/tree/serialization-source.cxx b/xsd/cxx/tree/serialization-source.cxx index 6519d32..05588bd 100644 --- a/xsd/cxx/tree/serialization-source.cxx +++ b/xsd/cxx/tree/serialization-source.cxx @@ -91,7 +91,9 @@ namespace CXX << "l << static_cast< const " << base << "& > (i);" << "}"; - // Register with type factory map. + // Register with type factory map. If this type is anonymous + // but substitutes, then it will be registered as part of the + // substitution registration. // if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) { @@ -171,7 +173,9 @@ namespace CXX << "l << static_cast< const " << base << "& > (i);" << "}"; - // Register with type factory map. + // Register with type factory map. If this type is anonymous + // but substitutes, then it will be registered as part of the + // substitution registration. // if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) { @@ -253,7 +257,9 @@ namespace CXX << "}"; - // Register with type factory map. + // Register with type factory map. If this type is anonymous + // but substitutes, then it will be registered as part of the + // substitution registration. // if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) { @@ -805,7 +811,9 @@ namespace CXX os << "}"; } - // Register with type factory map. + // Register with type factory map. If this type is anonymous + // but substitutes, then it will be registered as part of the + // substitution registration. // if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) { diff --git a/xsd/cxx/tree/stream-extraction-source.cxx b/xsd/cxx/tree/stream-extraction-source.cxx index c2bbeb0..e1d1679 100644 --- a/xsd/cxx/tree/stream-extraction-source.cxx +++ b/xsd/cxx/tree/stream-extraction-source.cxx @@ -61,7 +61,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) + if (polymorphic && + polymorphic_p (l) && + (!anonymous_p (l) || anonymous_substitutes_p (l))) { // Note that we are using the original type name. // @@ -129,7 +131,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) + if (polymorphic && + polymorphic_p (u) && + (!anonymous_p (u) || anonymous_substitutes_p (u))) { // Note that we are using the original type name. // @@ -222,7 +226,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) + if (polymorphic && + polymorphic_p (e) && + (!anonymous_p (e) || anonymous_substitutes_p (e))) { // Note that we are using the original type name. // @@ -656,7 +662,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) + if (polymorphic && + polymorphic_p (c) && + (!anonymous_p (c) || anonymous_substitutes_p (c))) { // Note that we are using the original type name. // diff --git a/xsd/cxx/tree/stream-insertion-source.cxx b/xsd/cxx/tree/stream-insertion-source.cxx index 9af8a33..00d9ae2 100644 --- a/xsd/cxx/tree/stream-insertion-source.cxx +++ b/xsd/cxx/tree/stream-insertion-source.cxx @@ -60,7 +60,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) + if (polymorphic && + polymorphic_p (l) && + (!anonymous_p (l) || anonymous_substitutes_p (l))) { // Note that we are using the original type name. // @@ -128,7 +130,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) + if (polymorphic && + polymorphic_p (u) && + (!anonymous_p (u) || anonymous_substitutes_p (u))) { // Note that we are using the original type name. // @@ -215,7 +219,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) + if (polymorphic && + polymorphic_p (e) && + (!anonymous_p (e) || anonymous_substitutes_p (e))) { // Note that we are using the original type name. // @@ -436,7 +442,9 @@ namespace CXX // Register with type map. // - if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) + if (polymorphic && + polymorphic_p (c) && + (!anonymous_p (c) || anonymous_substitutes_p (c))) { // Note that we are using the original type name. // diff --git a/xsd/cxx/tree/stream-source.cxx b/xsd/cxx/tree/stream-source.cxx index 7c4954c..1d4b5d9 100644 --- a/xsd/cxx/tree/stream-source.cxx +++ b/xsd/cxx/tree/stream-source.cxx @@ -52,7 +52,9 @@ namespace CXX // Register with ostream map. // - if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) + if (polymorphic && + polymorphic_p (l) && + (!anonymous_p (l) || anonymous_substitutes_p (l))) { // Note that we are using the original type name. // @@ -107,7 +109,9 @@ namespace CXX // Register with ostream map. // - if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) + if (polymorphic && + polymorphic_p (u) && + (!anonymous_p (u) || anonymous_substitutes_p (u))) { // Note that we are using the original type name. // @@ -185,7 +189,9 @@ namespace CXX // Register with ostream map. // - if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) + if (polymorphic && + polymorphic_p (e) && + (!anonymous_p (e) || anonymous_substitutes_p (e))) { // Note that we are using the original type name. // @@ -380,7 +386,9 @@ namespace CXX // Register with ostream map. // - if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) + if (polymorphic && + polymorphic_p (c) && + (!anonymous_p (c) || anonymous_substitutes_p (c))) { // Note that we are using the original type name. // diff --git a/xsd/cxx/tree/tree-source.cxx b/xsd/cxx/tree/tree-source.cxx index d322027..c20876b 100644 --- a/xsd/cxx/tree/tree-source.cxx +++ b/xsd/cxx/tree/tree-source.cxx @@ -105,13 +105,17 @@ namespace CXX // Register with type factory map. // - if (polymorphic && polymorphic_p (l) && !anonymous_p (l)) + if (polymorphic && polymorphic_p (l)) { // Note that we are using the original type name. // String const& name (ename (l)); - if (!options.value ()) + // If this type is anonymous but substitutes, then it will + // be registered as part of the substitution registration. + // + if (!anonymous_p (l) && !options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::type_factory_initializer< 0, " << char_type << ", " << name << " >" << endl @@ -119,13 +123,17 @@ namespace CXX << strlit (l.name ()) << "," << endl << strlit (xml_ns_name (l)) << ");" << endl; + } - if (options.value ()) + if ((!anonymous_p (l) || anonymous_substitutes_p (l)) && + options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::comparison_initializer< 0, " << char_type << ", " << name << " >" << endl << "_xsd_" << name << "_comparison_init;" << endl; + } } } @@ -212,13 +220,17 @@ namespace CXX // Register with type factory map. // - if (polymorphic && polymorphic_p (u) && !anonymous_p (u)) + if (polymorphic && polymorphic_p (u)) { // Note that we are using the original type name. // String const& name (ename (u)); - if (!options.value ()) + // If this type is anonymous but substitutes, then it will + // be registered as part of the substitution registration. + // + if (!anonymous_p (u) && !options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::type_factory_initializer< 0, " << char_type << ", " << name << " >" << endl @@ -226,13 +238,17 @@ namespace CXX << strlit (u.name ()) << "," << endl << strlit (xml_ns_name (u)) << ");" << endl; + } - if (options.value ()) + if ((!anonymous_p (u) || anonymous_substitutes_p (u)) && + options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::comparison_initializer< 0, " << char_type << ", " << name << " >" << endl << "_xsd_" << name << "_comparison_init;" << endl; + } } } }; @@ -504,13 +520,17 @@ namespace CXX // Register with type factory map. // - if (polymorphic && polymorphic_p (e) && !anonymous_p (e)) + if (polymorphic && polymorphic_p (e)) { // Note that we are using the original type name. // String const& name (ename (e)); - if (!options.value ()) + // If this type is anonymous but substitutes, then it will + // be registered as part of the substitution registration. + // + if (!anonymous_p (e) && !options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::type_factory_initializer< 0, " << char_type << ", " << name << " >" << endl @@ -518,13 +538,17 @@ namespace CXX << strlit (e.name ()) << "," << endl << strlit (xml_ns_name (e)) << ");" << endl; + } - if (options.value ()) + if ((!anonymous_p (e) || anonymous_substitutes_p (e)) && + options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::comparison_initializer< 0, " << char_type << ", " << name << " >" << endl << "_xsd_" << name << "_comparison_init;" << endl; + } } } @@ -3057,13 +3081,17 @@ namespace CXX // Register with type factory map. // - if (polymorphic && polymorphic_p (c) && !anonymous_p (c)) + if (polymorphic && polymorphic_p (c)) { // Note that we are using the original type name. // String const& name (ename (c)); - if (!options.value ()) + // If this type is anonymous but substitutes, then it will + // be registered as part of the substitution registration. + // + if (!anonymous_p (c) && !options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::type_factory_initializer< 0, " << char_type << ", " << name << " >" << endl @@ -3071,13 +3099,17 @@ namespace CXX << strlit (c.name ()) << "," << endl << strlit (xml_ns_name (c)) << ");" << endl; + } - if (options.value ()) + if ((!anonymous_p (c) || anonymous_substitutes_p (c)) && + options.value ()) + { os << "static" << endl << "const ::xsd::cxx::tree::comparison_initializer< 0, " << char_type << ", " << name << " >" << endl << "_xsd_" << name << "_comparison_init;" << endl; + } } // Comparison operators. -- cgit v1.1