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
00039
00040
00041 } else {
00042 assert("RefCore streamer is obsolete" == 0);
00043 }
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053 void
00054 RefCoreCheckTransientOnWriteStreamer::operator()(TBuffer &R__b, void *objp) {
00055 typedef RefCore::CheckTransientOnWrite CheckTransientOnWrite;
00056 if (R__b.IsReading()) {
00057
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
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 }