Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-04-04 01:26:37

0001 // -*- C++ -*-
0002 #ifndef FWCore_Utilities_ESGetToken_h
0003 #define FWCore_Utilities_ESGetToken_h
0004 //
0005 // Package:     FWCore/Utilities
0006 // Class  :     ESGetToken
0007 //
0008 /**\class edm::ESGetToken
0009 
0010  Description: A token used to get data from the event setup system
0011 
0012  Usage:
0013     An ESGetToken is created by calls to 'esConsumes' from an ED module
0014     or via a ConsumesCollector::consumes.
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   // A ESGetToken is created by calls to 'esConsumes' from an EDM
0033   // module.
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     // Note that for ESProducers, m_transitionID is actually a produceMethodID
0076     // (count of the setWhatProduced methods in the ESProducer)
0077     unsigned int m_transitionID{std::numeric_limits<unsigned int>::max()};
0078     ESTokenIndex m_index{std::numeric_limits<int>::max()};
0079   };
0080 
0081 }  // namespace edm
0082 
0083 #endif