proj home

Files   Classes   Functions   Hierarchy  

buckethybrid.h

Go to the documentation of this file.
00001 #ifndef BUCKETHYBRID_H
00002 #define BUCKETHYBRID_H
00003 
00004 #include <cassert>
00005 using namespace std;
00006 
00007 #include <bucket.h>
00008 #include <bucketlink.h>
00009 #include <typedefs.h>
00010 
00011 //#define DEBUG_BUCKETHYBRID 
00012 
00013 #ifdef DEBUG_BUCKETHYBRID
00014 #include <iostream>
00015 #include <print.h>
00016 #endif
00017 
00069 template< typename T, typename HFN, typename C >
00070 class buckethybrid : public bucket<T,HFN>
00071 {
00072 public:
00073 
00076   C defaultsorter;
00079   uintc maxchainlength;
00080 
00084   buckethybrid
00085   (
00086     T * data_, 
00087     uintc datasz_,
00088     HFN fn_,
00089     uintc maxchainlength_
00090   ) : bucket<T,HFN>(data_,datasz_,fn_), maxchainlength(maxchainlength_)
00091     {}
00092 
00094   void eval();
00097   void copy(T * data2) const;
00098 
00099 protected:
00100 
00102   void mergeuptoelement
00103   (
00104     T * & data2, 
00105     typename C::const_iterator & i, 
00106     T const & x
00107   ) const;
00108 
00110   void move(bucketlink<T> * b);
00111 };
00112 
00113 
00114 //---------------------------------------------------------
00115 // Implementation
00116 
00117 template< typename T, typename HFN, typename C >
00118 void buckethybrid<T,HFN,C>::move(bucketlink<T> * b)
00119 {
00120   for ( ; b!=0; )
00121   {
00122     assert(b!=0);
00123     defaultsorter.insert( * (b->data) );
00124     b = b->next;
00125   }
00126 //cout << SHOW(defaultsorter.size()) << endl;
00127 }
00128 
00129 
00130 template< typename T, typename HFN, typename C >
00131 void buckethybrid<T,HFN,C>::mergeuptoelement
00132 (
00133   T * & data2, 
00134   typename C::const_iterator & i, 
00135   T const & x
00136 ) const 
00137 {
00138   for ( ;i!=defaultsorter.end() ; )
00139   {
00140     if (fn(*i,x))
00141     {
00142       *data2++ = *i;
00143       ++i;
00144     }
00145     else
00146       return;
00147   }
00148 }
00149 
00150 template< typename T, typename HFN, typename C >
00151 void buckethybrid<T,HFN,C>::copy(T * data2) const
00152 {
00153   if (defaultsorter.empty())
00154   {
00155     bucket<T,HFN>::copy(data2);
00156     return;
00157   }
00158 
00159   typename C::const_iterator pos = defaultsorter.begin();
00160   bucketlink<T> * cp;
00161 
00162 #ifdef DEBUG_BUCKETHYBRID
00163   // Test code
00164   cout << "Printing the bucket first" << endl;
00165   for (uint i=0; i < bucket<T,HFN>::fn.bucketsize; ++i)
00166   {
00167     cp = bucket<T,HFN>::vb[i];
00168     if (cp==0)
00169       continue;
00170 
00171     for (;cp!=0;)
00172     {
00173       cout << *(cp->data) <<  " ";
00174       cp = cp->next;
00175     }
00176     cout << endl;
00177   }
00178 
00179   cout << "Printing the default sorter" << endl;
00180   for ( ; pos!=defaultsorter.end(); ++pos )
00181     cout <<  *pos << " ";
00182   cout << endl;
00183   pos = defaultsorter.begin();
00184 #endif
00185 
00186   for (uint i=0; i < bucket<T,HFN>::fn.bucketsize; ++i)
00187   {
00188     cp = bucket<T,HFN>::vb[i];
00189     if (cp==0)
00190       continue;
00191 
00192     for (;cp!=0;)
00193     {
00194       mergeuptoelement(data2,pos,*(cp->data));
00195 
00196       *data2++ = *(cp->data);
00197       cp = cp->next;
00198     }
00199   }
00200 
00201   for ( ; pos!=defaultsorter.end(); ++pos )
00202     *data2++ = *pos;
00203 }
00204 
00205 
00206 template< typename T, typename HFN, typename C >
00207 void buckethybrid<T,HFN,C>::eval()
00208 {
00209   bucketlink<T> * cp;
00210   bucketlink<T> * b;
00211   uint k;
00212   // Insert data into the structure.
00213   for (uint i=0; i< bucket<T,HFN>::datasz; ++i )
00214   {
00215     b = & bucket<T,HFN>::link[i];
00216     b->data = & bucket<T,HFN>::data[i];
00217 
00218     k = bucket<T,HFN>::fn.index(*b->data); 
00219     assert( (k < bucket<T,HFN>::fn.bucketsize) );
00220     k = k % bucket<T,HFN>::fn.bucketsize;
00221 
00222 //cout << SHOW(i) << endl;
00223 
00224     cp = bucket<T,HFN>::vb[k];
00225     if (cp==0)
00226     {
00227       bucket<T,HFN>::vb[k] = b; 
00228       continue;
00229     }
00230 
00231     // If the insert is contant do it.
00232     if ( bucket<T,HFN>::fn(*(b->data),*(cp->data)) )
00233     {
00234       b->next = cp;
00235       bucket<T,HFN>::vb[k] = b;
00236     }
00237     else
00238     {
00239       //bucketlink<T>::insertafterselfcounter = 0;
00240       cp->insertafterself(b,bucket<T,HFN>::fn);
00241       if (bucketlink<T>::insertafterselfcounter > maxchainlength)
00242       {
00243         move(cp);
00244         bucket<T,HFN>::vb[k] = 0;
00245       }
00246     }
00247   }
00248 }
00249 
00250 
00251 
00252 
00253 
00254 #endif
00255 

Generated on Fri Mar 4 00:49:26 2011 for Chelton Evans Source by  doxygen 1.5.8