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/tree-source.cxx | 56 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 12 deletions(-) (limited to 'xsd/cxx/tree/tree-source.cxx') 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