CMS 3D CMS Logo

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 
00007 class TBuffer;
00008 
00009 namespace fwlite {
00010   void 
00011   RefStreamer::operator()(TBuffer &R__b, void *objp) {
00012     using edm::RefCore;
00013     using edm::Exception;
00014     using edm::errors::InvalidReference;
00015     if (R__b.IsReading()) {
00016       cl_->ReadBuffer(R__b, objp);
00017       RefCore* obj = static_cast<RefCore *>(objp);
00018       obj->setProductGetter(prodGetter_);
00019       obj->setProductPtr(0);
00020     } else {
00021       RefCore* obj = static_cast<RefCore *>(objp);
00022       if (obj->isTransient()) {
00023         throw Exception(InvalidReference,"Inconsistency")
00024           << "RefStreamer: transient Ref or Ptr cannot be made persistent.";
00025       }
00026       cl_->WriteBuffer(R__b, objp);
00027     }
00028   }
00029 
00030   edm::EDProductGetter const* setRefStreamer(edm::EDProductGetter const* ep) {
00031     using namespace edm;
00032     static TClass *cl = gROOT->GetClass("edm::RefCore");
00033     assert(cl);
00034     RefStreamer *st = static_cast<RefStreamer *>(cl->GetStreamer());
00035     edm::EDProductGetter const* pOld = 0;
00036     if (st == 0) {
00037       cl->AdoptStreamer(new RefStreamer(ep));
00038     } else {
00039       pOld = st->setProductGetter(ep);
00040     }
00041     return pOld;
00042   }
00043 }

Generated on Tue Jun 9 17:36:16 2009 for CMSSW by  doxygen 1.5.4