diff options
Diffstat (limited to 'libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx')
-rw-r--r-- | libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx | 121 |
1 files changed, 56 insertions, 65 deletions
diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx index f812797..d1cbf25 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx @@ -1,32 +1,64 @@ // file : xsd-frontend/semantic-graph/schema.cxx -// author : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> + #include <xsd-frontend/semantic-graph/schema.hxx> namespace XSDFrontend { namespace SemanticGraph { - namespace RTTI = Cult::RTTI; + // 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 ()); - using RTTI::Access; - using RTTI::TypeInfo; + 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); + } + } namespace { + using compiler::type_info; + // Uses // struct UsesInit { UsesInit () { - TypeInfo ti (typeid (Uses)); - ti.add_base (Access::public_, true, typeid (Edge)); - RTTI::insert (ti); + type_info ti (typeid (Uses)); + ti.add_base (typeid (Edge)); + insert (ti); } - } uses_init_; @@ -36,11 +68,10 @@ namespace XSDFrontend { ImpliesInit () { - TypeInfo ti (typeid (Implies)); - ti.add_base (Access::public_, true, typeid (Uses)); - RTTI::insert (ti); + type_info ti (typeid (Implies)); + ti.add_base (typeid (Uses)); + insert (ti); } - } implies_init_; @@ -50,11 +81,10 @@ namespace XSDFrontend { SourcesInit () { - TypeInfo ti (typeid (Sources)); - ti.add_base (Access::public_, true, typeid (Uses)); - RTTI::insert (ti); + type_info ti (typeid (Sources)); + ti.add_base (typeid (Uses)); + insert (ti); } - } sources_init_; @@ -64,11 +94,10 @@ namespace XSDFrontend { IncludesInit () { - TypeInfo ti (typeid (Includes)); - ti.add_base (Access::public_, true, typeid (Uses)); - RTTI::insert (ti); + type_info ti (typeid (Includes)); + ti.add_base (typeid (Uses)); + insert (ti); } - } includes_init_; @@ -78,11 +107,10 @@ namespace XSDFrontend { ImportsInit () { - TypeInfo ti (typeid (Imports)); - ti.add_base (Access::public_, true, typeid (Uses)); - RTTI::insert (ti); + type_info ti (typeid (Imports)); + ti.add_base (typeid (Uses)); + insert (ti); } - } imports_init_; @@ -92,48 +120,11 @@ namespace XSDFrontend { SchemaInit () { - TypeInfo ti (typeid (Schema)); - ti.add_base (Access::public_, true, typeid (Scope)); - RTTI::insert (ti); + type_info ti (typeid (Schema)); + ti.add_base (typeid (Scope)); + 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); - } - } } } |