diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-05-07 09:35:54 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-05-07 09:35:54 +0200 |
commit | 900cdb2da86c6a9c523bac093aef482a1f1033e3 (patch) | |
tree | e9f169568996c40924a779cdc8f0b3f8c07813e1 /xsd-frontend/traversal/elements.hxx | |
parent | 25cc7b7193999f095707028c5a315bc6bc95c82a (diff) |
Get rid of dependency on libfrontend-elements
Use libcutl facilities instead.
Diffstat (limited to 'xsd-frontend/traversal/elements.hxx')
-rw-r--r-- | xsd-frontend/traversal/elements.hxx | 150 |
1 files changed, 42 insertions, 108 deletions
diff --git a/xsd-frontend/traversal/elements.hxx b/xsd-frontend/traversal/elements.hxx index 3acb0b5..35604e8 100644 --- a/xsd-frontend/traversal/elements.hxx +++ b/xsd-frontend/traversal/elements.hxx @@ -8,7 +8,7 @@ #include <cult/types.hxx> -#include <frontend-elements/traversal.hxx> +#include <cutl/compiler/traversal.hxx> #include <xsd-frontend/semantic-graph/elements.hxx> @@ -16,150 +16,85 @@ namespace XSDFrontend { namespace Traversal { + using namespace cutl; 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<SemanticGraph::Node> NodeDispatcherBase; - typedef Bits::DispatcherBase<SemanticGraph::Edge> EdgeDispatcherBase; - + typedef compiler::dispatcher<SemanticGraph::Node> NodeDispatcher; + typedef compiler::dispatcher<SemanticGraph::Edge> EdgeDispatcher; // // - struct NodeBase : virtual Bits::Dispatcher<SemanticGraph::Node>, - virtual Bits::Dispatcher<SemanticGraph::Edge> + struct NodeBase: NodeDispatcher, EdgeDispatcher { Void - edge_traverser (EdgeDispatcherBase& d) + edge_traverser (EdgeDispatcher& d) { - Bits::Dispatcher<SemanticGraph::Edge>::traverser (d); + EdgeDispatcher::traverser (d); } - EdgeDispatcherBase& + EdgeDispatcher& edge_traverser () { return *this; } - public: - using Bits::Dispatcher<SemanticGraph::Node>::dispatch; - using Bits::Dispatcher<SemanticGraph::Edge>::dispatch; - - using Bits::Dispatcher<SemanticGraph::Node>::map; - - using Bits::Dispatcher<SemanticGraph::Edge>::iterate_and_dispatch; - }; - - - // - // - template <typename T> - struct Node : Bits::TraverserBase<SemanticGraph::Node>, virtual NodeBase - { - typedef - T - Type; - - Node () - { - map (typeid (Type), *this); - } - - virtual Void - traverse (Type&) = 0; - - virtual Void - trampoline (SemanticGraph::Node& i) - { - traverse (dynamic_cast<Type&> (i)); - } + using NodeDispatcher::dispatch; + using EdgeDispatcher::dispatch; - virtual Void - trampoline (SemanticGraph::Node const&) - { - abort (); - } + using EdgeDispatcher::iterate_and_dispatch; }; - - // - // - struct EdgeBase : virtual Bits::Dispatcher<SemanticGraph::Edge>, - virtual Bits::Dispatcher<SemanticGraph::Node> + struct EdgeBase: EdgeDispatcher, NodeDispatcher { Void - node_traverser (NodeDispatcherBase& d) + node_traverser (NodeDispatcher& d) { - Bits::Dispatcher<SemanticGraph::Node>::traverser (d); + NodeDispatcher::traverser (d); } - NodeDispatcherBase& + NodeDispatcher& node_traverser () { return *this; } - public: - using Bits::Dispatcher<SemanticGraph::Edge>::dispatch; - using Bits::Dispatcher<SemanticGraph::Node>::dispatch; - - using Bits::Dispatcher<SemanticGraph::Edge>::map; - - using Bits::Dispatcher<SemanticGraph::Node>::iterate_and_dispatch; - }; - - template <typename T> - struct Edge : Bits::TraverserBase<SemanticGraph::Edge>, virtual EdgeBase - { - typedef - T - Type; - - Edge () - { - map (typeid (Type), *this); - } - - virtual Void - traverse (Type&) = 0; - - virtual Void - trampoline (SemanticGraph::Edge& i) - { - traverse (dynamic_cast<Type&> (i)); - } + using EdgeDispatcher::dispatch; + using NodeDispatcher::dispatch; - 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 <typename T> + struct Node: compiler::traverser_impl<T, SemanticGraph::Node>, + virtual NodeBase + { + typedef T Type; + }; + + template <typename T> + struct Edge: compiler::traverser_impl<T, SemanticGraph::Edge>, + virtual EdgeBase + { + typedef T Type; + }; + + // // Edges // @@ -204,11 +139,10 @@ namespace XSDFrontend } }; - + // // Nodes // - // // struct Nameable : Node<SemanticGraph::Nameable> @@ -231,7 +165,7 @@ namespace XSDFrontend template<typename X> Void names (T& s, - EdgeDispatcherBase& d, + EdgeDispatcher& d, Void (X::*pre_) (T&) = (Void (ScopeTemplate<T>::*)(T&)) (0), Void (X::*post_) (T&) = (Void (ScopeTemplate<T>::*)(T&)) (0), Void (X::*none_) (T&) = (Void (ScopeTemplate<T>::*)(T&)) (0), @@ -267,7 +201,7 @@ namespace XSDFrontend } virtual Void - names (T& s, EdgeDispatcherBase& d) + names (T& s, EdgeDispatcher& d) { names<ScopeTemplate<T> > (s, d); } @@ -332,7 +266,7 @@ namespace XSDFrontend pre (Type&); virtual Void - belongs (Type&, EdgeDispatcherBase&); + belongs (Type&, EdgeDispatcher&); virtual Void belongs (Type&); @@ -353,7 +287,7 @@ namespace XSDFrontend pre (Type&); virtual Void - belongs (Type&, EdgeDispatcherBase&); + belongs (Type&, EdgeDispatcher&); virtual Void belongs (Type&); |