CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DataFormats/Provenance/interface/ProductProvenance.h

Go to the documentation of this file.
00001 #ifndef DataFormats_Provenance_ProductProvenance_h
00002 #define DataFormats_Provenance_ProductProvenance_h
00003 
00004 /*----------------------------------------------------------------------
00005   
00006 ProductProvenance: The event dependent portion of the description of a product
00007 and how it came into existence, plus the status.
00008 
00009 ----------------------------------------------------------------------*/
00010 #include <iosfwd>
00011 #include <vector>
00012 
00013 #include "boost/shared_ptr.hpp"
00014 
00015 #include "DataFormats/Provenance/interface/BranchID.h"
00016 #include "DataFormats/Provenance/interface/ParentageID.h"
00017 #include "DataFormats/Provenance/interface/ProductStatus.h"
00018 #include "DataFormats/Provenance/interface/ProvenanceFwd.h"
00019 #include "DataFormats/Provenance/interface/Transient.h"
00020 
00021 /*
00022   ProductProvenance
00023 */
00024 
00025 namespace edm {
00026   class ProductProvenance {
00027   public:
00028     ProductProvenance();
00029     explicit ProductProvenance(BranchID const& bid);
00030     ProductProvenance(BranchID const& bid,
00031                     ProductStatus status);
00032     ProductProvenance(BranchID const& bid,
00033                     ProductStatus status,
00034                     boost::shared_ptr<Parentage> parentagePtr);
00035     ProductProvenance(BranchID const& bid,
00036                     ProductStatus status,
00037                     ParentageID const& id);
00038 
00039     ProductProvenance(BranchID const& bid,
00040                    ProductStatus status,
00041                    std::vector<BranchID> const& parents);
00042 
00043     ~ProductProvenance() {}
00044 
00045     ProductProvenance makeProductProvenance() const;
00046 
00047     void write(std::ostream& os) const;
00048 
00049     BranchID const& branchID() const {return branchID_;}
00050     ProductStatus const& productStatus() const {return productStatus_;}
00051     ParentageID const& parentageID() const {return parentageID_;}
00052     Parentage const& parentage() const;
00053     void setStatus(ProductStatus const& status);
00054 
00055     bool & noParentage() const {return transients_.get().noParentage_;}
00056 
00057     struct Transients {
00058       Transients();
00059       boost::shared_ptr<Parentage> parentagePtr_;
00060       bool noParentage_;
00061     };
00062 
00063   private:
00064 
00065     boost::shared_ptr<Parentage> & parentagePtr() const {return transients_.get().parentagePtr_;}
00066 
00067     BranchID branchID_;
00068     ProductStatus productStatus_;
00069     ParentageID parentageID_;
00070     mutable Transient<Transients> transients_;
00071   };
00072 
00073   inline
00074   bool
00075   operator < (ProductProvenance const& a, ProductProvenance const& b) {
00076     return a.branchID() < b.branchID();
00077   }
00078   
00079   inline
00080   std::ostream&
00081   operator<<(std::ostream& os, ProductProvenance const& p) {
00082     p.write(os);
00083     return os;
00084   }
00085 
00086   // Only the 'salient attributes' are testing in equality comparison.
00087   bool operator==(ProductProvenance const& a, ProductProvenance const& b);
00088   inline bool operator!=(ProductProvenance const& a, ProductProvenance const& b) { return !(a==b); }
00089   typedef std::vector<ProductProvenance> ProductProvenanceVector;
00090 }
00091 #endif