// file : xsd-frontend/traversal/elements.hxx // 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 namespace XSDFrontend { namespace Traversal { using namespace cutl; typedef compiler::dispatcher NodeDispatcher; typedef compiler::dispatcher EdgeDispatcher; // // struct NodeBase: NodeDispatcher, EdgeDispatcher { void edge_traverser (EdgeDispatcher& d) { EdgeDispatcher::traverser (d); } EdgeDispatcher& edge_traverser () { return *this; } using NodeDispatcher::dispatch; using EdgeDispatcher::dispatch; using EdgeDispatcher::iterate_and_dispatch; }; struct EdgeBase: EdgeDispatcher, NodeDispatcher { void node_traverser (NodeDispatcher& d) { NodeDispatcher::traverser (d); } NodeDispatcher& node_traverser () { return *this; } using EdgeDispatcher::dispatch; using NodeDispatcher::dispatch; using NodeDispatcher::iterate_and_dispatch; }; inline EdgeBase& operator>> (NodeBase& n, EdgeBase& e) { n.edge_traverser (e); return e; } 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 // // // struct Names : Edge { Names () { } Names (NodeBase& n) { node_traverser (n); } virtual void traverse (Type& e) { dispatch (e.named ()); } }; // // struct Belongs : Edge { Belongs () { } Belongs (NodeBase& n) { node_traverser (n); } virtual void traverse (Type& e) { dispatch (e.type ()); } }; // // Nodes // // // struct Nameable : Node { }; // // template struct ScopeTemplate : Node { public: virtual void traverse (T& s) { names (s); } template void names (T& s, 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)); typename T::NamesIterator b (s.names_begin ()), e (s.names_end ()); if (b != e) { if (pre_) (this_->*pre_) (s); //iterate_and_dispatch (b, e, d, *this_, next_, s); for (; b != s.names_end ();) { d.dispatch (*b); if (++b != s.names_end () && next_ != 0) (this_->*next_) (s); } if (post_) (this_->*post_) (s); } else { if (none_) (this_->*none_) (s); } } virtual void names (T& s, EdgeDispatcher& d) { names > (s, d); } virtual void names (T& s) { names (s, *this, &ScopeTemplate::names_pre, &ScopeTemplate::names_post, &ScopeTemplate::names_none, &ScopeTemplate::names_next); } virtual void names_pre (T&) { } virtual void names_next (T&) { } virtual void names_post (T&) { } virtual void names_none (T&) { } }; // // typedef ScopeTemplate Scope; // // struct Type : Node { virtual void traverse (SemanticGraph::Type&) = 0; }; // // struct Instance : Node { virtual void traverse (Type&); virtual void pre (Type&); virtual void belongs (Type&, EdgeDispatcher&); virtual void belongs (Type&); virtual void post (Type&); }; // // struct Member : Node { virtual void traverse (Type&); virtual void pre (Type&); virtual void belongs (Type&, EdgeDispatcher&); virtual void belongs (Type&); virtual void post (Type&); }; // // struct Inherits : Edge { Inherits () { } Inherits (NodeBase& n) { node_traverser (n); } virtual void traverse (Type& e) { dispatch (e.base ()); } }; // // struct Extends : Edge { Extends () { } Extends (NodeBase& n) { node_traverser (n); } virtual void traverse (Type& e) { dispatch (e.base ()); } }; // // struct Restricts : Edge { Restricts () { } Restricts (NodeBase& n) { node_traverser (n); } virtual void traverse (Type& e) { dispatch (e.base ()); } }; // // struct Argumented : Edge { Argumented () { } Argumented (NodeBase& n) { node_traverser (n); } virtual void traverse (Type& a) { dispatch (a.type ()); } }; /* // // struct Contains : Edge { virtual void traverse (Type& e) { dispatch (e.element ()); } }; */ // // typedef Node AnyType; // // typedef Node AnySimpleType; } } #include #endif // XSD_FRONTEND_TRAVERSAL_ELEMENTS_HXX