CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DataFormats/Common/src/RefCoreStreamer.cc

Go to the documentation of this file.
00001 #include "DataFormats/Common/interface/RefCoreStreamer.h"
00002 #include "DataFormats/Common/interface/RefCore.h"
00003 #include "FWCore/Utilities/interface/EDMException.h"
00004 #include "TROOT.h"
00005 #include <ostream>
00006 #include <cassert>
00007 #include <iostream>
00008 
00009 namespace edm {
00010   void 
00011   ProductIDStreamer::operator()(TBuffer &R__b, void *objp) {
00012     if (R__b.IsReading()) {
00013       UInt_t i0, i1;
00014       R__b.ReadVersion(&i0, &i1, cl_);
00015       ProductID pid;
00016       if (productIDwasLong_) {
00017         unsigned long id;
00018         R__b >> id;
00019         pid.oldID() = id;
00020       } else {
00021         unsigned int id;
00022         R__b >> id;
00023         pid.oldID() = id;
00024       }
00025       ProductID* obj = static_cast<ProductID *>(objp);
00026       *obj = (prodGetter_ ? prodGetter_->oldToNewProductID(pid) : pid);
00027     } else {
00028       assert("ProductID streamer is obsolete" == 0);
00029     }
00030   }
00031 
00032   void 
00033   RefCoreStreamer::operator()(TBuffer &R__b, void *objp) {
00034     if (R__b.IsReading()) {
00035       cl_->ReadBuffer(R__b, objp);
00036       RefCore* obj = static_cast<RefCore *>(objp);
00037       obj->setProductGetter(prodGetter_);
00038       //Now ProductGetter and ProductPtr share the same internal pointer
00039       // so only need to set one
00040       //obj->setProductPtr(0); 
00041     } else {
00042       assert("RefCore streamer is obsolete" == 0);
00043     }
00044   }
00045 
00046 
00047   /*NOTE: This design came from Philippe Canal as the minimum storage (2bytes) we can do but still
00048    have ROOT call our custom streamer. The trick is to only store the version # and not the class ID.
00049    The '#if #else #endif' are there because the default choice is known to work for root 5.27-5.28 and
00050    Philippe believes is unlikely to ever change but the alternate choice is slightly slower but more 
00051    guaranteed to be forwards compatible.
00052    */
00053   void 
00054   RefCoreCheckTransientOnWriteStreamer::operator()(TBuffer &R__b, void *objp) {
00055     typedef RefCore::CheckTransientOnWrite CheckTransientOnWrite;
00056     if (R__b.IsReading()) {
00057       //std::cout <<"reading CheckTransientOnWrite"<<std::endl;
00058 #if 1
00059       Version_t version;
00060       R__b >> version;
00061 #else
00062       R__b.ReadVersion();
00063 #endif
00064       CheckTransientOnWrite* obj = static_cast<CheckTransientOnWrite *>(objp);
00065       obj->transient_ = false;
00066       obj->cacheIsProductPtr_ = false;
00067     } else {
00068       //std::cout <<"writing CheckTransientOnWrite"<<std::endl;
00069       TVirtualStreamerInfo* sinfo = cl_->GetStreamerInfo();
00070       CheckTransientOnWrite* obj = static_cast<CheckTransientOnWrite *>(objp);
00071       if (obj->transient_) {
00072         throw Exception(errors::InvalidReference,"Inconsistency")
00073           << "RefCoreStreamer: transient Ref or Ptr cannot be made persistent.";
00074       }
00075 #if 1
00076       R__b << cl_->GetClassVersion();
00077 #else
00078       R__b.WriteVersion(cl_, kFALSE);
00079 #endif
00080       R__b.TagStreamerInfo(sinfo);
00081     }
00082   }
00083   
00084    
00085   void setRefCoreStreamer(bool resetAll) {
00086     
00087     {
00088       TClass *cl = gROOT->GetClass("edm::RefCore::CheckTransientOnWrite");
00089       TClassStreamer *st = cl->GetStreamer();
00090       if (st == 0) {
00091         cl->AdoptStreamer(new RefCoreCheckTransientOnWriteStreamer());
00092       } 
00093     }
00094     EDProductGetter::switchProductGetter(0);
00095     if (resetAll) {
00096       TClass *cl = gROOT->GetClass("edm::RefCore");
00097       if (cl->GetStreamer() != 0) {
00098         cl->AdoptStreamer(0);
00099       }
00100     }
00101     if (resetAll) {
00102       TClass *cl = gROOT->GetClass("edm::ProductID");
00103       if (cl->GetStreamer() != 0) {
00104         cl->AdoptStreamer(0);
00105       }
00106     }
00107   }
00108 
00109   EDProductGetter const* setRefCoreStreamer(EDProductGetter const* ep, bool oldFormat, bool productIDwasLong) {
00110     EDProductGetter const* returnValue=0;
00111     if (ep != 0) {
00112       if (oldFormat) {
00113         TClass *cl = gROOT->GetClass("edm::RefCore");
00114         RefCoreStreamer *st = static_cast<RefCoreStreamer *>(cl->GetStreamer());
00115         if (st == 0) {
00116           cl->AdoptStreamer(new RefCoreStreamer(ep));
00117         } else {          
00118           returnValue = st->setProductGetter(ep);
00119         }
00120       } else {
00121         TClass *cl = gROOT->GetClass("edm::RefCore::CheckTransientOnWrite");
00122         TClassStreamer *st = cl->GetStreamer();
00123         if (st == 0) {
00124           cl->AdoptStreamer(new RefCoreCheckTransientOnWriteStreamer());
00125         } 
00126         returnValue = edm::EDProductGetter::switchProductGetter(ep);
00127       }
00128     }
00129     if (oldFormat) {
00130       TClass *cl = gROOT->GetClass("edm::ProductID");
00131       ProductIDStreamer *st = static_cast<ProductIDStreamer *>(cl->GetStreamer());
00132       if (st == 0) {
00133         cl->AdoptStreamer(new ProductIDStreamer(ep, productIDwasLong));
00134       } else {
00135         st->setProductGetter(ep);
00136       }
00137     }
00138     return returnValue;
00139   }
00140 }