From 9220842a1565e6f99cc483d59f042a61aafc5a4e Mon Sep 17 00:00:00 2001 From: Richard Kreckel Date: Fri, 1 Aug 2003 16:39:16 +0000 Subject: [PATCH] More dependent base resolution issues * src/base/hash/cl_hash.h (cl_heap_hashtable::iterator()): portable syntactic simplification. * src/base/hash/cl_hashset.h: Preceed inherited members with this->. * src/base/hash/cl_hash1.h: Likewise for member functions. * src/base/hash/cl_hash2.h: Likewise. * src/base/hash/cl_hashuniq.h: Likewise. * src/base/hash/cl_hashuniqweak.h: Likewise. * src/base/hash/cl_hash.h: Revert explicit static member function lookup since that was GCC's fault. * src/base/hash/cl_hash2weak.h: Likewise. * src/base/hash/cl_hashuniqweak.h: Likewise. --- ChangeLog | 15 +++++++ src/base/hash/cl_hash.h | 9 +--- src/base/hash/cl_hash1.h | 11 ++--- src/base/hash/cl_hash2.h | 11 ++--- src/base/hash/cl_hash2weak.h | 4 +- src/base/hash/cl_hashset.h | 79 +++++++++++++++++---------------- src/base/hash/cl_hashuniq.h | 11 ++--- src/base/hash/cl_hashuniqweak.h | 6 +-- 8 files changed, 80 insertions(+), 66 deletions(-) diff --git a/ChangeLog b/ChangeLog index 49c054f..d832787 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2003-08-01 Richard Kreckel + + More dependent base resolution issues + * src/base/hash/cl_hash.h (cl_heap_hashtable::iterator()): + portable syntactic simplification. + * src/base/hash/cl_hashset.h: Preceed inherited members with this->. + * src/base/hash/cl_hash1.h: Likewise for member functions. + * src/base/hash/cl_hash2.h: Likewise. + * src/base/hash/cl_hashuniq.h: Likewise. + * src/base/hash/cl_hashuniqweak.h: Likewise. + * src/base/hash/cl_hash.h: Revert explicit static member function + lookup since that was GCC's fault. + * src/base/hash/cl_hash2weak.h: Likewise. + * src/base/hash/cl_hashuniqweak.h: Likewise. + 2003-06-29 Richard Kreckel Dependent base resolution needed for GCC-3.4 diff --git a/src/base/hash/cl_hash.h b/src/base/hash/cl_hash.h index 7dc4435..adf8466 100644 --- a/src/base/hash/cl_hash.h +++ b/src/base/hash/cl_hash.h @@ -43,7 +43,7 @@ public: void operator delete (void* ptr) { free_hook(ptr); } // Constructor: build a new, empty table. cl_heap_hashtable (long initial_size = 5) : cl_heap (), - _size (initial_size), _count (0), _garcol_fun (cl_heap_hashtable::no_garcol) + _size (initial_size), _count (0), _garcol_fun (no_garcol) { _modulus = compute_modulus(_size); _total_vector = malloc_hook(_modulus*sizeof(long) + _size*sizeof(htxentry)); @@ -181,12 +181,7 @@ public: template inline _cl_hashtable_iterator cl_heap_hashtable::iterator () { -#if defined(__GNUC__) - return _cl_hashtable_iterator::_cl_hashtable_iterator(_entries,_size); -#else // workaround most C++ compilers' bug - typedef _cl_hashtable_iterator _cl_hashtable_iterator_type; - return _cl_hashtable_iterator_type(_entries,_size); -#endif + return _cl_hashtable_iterator(_entries,_size); } } // namespace cln diff --git a/src/base/hash/cl_hash1.h b/src/base/hash/cl_hash1.h index 7fe8330..9dd37cf 100644 --- a/src/base/hash/cl_hash1.h +++ b/src/base/hash/cl_hash1.h @@ -32,8 +32,9 @@ struct cl_htentry1 { template struct cl_heap_hashtable_1 : public cl_heap_hashtable > { protected: - // Abbreviation. - typedef typename cl_heap_hashtable >::htxentry htxentry; + // Abbreviations. + typedef cl_heap_hashtable > inherited; + typedef typename inherited::htxentry htxentry; public: // Allocation. void* operator new (size_t size) { return malloc_hook(size); } @@ -75,7 +76,7 @@ public: // Put it into the table. prepare_store(); var long hindex = hcode % this->_modulus; // _modulus may have changed! - var long index = get_free_index(); + var long index = this->get_free_index(); new (&this->_entries[index].entry) cl_htentry1 (key,val); this->_entries[index].next = this->_slots[hindex]; this->_slots[hindex] = 1+index; @@ -94,7 +95,7 @@ public: *_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. this->_count--; return; @@ -132,7 +133,7 @@ private: void grow () { var long new_size = this->_size + (this->_size >> 1) + 1; // _size*1.5 - var long new_modulus = compute_modulus(new_size); + 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)); diff --git a/src/base/hash/cl_hash2.h b/src/base/hash/cl_hash2.h index 407a414..3f7a20f 100644 --- a/src/base/hash/cl_hash2.h +++ b/src/base/hash/cl_hash2.h @@ -30,8 +30,9 @@ struct cl_htentry2 { template struct cl_heap_hashtable_2 : public cl_heap_hashtable > { protected: - // Abbreviation. - typedef typename cl_heap_hashtable >::htxentry htxentry; + // Abbreviations. + typedef cl_heap_hashtable > inherited; + typedef typename inherited::htxentry htxentry; public: // Allocation. void* operator new (size_t size) { return malloc_hook(size); } @@ -75,7 +76,7 @@ public: // Put it into the table. prepare_store(); var long hindex = hcode % this->_modulus; // _modulus may have changed! - var long index = get_free_index(); + var long index = this->get_free_index(); new (&this->_entries[index].entry) cl_htentry2 (key1,key2,val); this->_entries[index].next = this->_slots[hindex]; this->_slots[hindex] = 1+index; @@ -95,7 +96,7 @@ public: *_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. this->_count--; return; @@ -133,7 +134,7 @@ private: void grow () { var long new_size = this->_size + (this->_size >> 1) + 1; // _size*1.5 - var long new_modulus = compute_modulus(new_size); + 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)); diff --git a/src/base/hash/cl_hash2weak.h b/src/base/hash/cl_hash2weak.h index 0e3e514..c3c4279 100644 --- a/src/base/hash/cl_hash2weak.h +++ b/src/base/hash/cl_hash2weak.h @@ -33,7 +33,7 @@ public: : cl_heap_hashtable_2 (), _maygc_htentry (maygc_htentry) { - this->_garcol_fun = cl_heap_weak_hashtable_2::garcol; + this->_garcol_fun = garcol; } private: // Garbage collection. @@ -75,7 +75,7 @@ private: else if (2*removed < ht->_count) { // Table shrank by less than a factor of 1/1.5. // Don't expand the table now, but expand it next time. - ht->_garcol_fun = cl_heap_weak_hashtable_2::garcol_nexttime; + ht->_garcol_fun = garcol_nexttime; return cl_true; } else { // Table shrank much. Don't expand the table now, diff --git a/src/base/hash/cl_hashset.h b/src/base/hash/cl_hashset.h index 6617d47..2c13e88 100644 --- a/src/base/hash/cl_hashset.h +++ b/src/base/hash/cl_hashset.h @@ -23,8 +23,9 @@ struct cl_htsetentry { template struct cl_heap_hashtable_set : public cl_heap_hashtable > { protected: - // Abbreviation. - typedef typename cl_heap_hashtable >::htxentry htxentry; + // Abbreviations. + typedef cl_heap_hashtable > inherited; + typedef typename inherited::htxentry htxentry; public: // Allocation. void* operator new (size_t size) { return malloc_hook(size); } @@ -34,13 +35,13 @@ public: // Lookup (htref alias gethash). bool get (const key1_type& key) { - var long index = _slots[hashcode(key) % _modulus] - 1; + var long index = this->_slots[hashcode(key) % this->_modulus] - 1; while (index >= 0) { - if (!(index < _size)) + if (!(index < this->_size)) cl_abort(); - if (equal(key,_entries[index].entry.key)) + if (equal(key,this->_entries[index].entry.key)) return true; - index = _entries[index].next - 1; + index = this->_entries[index].next - 1; } return false; } @@ -50,43 +51,43 @@ public: var unsigned long hcode = hashcode(key); // 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)) + if (!(index < this->_size)) cl_abort(); - if (equal(key,_entries[index].entry.key)) + if (equal(key,this->_entries[index].entry.key)) 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_htsetentry (key); - _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_htsetentry (key); + this->_entries[index].next = this->_slots[hindex]; + this->_slots[hindex] = 1+index; + this->_count++; } // Remove (htrem alias remhash). void remove (const key1_type& key) { - var long* _index = &_slots[hashcode(key) % _modulus]; + var long* _index = &this->_slots[hashcode(key) % this->_modulus]; while (*_index > 0) { var long index = *_index - 1; - if (!(index < _size)) + if (!(index < this->_size)) cl_abort(); - if (equal(key,_entries[index].entry.key)) { + if (equal(key,this->_entries[index].entry.key)) { // 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. @@ -100,26 +101,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->_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 (!_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)); @@ -130,8 +131,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& key = old_entries[old_index].entry.key; var long hindex = hashcode(key) % new_modulus; @@ -142,13 +143,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; } }; diff --git a/src/base/hash/cl_hashuniq.h b/src/base/hash/cl_hashuniq.h index c7a8696..81af352 100644 --- a/src/base/hash/cl_hashuniq.h +++ b/src/base/hash/cl_hashuniq.h @@ -32,8 +32,9 @@ struct cl_htuniqentry { template struct cl_heap_hashtable_uniq : public cl_heap_hashtable > { protected: - // Abbreviation. - typedef typename cl_heap_hashtable >::htxentry htxentry; + // Abbreviations. + typedef cl_heap_hashtable > inherited; + typedef typename inherited::htxentry htxentry; public: // Allocation. void* operator new (size_t size) { return malloc_hook(size); } @@ -73,7 +74,7 @@ public: // Put it into the table. prepare_store(); var long hindex = hcode % this->_modulus; // _modulus may have changed! - var long index = get_free_index(); + var long index = this->get_free_index(); new (&this->_entries[index].entry) cl_htuniqentry (value_type((struct hashuniq *)0, key)); this->_entries[index].next = this->_slots[hindex]; this->_slots[hindex] = 1+index; @@ -92,7 +93,7 @@ public: *_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. this->_count--; return; @@ -130,7 +131,7 @@ private: void grow () { var long new_size = this->_size + (this->_size >> 1) + 1; // _size*1.5 - var long new_modulus = compute_modulus(new_size); + 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)); diff --git a/src/base/hash/cl_hashuniqweak.h b/src/base/hash/cl_hashuniqweak.h index 77246d6..7aca192 100644 --- a/src/base/hash/cl_hashuniqweak.h +++ b/src/base/hash/cl_hashuniqweak.h @@ -32,7 +32,7 @@ public: cl_heap_weak_hashtable_uniq () : cl_heap_hashtable_uniq () { - this->_garcol_fun = cl_heap_weak_hashtable_uniq::garcol; + this->_garcol_fun = garcol; } private: // Garbage collection. @@ -75,7 +75,7 @@ private: else if (2*removed < ht->_count) { // Table shrank by less than a factor of 1/1.5. // Don't expand the table now, but expand it next time. - ht->_garcol_fun = cl_heap_weak_hashtable_uniq::garcol_nexttime; + ht->_garcol_fun = garcol_nexttime; return cl_true; } else { // Table shrank much. Don't expand the table now, @@ -87,7 +87,7 @@ private: { var cl_heap_weak_hashtable_uniq* ht = (cl_heap_weak_hashtable_uniq*)_ht; // Now ht->_garcol_fun = garcol_nexttime. - ht->_garcol_fun = cl_heap_weak_hashtable_uniq::garcol; + ht->_garcol_fun = garcol; return cl_false; } };