// file : cli/traversal/elements.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : MIT; see accompanying LICENSE file #ifndef CLI_TRAVERSAL_ELEMENTS_HXX #define CLI_TRAVERSAL_ELEMENTS_HXX #include #include namespace traversal { 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 // struct names: edge { names () { } names (node_dispatcher& n) { node_traverser (n); } virtual void traverse (type&); }; // Nodes // struct nameable: node {}; 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) { iterate_and_dispatch (s.names_begin (), s.names_end (), d); } }; typedef scope_template scope; struct type: node {}; } #endif // CLI_TRAVERSAL_ELEMENTS_HXX