From a15cf65c44d5c224169c32ef5495b68c758134b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Sun, 18 May 2014 16:08:14 +0200 Subject: Imported Upstream version 3.3.0.2 --- .../xsd-frontend/semantic-graph/schema.cxx | 139 +++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx (limited to 'libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx') 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 +// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include + +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); + } + } + } +} -- cgit v1.2.3