File indexing completed on 2025-04-04 01:26:37
0001
0002 #ifndef FWCore_Utilities_ESGetToken_h
0003 #define FWCore_Utilities_ESGetToken_h
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include "FWCore/Utilities/interface/ESInputTag.h"
0018 #include "FWCore/Utilities/interface/ESIndices.h"
0019 #include "FWCore/Utilities/interface/OftenEmptyCString.h"
0020 #include <limits>
0021
0022 namespace edm {
0023 class EDConsumerBase;
0024 class ESProducer;
0025 class ESConsumesCollector;
0026 class EventSetup;
0027 class EventSetupImpl;
0028 namespace eventsetup {
0029 class EventSetupRecord;
0030 }
0031
0032
0033
0034 template <typename ESProduct, typename ESRecord>
0035 class ESGetToken {
0036 friend class EDConsumerBase;
0037 friend class ESProducer;
0038 friend class ESConsumesCollector;
0039 friend class EventSetup;
0040 friend class EventSetupImpl;
0041 friend class eventsetup::EventSetupRecord;
0042
0043 public:
0044 constexpr ESGetToken() noexcept = default;
0045
0046 constexpr ESGetToken(ESGetToken<ESProduct, ESRecord> const&) noexcept = default;
0047 constexpr ESGetToken(ESGetToken<ESProduct, ESRecord>&&) noexcept = default;
0048
0049 constexpr ESGetToken<ESProduct, ESRecord>& operator=(ESGetToken<ESProduct, ESRecord>&&) noexcept = default;
0050 constexpr ESGetToken<ESProduct, ESRecord>& operator=(ESGetToken<ESProduct, ESRecord> const&) noexcept = default;
0051
0052 template <typename ADAPTER>
0053 requires requires(ADAPTER&& a) { a.template consumes<ESProduct, ESRecord>(); }
0054 constexpr explicit ESGetToken(ADAPTER&& iAdapter) : ESGetToken(iAdapter.template consumes<ESProduct, ESRecord>()) {}
0055
0056 template <typename ADAPTER>
0057 requires requires(ADAPTER&& a) { a.template consumes<ESProduct, ESRecord>(); }
0058 constexpr ESGetToken<ESProduct, ESRecord>& operator=(ADAPTER&& iAdapter) {
0059 ESGetToken<ESProduct, ESRecord> temp(std::forward<ADAPTER>(iAdapter));
0060 return (*this = std::move(temp));
0061 }
0062
0063 constexpr unsigned int transitionID() const noexcept { return m_transitionID; }
0064 constexpr bool isInitialized() const noexcept { return transitionID() != std::numeric_limits<unsigned int>::max(); }
0065 constexpr ESTokenIndex index() const noexcept { return m_index; }
0066 constexpr bool hasValidIndex() const noexcept { return index() != invalidIndex(); }
0067 static constexpr ESTokenIndex invalidIndex() noexcept { return ESTokenIndex{std::numeric_limits<int>::max()}; }
0068
0069 private:
0070 explicit constexpr ESGetToken(unsigned int transitionID, ESTokenIndex index, char const* productLabel) noexcept
0071 : m_productLabel{productLabel}, m_transitionID{transitionID}, m_index{index} {}
0072
0073 constexpr char const* productLabel() const noexcept { return m_productLabel.c_str(); }
0074 OftenEmptyCString m_productLabel{nullptr};
0075
0076
0077 unsigned int m_transitionID{std::numeric_limits<unsigned int>::max()};
0078 ESTokenIndex m_index{std::numeric_limits<int>::max()};
0079 };
0080
0081 }
0082
0083 #endif