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 ~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