CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_5_3_14/src/CondCore/Utilities/interface/CondIter.h

Go to the documentation of this file.
00001 #ifndef CondIter_CondIter_h
00002 #define CondIter_CondIter_h
00003 
00004 
00005 #include "CondCore/Utilities/interface/CondBasicIter.h"
00006 
00007 #include "CondCore/DBCommon/interface/PayloadRef.h"
00008 
00009 #include <vector>
00010 
00011 
00012 template <class DataT>
00013 class CondIter : public  CondBasicIter{
00014   
00015 protected:
00016   virtual bool load(cond::DbSession& sess, std::string const & itoken) {
00017     if (useCache)
00018       if (n>=cache.size()) {
00019         cache.resize(n+1); 
00020         return cache.back().load(sess,itoken);
00021       } else return true;
00022     else return data.load(sess,itoken);
00023   }
00024   
00025 private:
00026   bool initialized;
00027   bool useCache;
00028   cond::PayloadRef<DataT> data;
00029   std::vector<cond::PayloadRef<DataT> > cache;
00030   size_t n;
00031 
00032 public:
00033   
00034   
00035   CondIter(bool cacheIt=false) : initialized(false), useCache(cacheIt),n(0){}
00036   virtual ~CondIter(){}
00037   
00038   
00039   void reset() { initialized=false; data.clear();}
00040 
00041   void rewind() { reset();}
00042 
00043   virtual void clear() {
00044     reset();
00045     cache.clear();
00046   }
00047   
00048  
00052   DataT const * next() {
00053     bool ok=false;
00054     if (!initialized) {
00055       n=0;
00056       ok =init();
00057       initialized=true;
00058     }
00059     else {
00060       ++n;
00061       ok = forward();
00062     }
00063     if (!ok) return 0;
00064     ok = make();
00065     if (!ok) return 0;
00066     return  useCache ?  &(*cache[n]) : &(*data); 
00067 
00068   }
00069 
00070 };
00071 
00072 
00073 
00074 
00075 #endif
00076