CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch13/src/FWCore/FWLite/src/RefStreamer.cc

Go to the documentation of this file.
00001 #include "RefStreamer.h"
00002 #include "DataFormats/Common/interface/RefCore.h"
00003 #include "FWCore/Utilities/interface/EDMException.h"
00004 #include "TROOT.h"
00005 #include <assert.h>
00006 #include <ostream>
00007 
00008 class TBuffer;
00009 
00010 namespace fwlite {
00011   void 
00012   RefStreamer::operator()(TBuffer &R__b, void *objp) {
00013     using edm::RefCore;
00014     using edm::Exception;
00015     using edm::errors::InvalidReference;
00016     typedef RefCore::RefCoreTransients RefCoreTransients;
00017     if (R__b.IsReading()) {
00018       cl_->ReadBuffer(R__b, objp);
00019       RefCoreTransients* obj = static_cast<RefCoreTransients *>(objp);
00020       obj->setProductGetter(prodGetter_);
00021       obj->setProductPtr(0);
00022     } else {
00023       RefCoreTransients* obj = static_cast<RefCoreTransients *>(objp);
00024       if (obj->isTransient()) {
00025         throw Exception(InvalidReference,"Inconsistency")
00026           << "RefStreamer: transient Ref or Ptr cannot be made persistent.";
00027       }
00028       cl_->WriteBuffer(R__b, objp);
00029     }
00030   }
00031 
00032   edm::EDProductGetter const* setRefStreamer(edm::EDProductGetter const* ep) {
00033     using namespace edm;
00034     static TClass *cl = gROOT->GetClass("edm::RefCore::RefCoreTransients");
00035     assert(cl);
00036     RefStreamer *st = static_cast<RefStreamer *>(cl->GetStreamer());
00037     edm::EDProductGetter const* pOld = 0;
00038     if (st == 0) {
00039       cl->AdoptStreamer(new RefStreamer(ep));
00040     } else {
00041       pOld = st->setProductGetter(ep);
00042     }
00043     return pOld;
00044   }
00045 }