aboutsummaryrefslogtreecommitdiff
path: root/xsd-frontend/traversal/elements.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-05-07 09:35:54 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-05-07 09:35:54 +0200
commit900cdb2da86c6a9c523bac093aef482a1f1033e3 (patch)
treee9f169568996c40924a779cdc8f0b3f8c07813e1 /xsd-frontend/traversal/elements.hxx
parent25cc7b7193999f095707028c5a315bc6bc95c82a (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.hxx150
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&);