Go to the documentation of this file.00001 #ifndef DataFormats_Provenance_ProductProvenance_h
00002 #define DataFormats_Provenance_ProductProvenance_h
00003
00004
00005
00006
00007
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
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
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