Files Classes Functions Hierarchy
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
1.5.8