diff options
author | Jörg Frings-Fürst <jff@merkur> | 2014-05-18 16:08:14 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <jff@merkur> | 2014-05-18 16:08:14 +0200 |
commit | a15cf65c44d5c224169c32ef5495b68c758134b7 (patch) | |
tree | 3419f58fc8e1b315ba8171910ee044c5d467c162 /libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx |
Imported Upstream version 3.3.0.2upstream/3.3.0.2
Diffstat (limited to 'libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx')
-rw-r--r-- | libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx new file mode 100644 index 0000000..f812797 --- /dev/null +++ b/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx @@ -0,0 +1,139 @@ +// file : xsd-frontend/semantic-graph/schema.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <xsd-frontend/semantic-graph/schema.hxx> + +namespace XSDFrontend +{ + namespace SemanticGraph + { + namespace RTTI = Cult::RTTI; + + using RTTI::Access; + using RTTI::TypeInfo; + + namespace + { + // Uses + // + struct UsesInit + { + UsesInit () + { + TypeInfo ti (typeid (Uses)); + ti.add_base (Access::public_, true, typeid (Edge)); + RTTI::insert (ti); + } + + } uses_init_; + + + // Implies + // + struct ImpliesInit + { + ImpliesInit () + { + TypeInfo ti (typeid (Implies)); + ti.add_base (Access::public_, true, typeid (Uses)); + RTTI::insert (ti); + } + + } implies_init_; + + + // Sources + // + struct SourcesInit + { + SourcesInit () + { + TypeInfo ti (typeid (Sources)); + ti.add_base (Access::public_, true, typeid (Uses)); + RTTI::insert (ti); + } + + } sources_init_; + + + // Includes + // + struct IncludesInit + { + IncludesInit () + { + TypeInfo ti (typeid (Includes)); + ti.add_base (Access::public_, true, typeid (Uses)); + RTTI::insert (ti); + } + + } includes_init_; + + + // Imports + // + struct ImportsInit + { + ImportsInit () + { + TypeInfo ti (typeid (Imports)); + ti.add_base (Access::public_, true, typeid (Uses)); + RTTI::insert (ti); + } + + } imports_init_; + + + // Schema + // + struct SchemaInit + { + SchemaInit () + { + TypeInfo ti (typeid (Schema)); + ti.add_base (Access::public_, true, typeid (Scope)); + RTTI::insert (ti); + } + + } schema_init_; + } + + + // Schema + // + Schema::NamesIteratorPair Schema:: + find (Name const& name) const + { + // Here we are going to create an illusion that the namespace + // hierarchy is flat. + names_.clear (); + schemas_.clear (); + + find_ (name, names_, schemas_); + + return NamesIteratorPair (NamesConstIterator (names_.begin ()), + NamesConstIterator (names_.end ())); + } + + Void Schema:: + find_ (Name const& name, NamesList& names, SchemaSet& set) const + { + set.insert (this); + + // Check our own namespace first so it will end up first in the list. + // + NamesIteratorPair pair (Scope::find (name)); + names.insert (names.end (), pair.first.base (), pair.second.base ()); + + for (UsesIterator i (uses_begin ()), end (uses_end ()); i != end; ++i) + { + Schema& s (i->schema ()); + + if (set.find (&s) == set.end ()) + s.find_ (name, names, set); + } + } + } +} |