diff options
Diffstat (limited to 'libxsd-frontend/xsd-frontend/semantic-graph/elements.cxx')
-rw-r--r-- | libxsd-frontend/xsd-frontend/semantic-graph/elements.cxx | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/elements.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/elements.cxx new file mode 100644 index 0000000..fa48a9a --- /dev/null +++ b/libxsd-frontend/xsd-frontend/semantic-graph/elements.cxx @@ -0,0 +1,299 @@ +// file : xsd-frontend/semantic-graph/elements.cxx +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <algorithm> + +#include <cutl/compiler/type-info.hxx> + +#include <xsd-frontend/semantic-graph/elements.hxx> +#include <xsd-frontend/semantic-graph/annotation.hxx> + +using namespace std; + +namespace XSDFrontend +{ + namespace SemanticGraph + { + // Node + // + Annotation& Node:: + annotation () + { + return annotates_->annotation (); + } + + // Type + // + void Type:: + remove_edge_left (Arguments& a) + { + ArgumentsSet::iterator i (arguments_.find (&a)); + assert (i != arguments_.end ()); + arguments_.erase (i); + } + + // Specialization + // + void Specialization:: + remove_edge_right (Arguments& a) + { + // The number of entries should be small so linear search will do. + // + Argumented::iterator i ( + std::find (argumented_.begin (), argumented_.end (), &a)); + + assert (i != argumented_.end ()); + argumented_.erase (i); + } + + using compiler::type_info; + + namespace + { + // Edge + // + struct EdgeInit + { + EdgeInit () + { + type_info ti (typeid (Edge)); + insert (ti); + } + } edge_init_; + + // Node + // + struct NodeInit + { + NodeInit () + { + type_info ti (typeid (Node)); + insert (ti); + } + } node_init_; + + // Names + // + struct NamesInit + { + NamesInit () + { + type_info ti (typeid (Names)); + ti.add_base (typeid (Edge)); + insert (ti); + } + } names_init_; + + // Nameable + // + struct NameableInit + { + NameableInit () + { + type_info ti (typeid (Nameable)); + ti.add_base (typeid (Node)); + insert (ti); + } + } nameable_init_; + + // Scope + // + struct ScopeInit + { + ScopeInit () + { + type_info ti (typeid (Scope)); + ti.add_base (typeid (Nameable)); + insert (ti); + } + } scope_init_; + + // Type + // + struct TypeInit + { + TypeInit () + { + type_info ti (typeid (Type)); + ti.add_base (typeid (Nameable)); + insert (ti); + } + } type_init_; + + // Instance + // + struct InstanceInit + { + InstanceInit () + { + type_info ti (typeid (Instance)); + ti.add_base (typeid (Nameable)); + insert (ti); + } + } instance_init_; + + // Belongs + // + struct BelongsInit + { + BelongsInit () + { + type_info ti (typeid (Belongs)); + ti.add_base (typeid (Edge)); + insert (ti); + } + } belongs_init_; + + // Inherits + // + struct InheritsInit + { + InheritsInit () + { + type_info ti (typeid (Inherits)); + ti.add_base (typeid (Edge)); + insert (ti); + } + } inherits_init_; + + // Extends + // + struct ExtendsInit + { + ExtendsInit () + { + type_info ti (typeid (Extends)); + ti.add_base (typeid (Inherits)); + insert (ti); + } + } extends_init_; + + // Restricts + // + struct RestrictsInit + { + RestrictsInit () + { + type_info ti (typeid (Restricts)); + ti.add_base (typeid (Inherits)); + insert (ti); + } + } restricts_init_; + + // BelongsToNamespace + // + struct BelongsToNamespaceInit + { + BelongsToNamespaceInit () + { + type_info ti (typeid (BelongsToNamespace)); + ti.add_base (typeid (Edge)); + insert (ti); + } + } belongs_to_namespace_init_; + + // Member + // + struct MemberInit + { + MemberInit () + { + type_info ti (typeid (Member)); + ti.add_base (typeid (Instance)); + insert (ti); + } + } member_init_; + + // Specialization + // + struct SpecializationInit + { + SpecializationInit () + { + type_info ti (typeid (Specialization)); + ti.add_base (typeid (Type)); + insert (ti); + } + } specialization_init_; + + // Arguments + // + struct ArgumentsInit + { + ArgumentsInit () + { + type_info ti (typeid (Arguments)); + ti.add_base (typeid (Edge)); + insert (ti); + } + } arguments_init_; + + /* + // Contains + // + struct ContainsInit + { + ContainsInit () + { + type_info ti (typeid (Contains)); + ti.add_base (typeid (Edge)); + insert (ti); + } + } contains_init_; + + // Container + // + struct ContainerInit + { + ContainerInit () + { + type_info ti (typeid (Container)); + ti.add_base (typeid (Node)); + insert (ti); + } + } container_init_; + */ + + // AnyType + // + struct AnyTypeInit + { + AnyTypeInit () + { + type_info ti (typeid (AnyType)); + ti.add_base (typeid (SemanticGraph::Type)); + insert (ti); + } + } any_type_init_; + + // AnySimpleType + // + struct AnySimpleTypeInit + { + AnySimpleTypeInit () + { + type_info ti (typeid (AnySimpleType)); + ti.add_base (typeid (Type)); + insert (ti); + } + } any_simple_type_init_; + } + + // Instance + // + Type& Instance:: + type () const + { + return belongs ().type (); + } + } +} + +// Path +// +std::wostream& +operator<< (std::wostream& os, XSDFrontend::SemanticGraph::Path const& path) +{ + return os << path.string ().c_str (); +} |