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 }