]> www.ginac.de Git - cln.git/blobdiff - src/base/hash/cl_hash2.h
Fix compilation with clang.
[cln.git] / src / base / hash / cl_hash2.h
index 6c1ad36727e9113402d835d8fc944a77e6277b07..66593ae6d6294463e258abb051bf4231b71fe7c0 100644 (file)
@@ -3,8 +3,8 @@
 #ifndef _CL_HASH2_H
 #define _CL_HASH2_H
 
-#include "cl_hash.h"
-#include "cl_iterator.h"
+#include "base/hash/cl_hash.h"
+#include "base/cl_iterator.h"
 
 namespace cln {
 
@@ -29,6 +29,11 @@ struct cl_htentry2 {
 
 template <class key1_type, class key2_type, class value_type>
 struct cl_heap_hashtable_2 : public cl_heap_hashtable <cl_htentry2 <key1_type,key2_type,value_type> > {
+protected:
+    // Abbreviations.
+    typedef cl_heap_hashtable <cl_htentry2 <key1_type,key2_type,value_type> > inherited;
+    typedef typename inherited::htxentry htxentry;
+public:
     // Allocation.
     void* operator new (size_t size) { return malloc_hook(size); }
     // Deallocation.
@@ -39,14 +44,14 @@ public:
     // if it is not NULL.
     value_type* get (const key1_type& key1, const key2_type& key2)
     {
-        var long index = _slots[hashcode(key1,key2) % _modulus] - 1;
+        var long index = this->_slots[hashcode(key1,key2) % this->_modulus] - 1;
         while (index >= 0) {
-            if (!(index < _size))
-                cl_abort();
-            if (equal(key1,_entries[index].entry.key1)
-                && equal(key2,_entries[index].entry.key2))
-                return &_entries[index].entry.val;
-            index = _entries[index].next - 1;
+            if (!(index < this->_size))
+                throw runtime_exception();
+            if (equal(key1,this->_entries[index].entry.key1)
+                && equal(key2,this->_entries[index].entry.key2))
+                return &this->_entries[index].entry.val;
+            index = this->_entries[index].next - 1;
         }
         return NULL;
     }
@@ -56,47 +61,47 @@ public:
         var unsigned long hcode = hashcode(key1,key2);
         // Search whether it is already there.
         {
-            var long index = _slots[hcode % _modulus] - 1;
+            var long index = this->_slots[hcode % this->_modulus] - 1;
             while (index >= 0) {
-                if (!(index < _size))
-                    cl_abort();
-                if (equal(key1,_entries[index].entry.key1)
-                    && equal(key2,_entries[index].entry.key2)) {
-                    _entries[index].entry.val = val;
+                if (!(index < this->_size))
+                    throw runtime_exception();
+                if (equal(key1,this->_entries[index].entry.key1)
+                    && equal(key2,this->_entries[index].entry.key2)) {
+                    this->_entries[index].entry.val = val;
                     return;
                 }
-                index = _entries[index].next - 1;
+                index = this->_entries[index].next - 1;
             }
         }
         // Put it into the table.
         prepare_store();
-        var long hindex = hcode % _modulus; // _modulus may have changed!
-        var long index = get_free_index();
-        new (&_entries[index].entry) cl_htentry2<key1_type,key2_type,value_type> (key1,key2,val);
-        _entries[index].next = _slots[hindex];
-        _slots[hindex] = 1+index;
-        _count++;
+        var long hindex = hcode % this->_modulus; // _modulus may have changed!
+        var long index = this->get_free_index();
+        new (&this->_entries[index].entry) cl_htentry2<key1_type,key2_type,value_type> (key1,key2,val);
+        this->_entries[index].next = this->_slots[hindex];
+        this->_slots[hindex] = 1+index;
+        this->_count++;
     }
     // Remove (htrem alias remhash).
     void remove (const key1_type& key1, const key2_type& key2)
     {
-        var long* _index = &_slots[hashcode(key1,key2) % _modulus];
+        var long* _index = &this->_slots[hashcode(key1,key2) % this->_modulus];
         while (*_index > 0) {
             var long index = *_index - 1;
-            if (!(index < _size))
-                cl_abort();
-            if (equal(key1,_entries[index].entry.key1)
-                && equal(key2,_entries[index].entry.key2)) {
+            if (!(index < this->_size))
+                throw runtime_exception();
+            if (equal(key1,this->_entries[index].entry.key1)
+                && equal(key2,this->_entries[index].entry.key2)) {
                 // Remove _entries[index].entry
-                *_index = _entries[index].next;
-                _entries[index].~htxentry();
+                *_index = this->_entries[index].next;
+                this->_entries[index].~htxentry();
                 // The entry is now free.
-                put_free_index(index);
+                this->put_free_index(index);
                 // That's it.
-                _count--;
+                this->_count--;
                 return;
             }
-            _index = &_entries[index].next;
+            _index = &this->_entries[index].next;
         }
     }
     // Iterate through the table.
@@ -110,26 +115,26 @@ private:
     void prepare_store ()
     {
       #if !(defined(__sparc__) && !defined(__GNUC__))
-        if (_freelist < -1)
+        if (this->_freelist < -1)
             return;
         // Can we make room?
-        if (_garcol_fun(this))
-            if (_freelist < -1)
+        if (this->_garcol_fun(this))
+            if (this->_freelist < -1)
                 return;
         // No! Have to grow the hash table.
         grow();
       #else
         // workaround Sun C++ 4.1 inline function compiler bug
-        if (_freelist >= -1) {
-            if (!_garcol_fun(this) || (_freelist >= -1))
+        if (this->_freelist >= -1) {
+            if (!this->_garcol_fun(this) || (this->_freelist >= -1))
                 grow();
         }
       #endif
     }
     void grow ()
     {
-        var long new_size = _size + (_size >> 1) + 1; // _size*1.5
-        var long new_modulus = compute_modulus(new_size);
+        var long new_size = this->_size + (this->_size >> 1) + 1; // _size*1.5
+        var long new_modulus = inherited::compute_modulus(new_size);
         var void* new_total_vector = malloc_hook(new_modulus*sizeof(long) + new_size*sizeof(htxentry));
         var long* new_slots = (long*) ((char*)new_total_vector + 0);
         var htxentry* new_entries = (htxentry *) ((char*)new_total_vector + new_modulus*sizeof(long));
@@ -140,8 +145,8 @@ private:
             new_entries[i].next = free_list_head;
             free_list_head = -2-i;
         }
-        var htxentry* old_entries = _entries;
-        for (var long old_index = 0; old_index < _size; old_index++)
+        var htxentry* old_entries = this->_entries;
+        for (var long old_index = 0; old_index < this->_size; old_index++)
             if (old_entries[old_index].next >= 0) {
                 var key1_type& key1 = old_entries[old_index].entry.key1;
                 var key2_type& key2 = old_entries[old_index].entry.key2;
@@ -154,13 +159,13 @@ private:
                 new_slots[hindex] = 1+index;
                 old_entries[old_index].~htxentry();
             }
-        free_hook(_total_vector);
-        _modulus = new_modulus;
-        _size = new_size;
-        _freelist = free_list_head;
-        _slots = new_slots;
-        _entries = new_entries;
-        _total_vector = new_total_vector;
+        free_hook(this->_total_vector);
+        this->_modulus = new_modulus;
+        this->_size = new_size;
+        this->_freelist = free_list_head;
+        this->_slots = new_slots;
+        this->_entries = new_entries;
+        this->_total_vector = new_total_vector;
     }
 };