00001 #ifndef OrderedVectorDBCache_HPP
00002 #define OrderedVectorDBCache_HPP
00003
00004 #include <vector>
00005 #include <set>
00006 #include <map>
00007 #include <functional>
00008
00009
00010
00011 template <class BIS>
00012 bool less_itemset(std::pair<BIS, counter_t> x, BIS y)
00013 {
00014 return x.first < y;
00015 }
00016
00017
00026 template <class T_R, class BIS>
00027 class OrderedVectorDBCache : public T_R
00028 {
00029 public:
00030 typedef typename T_R::params_t params_t;
00031
00032 OrderedVectorDBCache( const params_t* par );
00033
00034 counter_t nextTransactionBIS(
00035 BIS& transaction );
00036
00037 template <class UAC> counter_t nextTransactionUAC(
00038 UAC& transaction );
00039
00040 void rewind()
00041 {
00042 it = ordered_vector.begin();
00043 }
00044 protected:
00045 std::vector< std::pair<BIS, counter_t> > ordered_vector;
00046 typename std::vector<std::pair<BIS, counter_t> >::iterator it;
00047 };
00048
00049 template <class T_R, class BIS> inline OrderedVectorDBCache<T_R, BIS>::
00050 OrderedVectorDBCache(const params_t* par) : T_R(par)
00051 {
00052 BIS transaction;
00053 register counter_t multiplicity;
00054 T_R::rewind();
00055 while( (multiplicity = T_R::nextTransactionBIS(
00056 transaction)) != 0 )
00057 if(transaction.size() > 1)
00058 {
00059 it = std::lower_bound( ordered_vector.begin(), ordered_vector.end(),
00060 transaction, less_itemset<BIS> );
00061 if(it != ordered_vector.end() && (*it).first == transaction)
00062 (*it).second += multiplicity;
00063 else
00064 ordered_vector.insert(
00065 it, std::pair<BIS, counter_t>(transaction, multiplicity) );
00066 }
00067 it = ordered_vector.begin();
00068 }
00069
00070 template <class T_R, class BIS> inline counter_t
00071 OrderedVectorDBCache<T_R, BIS>::nextTransactionBIS( BIS& transaction )
00072 {
00073 if( it == ordered_vector.end() )
00074 return 0;
00075 else
00076 {
00077 transaction = (*it).first;
00078 return (*(it++)).second;
00079 }
00080 }
00081
00082 template <class T_R, class BIS> template <class UAC> inline counter_t
00083 OrderedVectorDBCache<T_R, BIS>::nextTransactionUAC( UAC& transaction )
00084 {
00085 if( it == ordered_vector.end() )
00086 return 0;
00087 else
00088 {
00089 transaction.clear();
00090 transaction.insert((*it).first.begin(), (*it).first.end());
00091 return (*(it++)).second;
00092 }
00093 }
00094
00095 #endif