diff options
Diffstat (limited to 'libxsd-frontend/xsd-frontend/semantic-graph/schema.hxx')
| -rw-r--r-- | libxsd-frontend/xsd-frontend/semantic-graph/schema.hxx | 237 | 
1 files changed, 237 insertions, 0 deletions
| diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/schema.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/schema.hxx new file mode 100644 index 0000000..803c870 --- /dev/null +++ b/libxsd-frontend/xsd-frontend/semantic-graph/schema.hxx @@ -0,0 +1,237 @@ +// file      : xsd-frontend/semantic-graph/schema.hxx +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef XSD_FRONTEND_SEMANTIC_GRAPH_SCHEMA_HXX +#define XSD_FRONTEND_SEMANTIC_GRAPH_SCHEMA_HXX + +#include <set> +#include <vector> + +#include <xsd-frontend/semantic-graph/elements.hxx> +#include <xsd-frontend/semantic-graph/namespace.hxx> + +namespace XSDFrontend +{ +  namespace SemanticGraph +  { +    class Schema; + +    class Uses: public virtual Edge +    { +    public: +      Schema& +      user () const +      { +        return *user_; +      } + +      Schema& +      schema () const +      { +        return *schema_; +      } + +      Path +      path () const +      { +        return path_; +      } + +    public: +      Uses (Path const& path): path_ (path) {} + +      void +      set_left_node (Schema& s) +      { +        user_ = &s; +      } + +      void +      set_right_node (Schema& s) +      { +        schema_ = &s; +      } + +    private: +      Path path_; +      Schema* user_; +      Schema* schema_; +    }; + + +    // +    // +    class Implies: public virtual Uses +    { +    public: +      Implies (Path const& path): Uses (path) {} +    }; + + +    // +    // +    class Sources: public virtual Uses +    { +    public: +      Sources (Path const& path): Uses (path) {} +    }; + + +    // +    // +    class Includes: public virtual Uses +    { +    public: +      Includes (Path const& path): Uses (path) {} +    }; + + +    // +    // +    class Imports: public virtual Uses +    { +    public: +      Imports (Path const& path): Uses (path) {} +    }; + +    // +    // +    class Schema: public graph, public virtual Scope +    { +      typedef std::vector<Uses*> UsesList; +      typedef std::vector<Uses*> UsedList; + +    public: +      Schema (Path const& file, unsigned long line, unsigned long column) +          : Node (file, line, column), graph_ (*this) +      { +      } + +    private: +      Schema (Schema const&); +      Schema& operator= (Schema const&); + +    public: +      typedef pointer_iterator<UsesList::const_iterator> UsesIterator; + +      UsesIterator +      uses_begin () const +      { +        return uses_.begin (); +      } + +      UsesIterator +      uses_end () const +      { +        return uses_.end (); +      } + +    public: +      typedef pointer_iterator<UsedList::const_iterator> UsedIterator; + +      UsedIterator +      used_begin () const +      { +        return used_.begin (); +      } + +      UsedIterator +      used_end () const +      { +        return used_.end (); +      } + +      bool +      used_p () const +      { +        return used_begin () != used_end (); +      } + +      virtual NamesIteratorPair +      find (Name const& name) const; + +    public: +      using graph::new_edge; +      using graph::reset_left_node; +      using graph::reset_right_node; +      using graph::add_edge_left; +      using graph::add_edge_right; +      using graph::delete_node; +      using graph::delete_edge; + +      template <typename T> +      T& +      new_node (Path const& file, unsigned long line, unsigned long column) +      { +        return graph_.new_node<T> (file, line, column); +      } + +      template <typename T, typename A0> +      T& +      new_node (Path const& file, unsigned long line, unsigned long column, +                A0 const& a0) +      { +        return graph_.new_node<T> (file, line, column, a0); +      } + +      template <typename T, typename A0, typename A1> +      T& +      new_node (Path const& file, unsigned long line, unsigned long column, +                A0 const& a0, A1 const& a1) +      { +        return graph_.new_node<T> (file, line, column, a0, a1); +      } + +      template <typename T, typename A0, typename A1, typename A2> +      T& +      new_node (Path const& file, unsigned long line, unsigned long column, +                A0 const& a0, A1 const& a1, A2 const& a2) +      { +        return graph_.new_node<T> (file, line, column, a0, a1, a2); +      } + +      template <typename T, typename A0, typename A1, typename A2, +                typename A3> +      T& +      new_node (Path const& file, unsigned long line, unsigned long column, +                A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3) +      { +        return graph_.new_node<T> (file, line, column, a0, a1, a2, a3); +      } + +    public: +      using Scope::add_edge_left; +      using Node::add_edge_right; + +      void +      add_edge_left (Uses& e) +      { +        uses_.push_back (&e); +      } + +      void +      add_edge_right (Uses& e) +      { +        used_.push_back (&e); +      } + +    private: +      typedef std::set<Schema const*> SchemaSet; + +      void +      find_ (Name const& name, NamesList&, SchemaSet&) const; + +    private: +      graph& graph_; + +      UsesList uses_; +      UsedList used_; + +      mutable NamesList names_; +      mutable SchemaSet schemas_; +    }; +  } +} + +#endif  // XSD_FRONTEND_SEMANTIC_GRAPH_SCHEMA_HXX | 
