From 8286ac511144e4f17d34eac9affb97e50646344a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Wed, 23 Jul 2014 15:25:44 +0200 Subject: Imported Upstream version 4.0.0 --- .../xsd-frontend/traversal/elements.hxx | 221 +++++++-------------- 1 file changed, 76 insertions(+), 145 deletions(-) (limited to 'libxsd-frontend/xsd-frontend/traversal/elements.hxx') diff --git a/libxsd-frontend/xsd-frontend/traversal/elements.hxx b/libxsd-frontend/xsd-frontend/traversal/elements.hxx index c405a1b..bd1dd70 100644 --- a/libxsd-frontend/xsd-frontend/traversal/elements.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/elements.hxx @@ -1,165 +1,97 @@ // file : xsd-frontend/traversal/elements.hxx -// author : Boris Kolpackov -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #ifndef XSD_FRONTEND_TRAVERSAL_ELEMENTS_HXX #define XSD_FRONTEND_TRAVERSAL_ELEMENTS_HXX -#include - -#include +#include +#include #include namespace XSDFrontend { namespace Traversal { - using namespace Cult::Types; - - namespace Bits - { - using FrontendElements::Traversal::TraverserBase; - using FrontendElements::Traversal::Traverser; - - using FrontendElements::Traversal::DispatcherBase; - using FrontendElements::Traversal::Dispatcher; - - } - - typedef Bits::DispatcherBase NodeDispatcherBase; - typedef Bits::DispatcherBase EdgeDispatcherBase; + using namespace cutl; + typedef compiler::dispatcher NodeDispatcher; + typedef compiler::dispatcher EdgeDispatcher; // // - struct NodeBase : virtual Bits::Dispatcher, - virtual Bits::Dispatcher + struct NodeBase: NodeDispatcher, EdgeDispatcher { - Void - edge_traverser (EdgeDispatcherBase& d) + void + edge_traverser (EdgeDispatcher& d) { - Bits::Dispatcher::traverser (d); + EdgeDispatcher::traverser (d); } - EdgeDispatcherBase& + EdgeDispatcher& edge_traverser () { return *this; } - public: - using Bits::Dispatcher::dispatch; - using Bits::Dispatcher::dispatch; - - using Bits::Dispatcher::map; - - using Bits::Dispatcher::iterate_and_dispatch; - }; - - - // - // - template - struct Node : Bits::TraverserBase, virtual NodeBase - { - typedef - T - Type; - - Node () - { - map (typeid (Type), *this); - } - - virtual Void - traverse (Type&) = 0; + using NodeDispatcher::dispatch; + using EdgeDispatcher::dispatch; - virtual Void - trampoline (SemanticGraph::Node& i) - { - traverse (dynamic_cast (i)); - } - - virtual Void - trampoline (SemanticGraph::Node const&) - { - abort (); - } + using EdgeDispatcher::iterate_and_dispatch; }; - - // - // - struct EdgeBase : virtual Bits::Dispatcher, - virtual Bits::Dispatcher + struct EdgeBase: EdgeDispatcher, NodeDispatcher { - Void - node_traverser (NodeDispatcherBase& d) + void + node_traverser (NodeDispatcher& d) { - Bits::Dispatcher::traverser (d); + NodeDispatcher::traverser (d); } - NodeDispatcherBase& + NodeDispatcher& node_traverser () { return *this; } - public: - using Bits::Dispatcher::dispatch; - using Bits::Dispatcher::dispatch; + using EdgeDispatcher::dispatch; + using NodeDispatcher::dispatch; - using Bits::Dispatcher::map; - - using Bits::Dispatcher::iterate_and_dispatch; - }; - - template - struct Edge : Bits::TraverserBase, virtual EdgeBase - { - typedef - T - Type; - - Edge () - { - map (typeid (Type), *this); - } - - virtual Void - traverse (Type&) = 0; - - virtual Void - trampoline (SemanticGraph::Edge& i) - { - traverse (dynamic_cast (i)); - } - - virtual Void - trampoline (SemanticGraph::Edge const&) - { - abort (); - } + using NodeDispatcher::iterate_and_dispatch; }; - inline - EdgeBase& + inline EdgeBase& operator>> (NodeBase& n, EdgeBase& e) { n.edge_traverser (e); return e; } - inline - NodeBase& + inline NodeBase& operator>> (EdgeBase& e, NodeBase& n) { e.node_traverser (n); return n; } + // + // + template + struct Node: compiler::traverser_impl, + virtual NodeBase + { + typedef T Type; + }; + + template + struct Edge: compiler::traverser_impl, + virtual EdgeBase + { + typedef T Type; + }; + + // // Edges // @@ -176,7 +108,7 @@ namespace XSDFrontend node_traverser (n); } - virtual Void + virtual void traverse (Type& e) { dispatch (e.named ()); @@ -197,18 +129,17 @@ namespace XSDFrontend node_traverser (n); } - virtual Void + virtual void traverse (Type& e) { dispatch (e.type ()); } }; - + // // Nodes // - // // struct Nameable : Node @@ -222,20 +153,20 @@ namespace XSDFrontend struct ScopeTemplate : Node { public: - virtual Void + virtual void traverse (T& s) { names (s); } template - Void + void names (T& s, - EdgeDispatcherBase& d, - Void (X::*pre_) (T&) = (Void (ScopeTemplate::*)(T&)) (0), - Void (X::*post_) (T&) = (Void (ScopeTemplate::*)(T&)) (0), - Void (X::*none_) (T&) = (Void (ScopeTemplate::*)(T&)) (0), - Void (X::*next_) (T&) = (Void (ScopeTemplate::*)(T&)) (0)) + EdgeDispatcher& d, + void (X::*pre_) (T&) = (void (ScopeTemplate::*)(T&)) (0), + void (X::*post_) (T&) = (void (ScopeTemplate::*)(T&)) (0), + void (X::*none_) (T&) = (void (ScopeTemplate::*)(T&)) (0), + void (X::*next_) (T&) = (void (ScopeTemplate::*)(T&)) (0)) { X* this_ (dynamic_cast (this)); @@ -266,13 +197,13 @@ namespace XSDFrontend } } - virtual Void - names (T& s, EdgeDispatcherBase& d) + virtual void + names (T& s, EdgeDispatcher& d) { names > (s, d); } - virtual Void + virtual void names (T& s) { names (s, @@ -283,22 +214,22 @@ namespace XSDFrontend &ScopeTemplate::names_next); } - virtual Void + virtual void names_pre (T&) { } - virtual Void + virtual void names_next (T&) { } - virtual Void + virtual void names_post (T&) { } - virtual Void + virtual void names_none (T&) { } @@ -316,7 +247,7 @@ namespace XSDFrontend // struct Type : Node { - virtual Void + virtual void traverse (SemanticGraph::Type&) = 0; }; @@ -325,19 +256,19 @@ namespace XSDFrontend // struct Instance : Node { - virtual Void + virtual void traverse (Type&); - virtual Void + virtual void pre (Type&); - virtual Void - belongs (Type&, EdgeDispatcherBase&); + virtual void + belongs (Type&, EdgeDispatcher&); - virtual Void + virtual void belongs (Type&); - virtual Void + virtual void post (Type&); }; @@ -346,19 +277,19 @@ namespace XSDFrontend // struct Member : Node { - virtual Void + virtual void traverse (Type&); - virtual Void + virtual void pre (Type&); - virtual Void - belongs (Type&, EdgeDispatcherBase&); + virtual void + belongs (Type&, EdgeDispatcher&); - virtual Void + virtual void belongs (Type&); - virtual Void + virtual void post (Type&); }; @@ -376,7 +307,7 @@ namespace XSDFrontend node_traverser (n); } - virtual Void + virtual void traverse (Type& e) { dispatch (e.base ()); @@ -397,7 +328,7 @@ namespace XSDFrontend node_traverser (n); } - virtual Void + virtual void traverse (Type& e) { dispatch (e.base ()); @@ -418,7 +349,7 @@ namespace XSDFrontend node_traverser (n); } - virtual Void + virtual void traverse (Type& e) { dispatch (e.base ()); @@ -439,7 +370,7 @@ namespace XSDFrontend node_traverser (n); } - virtual Void + virtual void traverse (Type& a) { dispatch (a.type ()); @@ -452,7 +383,7 @@ namespace XSDFrontend // struct Contains : Edge { - virtual Void + virtual void traverse (Type& e) { dispatch (e.element ()); -- cgit v1.2.3