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 }