From e2eff99775d348fd11a59de0d3952d593dbaa65f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 10 Dec 2015 16:23:38 +0200 Subject: Use derived (variadic) return type in polymorphic type post_*() callbacks We cannot use the base return type since it is not assigned (by the type processor) for types that are in included/imported schemas. --- xsde/cxx/hybrid/parser-header.cxx | 33 ++++++++++++++++++--------------- xsde/cxx/hybrid/parser-source.cxx | 39 +++++++++++++-------------------------- 2 files changed, 31 insertions(+), 41 deletions(-) (limited to 'xsde/cxx') diff --git a/xsde/cxx/hybrid/parser-header.cxx b/xsde/cxx/hybrid/parser-header.cxx index 340fd37..b950130 100644 --- a/xsde/cxx/hybrid/parser-header.cxx +++ b/xsde/cxx/hybrid/parser-header.cxx @@ -13,14 +13,10 @@ namespace CXX { namespace { - // - // struct PostOverride: Traversal::Complex, Context { - PostOverride (Context& c) - : Context (c) - { - } + PostOverride (Context& c, SemanticGraph::Complex& scope) + : Context (c), scope_ (scope) {} virtual void traverse (SemanticGraph::Complex& c) @@ -34,12 +30,18 @@ namespace CXX if (tiein) dispatch (b); - os << "virtual " << pret_type (b) << endl + // Use variadic return type since base return type (pret_type) + // is not set for types in included/imported schemas. + // + os << "virtual " << pret_type (scope_) << endl << post_name (b) << " ();" << endl; } } } + + private: + SemanticGraph::Complex& scope_; }; // @@ -47,7 +49,7 @@ namespace CXX struct Enumeration: Traversal::Enumeration, Context { Enumeration (Context& c, Traversal::Complex& complex) - : Context (c), complex_ (complex), post_override_ (c) + : Context (c), complex_ (complex) { } @@ -151,7 +153,10 @@ namespace CXX String const& ret (pret_type (e)); if (polymorphic (e)) - post_override_.dispatch (e); + { + PostOverride po (*this, e); + po.dispatch (e); + } os << "virtual " << ret << endl << post_name (e) << " ();" @@ -221,7 +226,6 @@ namespace CXX private: Traversal::Complex& complex_; - PostOverride post_override_; }; struct List: Traversal::List, Context @@ -566,8 +570,6 @@ namespace CXX { Complex (Context& c) : Context (c), - post_override_ (c), - // State. // compositor_state_ (c), @@ -687,7 +689,10 @@ namespace CXX // post // if (polymorphic (c)) - post_override_.dispatch (c); + { + PostOverride po (*this, c); + po.dispatch (c); + } os << "virtual " << ret << endl << post_name (c) << " ();" @@ -763,8 +768,6 @@ namespace CXX } private: - PostOverride post_override_; - // State. // CompositorState compositor_state_; diff --git a/xsde/cxx/hybrid/parser-source.cxx b/xsde/cxx/hybrid/parser-source.cxx index ed68c4f..2cc4dfa 100644 --- a/xsde/cxx/hybrid/parser-source.cxx +++ b/xsde/cxx/hybrid/parser-source.cxx @@ -13,26 +13,14 @@ namespace CXX { namespace { - // - // struct PostOverride: Traversal::Complex, Context { - PostOverride (Context& c) - : Context (c), scope_ (0) - { - } + PostOverride (Context& c, SemanticGraph::Complex& scope) + : Context (c), scope_ (scope) {} virtual void traverse (SemanticGraph::Complex& c) { - bool clear (false); - - if (scope_ == 0) - { - scope_ = &c; - clear = true; - } - if (c.inherits_p ()) { SemanticGraph::Type& b (c.inherits ().base ()); @@ -42,22 +30,19 @@ namespace CXX if (tiein) dispatch (b); - String const& scope (epimpl_custom (*scope_)); + String const& scope (epimpl_custom (scope_)); - os << pret_type (b) << " " << scope << "::" << endl + os << pret_type (scope_) << " " << scope << "::" << endl << post_name (b) << " ()" << "{" << "return this->" << post_name (c) << " ();" << "}"; } } - - if (clear) - scope_ = 0; } private: - SemanticGraph::Complex* scope_; + SemanticGraph::Complex& scope_; }; // @@ -89,7 +74,6 @@ namespace CXX Enumeration (Context& c, Traversal::Complex& complex) : Context (c), complex_ (complex), - post_override_ (c), enumerator_ (c) { names_ >> enumerator_; @@ -404,7 +388,10 @@ namespace CXX String const& ret (pret_type (e)); if (polymorphic (e)) - post_override_.dispatch (e); + { + PostOverride po (*this, e); + po.dispatch (e); + } os << ret << " " << name << "::" << endl << post_name (e) << " ()" @@ -493,7 +480,6 @@ namespace CXX private: Traversal::Complex& complex_; - PostOverride post_override_; Traversal::Names names_; Enumerator enumerator_; @@ -1587,7 +1573,6 @@ namespace CXX Complex (Context& c) : Context (c), base_name_ (c, TypeName::base), - post_override_ (c), compositor_callback_ (c), particle_callback_ (c), attribute_callback_ (c) @@ -1984,7 +1969,10 @@ namespace CXX // post // if (polymorphic (c)) - post_override_.dispatch (c); + { + PostOverride po (*this, c); + po.dispatch (c); + } os << ret << " " << name << "::" << endl << post_name (c) << " ()" @@ -2076,7 +2064,6 @@ namespace CXX private: TypeName base_name_; - PostOverride post_override_; CompositorCallback compositor_callback_; ParticleCallback particle_callback_; -- cgit v1.1