Go to the documentation of this file.00001 #ifndef FWCore_Framework_GenericHandle_h
00002 #define FWCore_Framework_GenericHandle_h
00003
00004
00005
00006
00007
00024
00025
00026
00027
00028
00029
00030 #include "FWCore/Framework/interface/Event.h"
00031 #include "FWCore/Utilities/interface/ObjectWithDict.h"
00032 #include "FWCore/Utilities/interface/TypeWithDict.h"
00033
00034
00035 #include <string>
00036
00037
00038 namespace edm {
00040 struct GenericObject {
00041 };
00042
00043 template<>
00044 class Handle<GenericObject> {
00045 public:
00047 Handle(std::string const& iName) :
00048 type_(TypeWithDict::byName(iName)), prod_(), prov_(0) {
00049 if(!bool(type_)) {
00050 Exception::throwThis(errors::NotFound,
00051 "Handle<GenericObject> told to use uknown type '",
00052 iName.c_str(),
00053 "'.\n Please check spelling or that a module uses this type in the job.");
00054 }
00055 if(type_.isTypedef()){
00056
00057
00058
00059 type_ = type_.toType();
00060 }
00061 }
00062
00064 Handle(TypeWithDict const& iType) :
00065 type_(iType), prod_(), prov_(0) {
00066 if(!bool(iType)) {
00067 Exception::throwThis(errors::NotFound, "Handle<GenericObject> given an invalid type");
00068 }
00069 if(type_.isTypedef()){
00070
00071
00072
00073 type_ = type_.toType();
00074 }
00075 }
00076
00077 Handle(Handle<GenericObject> const& h):
00078 type_(h.type_),
00079 prod_(h.prod_),
00080 prov_(h.prov_),
00081 whyFailed_(h.whyFailed_) {
00082 }
00083
00084 Handle(ObjectWithDict const& prod, Provenance const* prov, ProductID const&):
00085 type_(prod.typeOf()),
00086 prod_(prod),
00087 prov_(prov) {
00088 assert(prod_);
00089 assert(prov_);
00090 }
00091
00092
00093
00094 void swap(Handle<GenericObject>& other) {
00095
00096 using std::swap;
00097 swap(type_, other.type_);
00098 std::swap(prod_, other.prod_);
00099 swap(prov_, other.prov_);
00100 swap(whyFailed_, other.whyFailed_);
00101 }
00102
00103
00104 Handle<GenericObject>& operator=(Handle<GenericObject> const& rhs) {
00105 Handle<GenericObject> temp(rhs);
00106 this->swap(temp);
00107 return *this;
00108 }
00109
00110 bool isValid() const {
00111 return prod_ && 0!= prov_;
00112 }
00113
00114 bool failedToGet() const {
00115 return 0 != whyFailed_.get();
00116 }
00117 ObjectWithDict const* product() const {
00118 if(this->failedToGet()) {
00119 whyFailed_->raise();
00120 }
00121 return &prod_;
00122 }
00123 ObjectWithDict const* operator->() const {return this->product();}
00124 ObjectWithDict const& operator*() const {return *(this->product());}
00125
00126 TypeWithDict const& type() const {return type_;}
00127 Provenance const* provenance() const {return prov_;}
00128
00129 ProductID id() const {return prov_->productID();}
00130
00131 void clear() { prov_ = 0; whyFailed_.reset();}
00132
00133 void setWhyFailed(boost::shared_ptr<cms::Exception> const& iWhyFailed) {
00134 whyFailed_=iWhyFailed;
00135 }
00136 private:
00137 TypeWithDict type_;
00138 ObjectWithDict prod_;
00139 Provenance const* prov_;
00140 boost::shared_ptr<cms::Exception> whyFailed_;
00141
00142 };
00143
00144 typedef Handle<GenericObject> GenericHandle;
00145
00147 void convert_handle(BasicHandle const& orig,
00148 Handle<GenericObject>& result);
00149
00150
00152 template<>
00153 bool
00154 edm::Event::getByLabel<GenericObject>(std::string const& label,
00155 std::string const& productInstanceName,
00156 Handle<GenericObject>& result) const;
00157
00158 template <>
00159 bool
00160 edm::Event::getByLabel(edm::InputTag const& tag, Handle<GenericObject>& result) const;
00161
00162 }
00163 #endif