16 #ifndef ROO_CACHE_MANAGER
17 #define ROO_CACHE_MANAGER
35 class RooCacheManager :
public RooAbsCache {
39 RooCacheManager(Int_t maxSize=2) ;
40 RooCacheManager(RooAbsArg* owner, Int_t maxSize=2) ;
41 RooCacheManager(
const RooCacheManager& other, RooAbsArg* owner=0) ;
42 virtual ~RooCacheManager() ;
44 T* getObj(
const RooArgSet* nset, Int_t* sterileIndex=0,
const TNamed* isetRangeName=0) {
46 return getObj(nset,0,sterileIndex,isetRangeName) ;
49 Int_t setObj(
const RooArgSet* nset, T* obj,
const TNamed* isetRangeName=0) {
51 return setObj(nset,0,obj,isetRangeName) ;
54 inline T* getObj(
const RooArgSet* nset,
const RooArgSet* iset, Int_t* sterileIdx,
const char* isetRangeName) {
55 if (_wired)
return _object[0] ;
56 return getObj(nset,iset,sterileIdx,RooNameReg::ptr(isetRangeName)) ;
59 T* getObj(
const RooArgSet* nset,
const RooArgSet* iset, Int_t* sterileIndex=0,
const TNamed* isetRangeName=0) ;
60 Int_t setObj(
const RooArgSet* nset,
const RooArgSet* iset, T* obj,
const TNamed* isetRangeName=0) ;
63 virtual void sterilize() ;
65 Int_t lastIndex()
const {
69 Int_t cacheSize()
const {
74 virtual Bool_t redirectServersHook(
const RooAbsCollection& , Bool_t ,
79 virtual void operModeHook() {
82 virtual void printCompactTreeHook(std::ostream&,
const char *) {
86 T* getObjByIndex(Int_t index)
const ;
87 const RooNameSet* nameSet1ByIndex(Int_t index)
const ;
88 const RooNameSet* nameSet2ByIndex(Int_t index)
const ;
90 virtual void insertObjectHook(T&) {
96 oocoutI(_owner,Optimization) <<
"RooCacheManager::wireCache(" << _owner->GetName() <<
") no cached elements!" << std::endl ;
97 }
else if (_size==1) {
98 oocoutI(_owner,Optimization) <<
"RooCacheManager::wireCache(" << _owner->GetName() <<
") now wiring cache" << std::endl ;
100 }
else if (_size>1) {
101 oocoutI(_owner,Optimization) <<
"RooCacheManager::wireCache(" << _owner->GetName() <<
") cache cannot be wired because it contains more than one element" << std::endl ;
111 std::vector<RooNormSetCache> _nsetCache ;
112 std::vector<T*> _object ;
115 ClassDef(RooCacheManager,2)
124 RooCacheManager<T>::RooCacheManager(Int_t maxSize) : RooAbsCache(0)
127 _nsetCache.resize(_maxSize) ;
128 _object.resize(_maxSize,0) ;
138 RooCacheManager<T>::RooCacheManager(RooAbsArg* owner, Int_t maxSize) : RooAbsCache(owner)
143 _nsetCache.resize(_maxSize) ;
144 _object.resize(_maxSize,0) ;
149 for (i=0 ; i<_maxSize ; i++) {
157 RooCacheManager<T>::RooCacheManager(
const RooCacheManager& other, RooAbsArg* owner) : RooAbsCache(other,owner)
159 _maxSize = other._maxSize ;
160 _size = other._size ;
162 _nsetCache.resize(_maxSize) ;
163 _object.resize(_maxSize,0) ;
170 for (i=0 ; i<other._size ; i++) {
171 _nsetCache[i].initialize(other._nsetCache[i]) ;
175 for (i=other._size ; i<_maxSize ; i++) {
182 RooCacheManager<T>::~RooCacheManager()
184 for (
int i=0 ; i<_size ; i++) {
192 void RooCacheManager<T>::reset()
194 for (
int i=0 ; i<_maxSize ; i++) {
197 _nsetCache[i].clear() ;
207 void RooCacheManager<T>::sterilize()
210 for (i=0 ; i<_maxSize ; i++) {
219 Int_t RooCacheManager<T>::setObj(
const RooArgSet* nset,
const RooArgSet* iset, T* obj,
const TNamed* isetRangeName)
222 Int_t sterileIdx(-1) ;
223 if (getObj(nset,iset,&sterileIdx,isetRangeName)) {
231 if (sterileIdx>=_maxSize) {
233 _maxSize = sterileIdx+4;
234 _object.resize(_maxSize,0) ;
235 _nsetCache.resize(_maxSize) ;
239 _object[sterileIdx] = obj ;
242 insertObjectHook(*obj) ;
247 if (_size>=_maxSize-1) {
250 _object.resize(_maxSize,0) ;
251 _nsetCache.resize(_maxSize) ;
255 _nsetCache[_size].autoCache(_owner,nset,iset,isetRangeName,kTRUE) ;
256 if (_object[_size]) {
257 delete _object[_size] ;
260 _object[_size] = obj ;
264 insertObjectHook(*obj) ;
277 T* RooCacheManager<T>::getObj(
const RooArgSet* nset,
const RooArgSet* iset, Int_t* sterileIdx,
const TNamed* isetRangeName)
281 if(_object[0]==0 && sterileIdx) *sterileIdx=0 ;
286 for (i=0 ; i<_size ; i++) {
287 if (_nsetCache[i].contains(nset,iset,isetRangeName)==kTRUE) {
289 if(_object[i]==0 && sterileIdx) *sterileIdx=i ;
294 for (i=0 ; i<_size ; i++) {
295 if (_nsetCache[i].autoCache(_owner,nset,iset,isetRangeName,kFALSE)==kFALSE) {
297 if(_object[i]==0 && sterileIdx) *sterileIdx=i ;
308 T* RooCacheManager<T>::getObjByIndex(Int_t index)
const
310 if (index<0||index>=_size) {
311 oocoutE(_owner,ObjectHandling) <<
"RooCacheManager::getNormListByIndex: ERROR index ("
312 << index <<
") out of range [0," << _size-1 <<
"]" << std::endl ;
315 return _object[index] ;
321 const RooNameSet* RooCacheManager<T>::nameSet1ByIndex(Int_t index)
const
323 if (index<0||index>=_size) {
324 oocoutE(_owner,ObjectHandling) <<
"RooCacheManager::getNormListByIndex: ERROR index ("
325 << index <<
") out of range [0," << _size-1 <<
"]" << std::endl ;
328 return &_nsetCache[index].nameSet1() ;
334 const RooNameSet* RooCacheManager<T>::nameSet2ByIndex(Int_t index)
const
336 if (index<0||index>=_size) {
337 oocoutE(_owner,ObjectHandling) <<
"RooCacheManager::getNormListByIndex: ERROR index ("
338 << index <<
") out of range [0," << _size-1 <<
"]" << std::endl ;
341 return &_nsetCache[index].nameSet2() ;