Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-05 03:13:49

0001 #ifndef DataFormats_Common_interface_OrphanHandleBase_h
0002 #define DataFormats_Common_interface_OrphanHandleBase_h
0003 
0004 /*----------------------------------------------------------------------
0005   
0006 OrphanHandle: Non-owning "smart pointer" for reference to EDProducts.
0007 
0008 This is a very preliminary version, and lacks safety features and
0009 elegance.
0010 
0011 If the pointed-to WrapperBase is destroyed, use of the OrphanHandle
0012 becomes undefined. There is no way to query the OrphanHandle to
0013 discover if this has happened.
0014 
0015 OrphanHandles can have:
0016   -- Product pointer null and id == 0;
0017   -- Product pointer valid and id != 0;
0018 
0019 To check validity, one can use the isValid() function.
0020 
0021 ----------------------------------------------------------------------*/
0022 
0023 #include <algorithm>
0024 #include <cassert>
0025 
0026 #include "DataFormats/Provenance/interface/ProductID.h"
0027 
0028 namespace edm {
0029 
0030   class OrphanHandleBase {
0031   public:
0032     OrphanHandleBase() : product_(nullptr), id_() {}
0033 
0034     OrphanHandleBase(void const* iProd, ProductID const& iId) : product_(iProd), id_(iId) { assert(iProd); }
0035 
0036     void clear() {
0037       product_ = nullptr;
0038       id_ = ProductID();
0039     }
0040 
0041     void swap(OrphanHandleBase& other) {
0042       std::swap(product_, other.product_);
0043       std::swap(id_, other.id_);
0044     }
0045 
0046     bool isValid() const { return product_ && id_ != ProductID(); }
0047 
0048     ProductID id() const { return id_; }
0049 
0050   protected:
0051     void const* productStorage() const { return product_; }
0052 
0053   private:
0054     void const* product_;
0055     ProductID id_;
0056   };
0057 
0058   // Free swap function
0059   inline void swap(OrphanHandleBase& a, OrphanHandleBase& b) { a.swap(b); }
0060 
0061 }  // namespace edm
0062 
0063 #endif  // DataFormats_Common_interface_OrphanHandleBase_h