File indexing completed on 2024-04-06 12:12:01
0001 #ifndef FWCore_Framework_ESHandle_h
0002 #define FWCore_Framework_ESHandle_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include "FWCore/Framework/interface/ComponentDescription.h"
0025 #include "FWCore/Framework/interface/ESHandleExceptionFactory.h"
0026
0027 #include <exception>
0028 #include <memory>
0029 #include <utility>
0030
0031 namespace edm {
0032
0033 class ESHandleBase {
0034 public:
0035 ESHandleBase() = default;
0036 ESHandleBase(void const* iData, edm::eventsetup::ComponentDescription const* desc)
0037 : data_(iData), description_(desc) {}
0038
0039
0040 ESHandleBase(std::shared_ptr<ESHandleExceptionFactory> iWhyFailed) : whyFailedFactory_(std::move(iWhyFailed)) {}
0041
0042 edm::eventsetup::ComponentDescription const* description() const;
0043
0044 bool isValid() const { return nullptr != data_ && nullptr != description_; }
0045
0046 bool failedToGet() const { return bool(whyFailedFactory_); }
0047
0048 explicit operator bool() const { return isValid(); }
0049
0050 bool operator!() const { return not isValid(); }
0051
0052 void swap(ESHandleBase& iOther) {
0053 std::swap(data_, iOther.data_);
0054 std::swap(description_, iOther.description_);
0055 std::swap(whyFailedFactory_, iOther.whyFailedFactory_);
0056 }
0057
0058 std::shared_ptr<ESHandleExceptionFactory> const& whyFailedFactory() const { return whyFailedFactory_; }
0059
0060 protected:
0061 void const* productStorage() const {
0062 if (whyFailedFactory_) {
0063 std::rethrow_exception(whyFailedFactory_->make());
0064 }
0065 return data_;
0066 }
0067
0068 private:
0069
0070 void const* data_{nullptr};
0071 edm::eventsetup::ComponentDescription const* description_{nullptr};
0072 std::shared_ptr<ESHandleExceptionFactory> whyFailedFactory_{nullptr};
0073 };
0074
0075 template <typename T>
0076 class ESHandle : public ESHandleBase {
0077 public:
0078 typedef T value_type;
0079
0080 ESHandle() = default;
0081 ESHandle(T const* iData) : ESHandleBase(iData, nullptr) {}
0082 ESHandle(T const* iData, edm::eventsetup::ComponentDescription const* desc) : ESHandleBase(iData, desc) {}
0083 ESHandle(std::shared_ptr<ESHandleExceptionFactory>);
0084
0085
0086 T const* product() const { return static_cast<T const*>(productStorage()); }
0087 T const* operator->() const { return product(); }
0088 T const& operator*() const { return *product(); }
0089
0090 static constexpr bool transientAccessOnly = false;
0091
0092
0093 };
0094
0095 template <class T>
0096 ESHandle<T>::ESHandle(std::shared_ptr<edm::ESHandleExceptionFactory> iWhyFailed)
0097 : ESHandleBase(std::move(iWhyFailed)) {}
0098
0099
0100 inline void swap(ESHandleBase& a, ESHandleBase& b) { a.swap(b); }
0101 }
0102 #endif