From 1d3f996176b9b84a7707a93bacb7befdc0390e78 Mon Sep 17 00:00:00 2001 From: boris Date: Mon, 22 Dec 2003 22:26:40 +0000 Subject: ChangeLogTag: Mon Dec 22 16:26:21 2003 Boris Kolpackov --- .../CCF/CCF/IDL2/SemanticAction/Impl/Elements.tpp | 95 ++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 TAO/CIAO/CCF/CCF/IDL2/SemanticAction/Impl/Elements.tpp (limited to 'TAO/CIAO/CCF/CCF/IDL2/SemanticAction/Impl/Elements.tpp') diff --git a/TAO/CIAO/CCF/CCF/IDL2/SemanticAction/Impl/Elements.tpp b/TAO/CIAO/CCF/CCF/IDL2/SemanticAction/Impl/Elements.tpp new file mode 100644 index 00000000000..d4dd0bbeeb9 --- /dev/null +++ b/TAO/CIAO/CCF/CCF/IDL2/SemanticAction/Impl/Elements.tpp @@ -0,0 +1,95 @@ +// file : CCF/IDL2/SemanticAction/Impl/Elements.cpp +// author : Boris Kolpackov +// cvs-id : $Id$ + +namespace CCF +{ + namespace IDL2 + { + namespace SemanticAction + { + namespace Impl + { + template + T& Base:: + resolve (SemanticGraph::ScopedName const& from, + SemanticGraph::Name const& name, + Flags flags) + throw (NotFound, NotUnique, WrongType, NotDefined, NotComplete) + { + using namespace SemanticGraph; + + try + { + ScopedName from (ctx.scope ().scoped_name ()); + Nameables nodes (Impl::resolve (ctx.tu (), from, name)); + + + if (nodes.size () != 1) throw NotUnique (); + + Nameable& node (**(nodes.begin ())); + + try + { + T& t (dynamic_cast (node)); + + if (flags & defined) + { + if (!t.defined ()) throw NotDefined (node.scoped_name ()); + } + + if (flags & complete) + { + SemanticGraph::Type& type ( + dynamic_cast (t)); + + if (!type.complete ()) + { + throw NotComplete (node.scoped_name ()); + } + } + + return t; + } + catch (std::bad_cast const&) + { + throw WrongType (node.scoped_name ()); + } + } + catch (Impl::NotFound const&) + { + throw NotFound (); + } + } + + template + void Base:: + check_inheritance (I begin, I end, SemanticGraph::Nameable& t) + throw (AlreadyInherited) + { + for (;begin != end; ++begin) + { + if ((**begin).inheritee () == t) + { + throw AlreadyInherited (t.scoped_name ()); + } + } + } + + template + void Base:: + check_support (I begin, I end, SemanticGraph::Nameable& t) + throw (AlreadySupported) + { + for (;begin != end; ++begin) + { + if ((**begin).supportee () == t) + { + throw AlreadySupported (t.scoped_name ()); + } + } + } + } + } + } +} -- cgit v1.2.1