// file : odb/traversal/relational/elements.hxx // copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC // license : GNU GPL v3; see accompanying LICENSE file #ifndef ODB_TRAVERSAL_RELATIONAL_ELEMENTS_HXX #define ODB_TRAVERSAL_RELATIONAL_ELEMENTS_HXX #include #include namespace traversal { namespace relational { using namespace cutl; // // typedef compiler::dispatcher node_dispatcher; typedef compiler::dispatcher edge_dispatcher; // // struct node_base: node_dispatcher, edge_dispatcher { void edge_traverser (edge_dispatcher& d) { edge_dispatcher::traverser (d); } edge_dispatcher& edge_traverser () { return *this; } using node_dispatcher::dispatch; using edge_dispatcher::dispatch; using edge_dispatcher::iterate_and_dispatch; }; struct edge_base: edge_dispatcher, node_dispatcher { void node_traverser (node_dispatcher& d) { node_dispatcher::traverser (d); } node_dispatcher& node_traverser () { return *this; } using edge_dispatcher::dispatch; using node_dispatcher::dispatch; using node_dispatcher::iterate_and_dispatch; }; inline edge_base& operator>> (node_base& n, edge_base& e) { n.edge_traverser (e); return e; } inline node_base& operator>> (edge_base& e, node_base& n) { e.node_traverser (n); return n; } // // template struct node: compiler::traverser_impl, virtual node_base { }; template struct edge: compiler::traverser_impl, virtual edge_base { }; // // Edges // template struct names: edge > { names () { } names (node_dispatcher& n) { this->node_traverser (n); } virtual void traverse (semantics::relational::names& e) { this->dispatch (e.nameable ()); } }; typedef names unames; typedef names qnames; // // Nodes // template struct nameable: node > {}; typedef nameable unameable; typedef nameable qnameable; // // template struct scope_template: node { public: virtual void traverse (T& s) { names (s); } virtual void names (T& s) { names (s, *this); } virtual void names (T& s, edge_dispatcher& d) { this->iterate_and_dispatch (s.names_begin (), s.names_end (), d); } }; template struct scope: scope_template > {}; typedef scope uscope; typedef scope qscope; } } #endif // ODB_TRAVERSAL_RELATIONAL_ELEMENTS_HXX