![]() |
![]() |
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 }