diff options
Diffstat (limited to 'TAO/CIAO/CCF/CCF/IDL2/SyntaxTree/Elements.tpp')
-rw-r--r-- | TAO/CIAO/CCF/CCF/IDL2/SyntaxTree/Elements.tpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/TAO/CIAO/CCF/CCF/IDL2/SyntaxTree/Elements.tpp b/TAO/CIAO/CCF/CCF/IDL2/SyntaxTree/Elements.tpp new file mode 100644 index 00000000000..b2e7361b61f --- /dev/null +++ b/TAO/CIAO/CCF/CCF/IDL2/SyntaxTree/Elements.tpp @@ -0,0 +1,133 @@ +// file : CCF/IDL2/SyntaxTree/Elements.tpp +// author : Boris Kolpackov <boris@dre.vanderbilt.edu> +// cvs-id : $id$ + +namespace CCF +{ + namespace IDL2 + { + namespace SyntaxTree + { + // + // DeclarationRef + // + template <typename T, typename Ptr> + DeclarationRef<T, Ptr>:: + DeclarationRef (DeclarationTable const& table, ScopedName const& name) + : table_ (table), + name_ (name), + order_ (0), + initialized_ (true), + with_order_ (false) + { + } + + template <typename T, typename Ptr> + DeclarationRef<T, Ptr>:: + DeclarationRef (DeclarationTable const& table, + ScopedName const& name, + Order const& order) + : table_ (table), + name_ (name), + order_ (order), + initialized_ (true), + with_order_ (true) + { + } + + template <typename T, typename Ptr> + DeclarationRef<T, Ptr>:: + DeclarationRef (DeclarationPtr decl) + : table_ (decl->scope ()->table ()), + name_ (decl->name ()), + order_ (decl->order ()), + initialized_ (true), + with_order_ (true) + { + } + + template <typename T, typename Ptr> + DeclarationRef<T, Ptr>:: + DeclarationRef (DeclarationTable const& table) + : table_ (table), + name_ (""), + order_ (0), + initialized_ (false), + with_order_ (false) + { + } + + template <typename T, typename Ptr> + Ptr DeclarationRef<T, Ptr>:: + resolve () const throw (NotInitialized, DeclarationNotFound, TypeMismatch) + { + if (!initialized_) throw NotInitialized (); + + try + { + //@@ gcc bug + return with_order_ + ? table_.template lookup<T> (name_, order_) + : table_.template lookup<T> (name_); + } + catch (DeclarationTable::TypeMismatch const&) + { + throw TypeMismatch (); + } + catch (DeclarationTable::DeclarationNotFound const&) + { + throw DeclarationNotFound (); + } + } + + + // + // DeclarationTable + // + template <typename T> + StrictPtr<T> DeclarationTable:: + lookup (ScopedName const& n) const + throw (DeclarationNotFound, TypeMismatch) + { + IteratorPair pair = lookup (n); + + if (pair.first == pair.second) throw DeclarationNotFound (); + + for (; pair.first != pair.second; pair.first++) + { + DeclarationPtr d = (*pair.first); + + //@@ gcc bug + StrictPtr<T> p ((*pair.first)->template dynamic_type<T> ()); + + if (p != 0) return p; + } + + throw TypeMismatch (); + } + + + template <typename T> + StrictPtr<T> DeclarationTable:: + lookup (ScopedName const& n, Order const& o) const + throw (DeclarationNotFound, TypeMismatch) + { + IteratorPair pair = lookup (n); + + for (; pair.first != pair.second; pair.first++) + { + if ((*pair.first)->order () != o) continue; + + //@@ gcc bug + StrictPtr<T> p ((*pair.first)->template dynamic_type<T> ()); + + if (p != 0) return p; + + throw TypeMismatch (); + } + + throw DeclarationNotFound (); + } + } + } +} |