]> git.donarmstrong.com Git - lilypond.git/blobdiff - flower/include/hash-table.hh
patch::: 1.4.6.po1
[lilypond.git] / flower / include / hash-table.hh
index 491feb3df7106fab4674d04c2421ad66bb383e10..8cc51f2e1b403f490d1b69300423f12bc28463d2 100644 (file)
@@ -28,7 +28,7 @@ struct Hash_table_entry
   V value_;
   bool free_b_;
 
-  Hash_table_entry() {
+  Hash_table_entry () {
     free_b_ = true;
   }
   Hash_table_entry (K s, V v)
@@ -43,7 +43,9 @@ struct Hash_table_entry
    A hash table of prime size.
 
    We use quadratic probing.  
- */
+
+  DEPRECATED. Use either SCM (preferred) or STL 
+*/
 template<class K, class V>
 class Fixed_size_hash_table
 {
@@ -53,17 +55,20 @@ public:
   Fixed_size_hash_table (int size_idx)
     {
       size_idx_ = size_idx;
-      int sz = prime_list(size_idx_);
+      int sz = prime_list (size_idx_);
       dict_arr_.set_size (sz);
     }
 
   /// find #s#, or find first empty entry corresponding to #s#
-  int lookup  (K s, unsigned int initial_hash)
+  int lookup (K s, unsigned int initial_hash)
     {
       int sz =dict_arr_.size ();
-      int i = initial_hash % sz;
+      initial_hash = initial_hash % sz; 
+      int i;
       int j = 0;
       while (j <= sz/2) {
+       i = (initial_hash + j*j) % sz;
+       
        if (dict_arr_[i].free_b_)
          return i;
 
@@ -71,7 +76,6 @@ public:
          return i;
 
        j++;
-       i = (i + j*j) % sz;
       }
 
       
@@ -98,13 +102,13 @@ class Hash_table
     {
       Fixed_size_hash_table<K,V> *f = new Fixed_size_hash_table<K,V> (fixed_p_->size_idx_ +1);
       
-      for (int i=0; i < fixed_p_->dict_arr_.size(); i++)
+      for (int i=0; i < fixed_p_->dict_arr_.size (); i++)
        {
          if (fixed_p_->dict_arr_[i].free_b_)
            continue;
 
          K nm (fixed_p_->dict_arr_[i].key_);
-         unsigned int h = (*hash_func_)(nm);
+         unsigned int h = (*hash_func_) (nm);
          int nl = f->lookup (nm, h);
          
          f->dict_arr_[nl] = Hash_table_entry<K,V> (nm, fixed_p_->dict_arr_[i].value_);
@@ -145,18 +149,18 @@ public:
     }
   bool elem_b (K s) const
     {
-      int l =  fixed_p_->lookup (s, (*hash_func_)(s));
+      int l =  fixed_p_->lookup (s, (*hash_func_) (s));
 
       return (l >= 0 && !fixed_p_->dict_arr_[l].free_b_) ;
     }
 
   /**
-     Find and return element.  If #s# is not in the table, create an entry in the table, and init
-   */
+     Find and return element.  If #s# is not in the table, create an
+     entry in the table, and init */
   V& elem (K s)
     {
       int l;
-      unsigned int h = (*hash_func_)(s);
+      unsigned int h = (*hash_func_) (s);
       while ((l= fixed_p_->lookup (s,h)) <0)
        {
          enlarge ();
@@ -168,7 +172,7 @@ public:
     }
   bool try_retrieve (K k, V *v)
   {
-    int l =  fixed_p_->lookup (k, (*hash_func_)(k));
+    int l =  fixed_p_->lookup (k, (*hash_func_) (k));
     if (l < 0 || fixed_p_->dict_arr_[l].free_b_)
       return false;
     else
@@ -200,11 +204,11 @@ public:
 
   V remove (K s)
     {
-      return fixed_p_->remove (s, (*hash_func_)(s));
+      return fixed_p_->remove (s, (*hash_func_) (s));
     }
   friend class Hash_table_iter<K,V>;
 public:
-  unsigned int (*hash_func_)(K);
+  unsigned int (*hash_func_) (K);
 };