Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/ThePEG/Repository/BaseRepository.tcc is written in an unsupported language. File is not indexed.

0001 // -*- C++ -*-
0002 //
0003 // BaseRepository.tcc is a part of ThePEG - Toolkit for HEP Event Generation
0004 // Copyright (C) 1999-2019 Leif Lonnblad
0005 //
0006 // ThePEG is licenced under version 3 of the GPL, see COPYING for details.
0007 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
0008 //
0009 //
0010 // This is the implementation of the non-inlined templated member
0011 // functions of the BaseRepository class.
0012 //
0013 
0014 namespace ThePEG {
0015 
0016 template <typename T>
0017 typename Ptr<T>::pointer BaseRepository::GetPtr(const T & t) {
0018   typedef typename Ptr<T>::pointer ptr;
0019   ObjectSet::iterator it = allObjects().find
0020     (IBPtr(const_cast<InterfacedBase *>(dynamic_cast<const InterfacedBase*>(&t))));
0021   return it == allObjects().end()? ptr():
0022     dynamic_ptr_cast<ptr>(*it);
0023 }
0024 
0025 template <typename PtrType>
0026 PtrType BaseRepository::GetPtr(string name) {
0027   return dynamic_ptr_cast<PtrType>(GetPointer(name));
0028 }
0029 
0030 template <typename PtrType>
0031 PtrType BaseRepository::GetObject(string name) {
0032   typedef ClassTraits<typename PtrTraits<PtrType>::value_type> Traits;
0033   IBPtr ip = GetPointer(name);
0034   if ( !ip ) throw RepositoryNotFound(name);
0035   PtrType p = dynamic_ptr_cast<PtrType>(ip);
0036   if ( !p ) throw RepositoryClassMisMatch(*ip, Traits::className());
0037   return p;
0038 }
0039 
0040 template <typename T>
0041 typename Ptr<T>::pointer BaseRepository::clone(const T & t) {
0042   typedef typename Ptr<T>::pointer ptr;
0043   const InterfacedBase & ib = t;
0044   ptr ret;
0045   try {
0046     ret = dynamic_ptr_cast<ptr>(ib.clone());
0047   }
0048   catch ( ... ) {
0049     throw BadClone(t);
0050   }
0051   if ( !ret ) throw BadClassClone(t);
0052   return ret;
0053 }
0054 
0055 template <typename T>
0056 typename Ptr<T>::pointer BaseRepository::fullclone(const T & t) {
0057   typedef typename Ptr<T>::pointer ptr;
0058   ptr ret;
0059   try {
0060     ret = dynamic_ptr_cast<ptr>(t.fullclone());
0061   }
0062   catch ( ... ) {
0063     throw BadClone(t);
0064   }
0065   if ( !ret ) throw BadClassClone(t);
0066   return ret;
0067 }
0068 
0069 template <typename Cont>
0070 vector< pair<IBPtr, const InterfaceBase *> >
0071 BaseRepository::getNonDefaultInterfaces(const Cont & c) {
0072   vector< pair<IBPtr, const InterfaceBase *> > ret;
0073   for ( typename Cont::const_iterator it = c.begin(); it != c.end(); ++it ) {
0074     InterfaceMap im = getInterfaces(typeid(**it));
0075     for ( InterfaceMap::iterator iit = im.begin(); iit != im.end(); ++iit )
0076       if ( iit->second->notDefault(**it) )
0077         ret.push_back(make_pair(*it, iit->second));
0078   }
0079   return ret;
0080 }
0081 
0082 }