Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "FWCore/Framework/interface/DataProxy.h"
00017 #include "FWCore/Framework/interface/ComponentDescription.h"
00018 #include "FWCore/Framework/interface/MakeDataException.h"
00019 #include "FWCore/Framework/interface/EventSetupRecord.h"
00020
00021
00022
00023
00024
00025 namespace edm {
00026 namespace eventsetup {
00027
00028
00029
00030 static
00031 const ComponentDescription*
00032 dummyDescription()
00033 {
00034 static ComponentDescription s_desc;
00035 return &s_desc;
00036 }
00037
00038
00039
00040 DataProxy::DataProxy() :
00041 cache_(0),
00042 cacheIsValid_(false),
00043 nonTransientAccessRequested_(false),
00044 description_(dummyDescription())
00045 {
00046 }
00047
00048
00049
00050
00051
00052
00053 DataProxy::~DataProxy()
00054 {
00055 }
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 void
00073 DataProxy::setCacheIsValidAndAccessType(bool iTransientAccessOnly) const {
00074 cacheIsValid_ = true;
00075 if(!iTransientAccessOnly) {
00076 nonTransientAccessRequested_ = true;
00077 }
00078 }
00079
00080 void DataProxy::clearCacheIsValid() {
00081 cacheIsValid_ = false;
00082 nonTransientAccessRequested_ = false;
00083 cache_ = 0;
00084 }
00085
00086 void
00087 DataProxy::resetIfTransient() {
00088 if (!nonTransientAccessRequested_) {
00089 clearCacheIsValid();
00090 invalidateTransientCache();
00091 }
00092 }
00093
00094 void
00095 DataProxy::invalidateTransientCache() {
00096 invalidateCache();
00097 }
00098
00099
00100
00101 namespace {
00102 void throwMakeException(const EventSetupRecord& iRecord,
00103 const DataKey& iKey) {
00104 throw MakeDataException(iRecord.key(),iKey);
00105 }
00106 }
00107
00108
00109 const void*
00110 DataProxy::get(const EventSetupRecord& iRecord, const DataKey& iKey, bool iTransiently) const
00111 {
00112 if(!cacheIsValid()) {
00113 cache_ = const_cast<DataProxy*>(this)->getImpl(iRecord, iKey);
00114 }
00115
00116
00117
00118
00119 setCacheIsValidAndAccessType(iTransiently);
00120 if(0 == cache_) {
00121 throwMakeException(iRecord, iKey);
00122 }
00123 return cache_;
00124 }
00125
00126 void DataProxy::doGet(const EventSetupRecord& iRecord, const DataKey& iKey, bool iTransiently) const {
00127 get(iRecord, iKey, iTransiently);
00128 }
00129
00130
00131
00132
00133
00134 }
00135 }