00001 #ifndef DataFormats_Common_FwdPtr_h 00002 #define DataFormats_Common_FwdPtr_h 00003 // -*- C++ -*- 00004 // 00005 // Package: Common 00006 // Class : FwdPtr 00007 // 00016 // 00017 // Original Author: Salvatore Rappoccio 00018 // Created: Fri Feb 5 14:58:49 CST 2010 00019 // 00020 00021 // system include files 00022 #include "boost/type_traits/is_base_of.hpp" 00023 #include "boost/utility/enable_if.hpp" 00024 00025 // user include files 00026 #include "DataFormats/Common/interface/RefCore.h" 00027 #include "DataFormats/Common/interface/Ptr.h" 00028 #include "DataFormats/Common/interface/traits.h" 00029 #include "DataFormats/Common/interface/GetProduct.h" 00030 #include "DataFormats/Common/interface/EDProduct.h" 00031 #include "DataFormats/Common/interface/EDProductGetter.h" 00032 #include "DataFormats/Common/interface/Handle.h" 00033 #include "DataFormats/Common/interface/OrphanHandle.h" 00034 #include "DataFormats/Common/interface/TestHandle.h" 00035 00036 #include "FWCore/Utilities/interface/EDMException.h" 00037 00038 // forward declarations 00039 namespace edm { 00040 template <typename T> 00041 class FwdPtr { 00042 friend class FwdPtrVectorBase; 00043 public: 00044 00045 typedef unsigned long key_type; 00046 typedef T value_type; 00047 00048 // General purpose constructor from two Ptrs. 00049 template <typename C> 00050 FwdPtr( Ptr<C> f, Ptr<C> b): 00051 ptr_(f), backPtr_(b) 00052 {} 00053 00054 FwdPtr(): 00055 ptr_(), backPtr_() 00056 {} 00057 00058 FwdPtr(FwdPtr<T> const& iOther): 00059 ptr_(iOther.ptr_), backPtr_(iOther.backPtr_) 00060 {} 00061 00062 /* template<typename U> */ 00063 /* FwdPtr(FwdPtr<U> const& iOther, typename boost::enable_if_c<boost::is_base_of<T, U>::value>::type * t = 0): */ 00064 /* ptr_(iOther.ptr_, t), backPtr_(iOther.backPtr_,t) */ 00065 /* { */ 00066 /* } */ 00067 00068 /* template<typename U> */ 00069 /* explicit */ 00070 /* FwdPtr(FwdPtr<U> const& iOther, typename boost::enable_if_c<boost::is_base_of<U, T>::value>::type * t = 0): */ 00071 /* ptr_(iOther.ptr_,t), backPtr_(iOther.backPtr_,t){} */ 00072 00073 00075 ~FwdPtr() {} 00076 00078 T const& 00079 operator*() const { return ptr_.isNonnull() ? ptr_.operator*() : backPtr_.operator*();} 00080 00082 T const* 00083 operator->() const{ return ptr_.isNonnull() ? ptr_.operator->() : backPtr_.operator->();} 00084 00086 T const* get() const { return ptr_.isNonnull() ? ptr_.get() : backPtr_.get();} 00087 00088 00090 bool isNull() const {return !isNonnull(); } 00091 00093 //bool isNonnull() const {return id().isValid(); } 00094 bool isNonnull() const {return ptr_.isNonnull() || backPtr_.isNonnull(); } 00096 bool operator!() const {return isNull();} 00097 00100 bool isAvailable() const {return ptr_.isAvailable() || backPtr_.isAvailable();} 00101 00103 bool isTransient() const {return ptr_.isTransient();} 00104 00106 ProductID id() const {return ptr_.isNonnull() ? ptr_.id() : backPtr_.id();} 00107 00109 EDProductGetter const* productGetter() const { 00110 if ( ptr_.productGetter() ) return ptr_.productGetter(); 00111 else return backPtr_.productGetter(); 00112 } 00113 00114 key_type key() const {return ptr_.isNonnull() ? ptr_.key() : backPtr_.key() ;} 00115 00116 bool hasProductCache() const { return ptr_.hasProductCache() || backPtr_.hasProductCache();} 00117 00118 RefCore const& refCore() const {return ptr_.isNonnull() ? ptr_.refCore() : backPtr_.refCore() ;} 00119 // ---------- member functions --------------------------- 00120 00121 void const* product() const {return 0;} 00122 00123 Ptr<value_type> const & ptr() const { return ptr_;} 00124 Ptr<value_type> const & backPtr() const { return backPtr_;} 00125 private: 00126 Ptr<value_type> ptr_; 00127 Ptr<value_type> backPtr_; 00128 }; 00129 00130 00131 template <typename T> 00132 inline 00133 bool 00134 operator==(FwdPtr<T> const& lhs, FwdPtr<T> const& rhs) { 00135 return ( lhs.ptr() == rhs.ptr() || 00136 lhs.backPtr() == rhs.ptr() || 00137 lhs.ptr() == rhs.backPtr() || 00138 lhs.backPtr() == rhs.backPtr() ); 00139 } 00140 00141 template <typename T> 00142 inline 00143 bool 00144 operator!=(FwdPtr<T> const& lhs, FwdPtr<T> const& rhs) { 00145 return !(lhs == rhs); 00146 } 00147 00148 template <typename T> 00149 inline 00150 bool 00151 operator<(FwdPtr<T> const& lhs, FwdPtr<T> const& rhs) { 00154 return ( lhs.ptr() < rhs.ptr() ); 00155 } 00156 00157 } 00158 00159 #endif