Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

OrderedVectorDBCache.hpp

Go to the documentation of this file.
00001 #ifndef OrderedVectorDBCache_HPP
00002 #define OrderedVectorDBCache_HPP
00003 
00004 #include <vector>
00005 #include <set>
00006 #include <map>
00007 #include <functional>
00008 //#include <fstream>
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

Generated on Sun Sep 17 17:50:39 2006 for FIM environment by  doxygen 1.4.4