diff options
Diffstat (limited to 'ACE/apps/JAWS2/JAWS/Cache_Heap_T.cpp')
-rw-r--r-- | ACE/apps/JAWS2/JAWS/Cache_Heap_T.cpp | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/ACE/apps/JAWS2/JAWS/Cache_Heap_T.cpp b/ACE/apps/JAWS2/JAWS/Cache_Heap_T.cpp new file mode 100644 index 00000000000..b19ff8e79b1 --- /dev/null +++ b/ACE/apps/JAWS2/JAWS/Cache_Heap_T.cpp @@ -0,0 +1,290 @@ +// $Id$ + +#ifndef JAWS_CACHE_HEAP_T_CPP +#define JAWS_CACHE_HEAP_T_CPP + +#include "JAWS/Cache_Heap_T.h" +#include "JAWS/Cache_Manager_T.h" + +template <class EXT_ID, class FACT, class H_FN, class E_FN> +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::JAWS_Cache_Heap (ACE_Allocator *alloc, + size_t maxsize) + : allocator_ (alloc), + maxsize_ (maxsize), + size_ (0) +{ + if (this->allocator_ == 0) + this->allocator_ = ACE_Allocator::instance (); + + size_t memsize + = this->maxsize_ * sizeof (Cache_Heap_Item *); + + this->heap_ = (Cache_Heap_Item **) this->allocator_->malloc (memsize); + if (this->heap_) + { + for (size_t i = 0; i < this->maxsize_; i++) + this->heap_[i] = 0; + } + else + { + this->maxsize_ = 0; + // should indicate something + } +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::~JAWS_Cache_Heap (void) +{ + if (this->heap_ != 0) + { + for (size_t i = 0; i < this->maxsize_; i++) + { + if (this->heap_[i]) + { + ACE_DES_FREE_TEMPLATE4(this->heap_[i], this->allocator_->free, + JAWS_Cache_Heap_Item, + EXT_ID, FACT, H_FN, E_FN); + + this->heap_[i] = 0; + } + } + this->allocator_->free (this->heap_); + this->heap_ = 0; + } + + this->allocator_ = 0; +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> int +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::is_empty (void) const +{ + return (this->size_ == 0); +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> int +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::is_full (void) const +{ + return (this->size_ == this->maxsize_); +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> size_t +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::size (void) const +{ + return this->size_; +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> size_t +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::maxsize (void) const +{ + return this->maxsize_; +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> int +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::maxsize (Cache_Manager *cm, + size_t new_maxsize) +{ + int result = -1; + + size_t memsize + = new_maxsize * sizeof (Cache_Heap_Item *); + + Cache_Heap_Item **new_heap + = (Cache_Heap_Item **) this->allocator_->malloc (memsize); + if (new_heap) + { + while (new_maxsize < this->size_) + cm->FLUSH_i (); + + for (size_t i = 0; i < new_maxsize; i++) + if (i < this->size_) + new_heap[i] = this->heap_[i]; + else + new_heap[i] = 0; + + Cache_Heap_Item ** volatile temp = this->heap_; + this->heap_ = new_heap; + this->maxsize_ = new_maxsize; + this->allocator_->free (temp); + result = 0; + } + + return result; +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> void +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::insert_i (Cache_Heap_Item *item) +{ + /* ASSERT: this->size_ < this->maxsize_ */ + + size_t i; + + for (i = this->size_ + 1; i > 1; i /= 2) + { + if (item->priority () > this->heap_[i/2 - 1]->priority ()) + break; + + this->heap_[i-1] = this->heap_[i/2 - 1]; + this->heap_[i-1]->heap_idx_ = i-1; + } + + this->heap_[i-1] = item; + this->heap_[i-1]->heap_idx_ = i-1; + this->size_++; +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> int +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::insert (const EXT_ID &ext_id, + JAWS_Cache_Object *const &int_id) +{ + if (this->is_full ()) + return -1; + + Cache_Heap_Item *item; + ACE_NEW_MALLOC_RETURN (item, + (Cache_Heap_Item *) + this->allocator_->malloc (sizeof (Cache_Heap_Item)), + Cache_Heap_Item (ext_id, int_id), -1); + + this->insert_i (item); + + return 0; +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> void +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::remove_i (void) +{ + /* ASSERT: this->size_ > 0 */ + this->size_--; + Cache_Heap_Item *temp = this->heap_[this->size_]; + this->heap_[this->size_] = 0; + + size_t i = 1; + while (2*i <= this->size_) + { + size_t child = 2*i; + if ((child < this->size_) + && (this->heap_[2*i]->priority () + < this->heap_[2*i - 1]->priority ())) + child = 2*i + 1; + + if (temp->priority () < this->heap_[child-1]->priority ()) + break; + + this->heap_[i-1] = this->heap_[child-1]; + this->heap_[i-1]->heap_idx_ = i-1; + i = child; + } + + if (this->size_ > 0) + { + this->heap_[i-1] = temp; + this->heap_[i-1]->heap_idx_ = i-1; + } +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> void +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::remove_i (size_t pos) +{ + Cache_Heap_Item *item = this->heap_[pos]; + + if (pos > 0) + { + int i = pos + 1; + do + { + this->heap_[i-1] = this->heap_[i/2 - 1]; + this->heap_[i-1]->heap_idx_ = i-1; + i /= 2; + } + while (i > 1); + } + + this->heap_[0] = item; + + this->remove_i (); +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> int +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::remove (EXT_ID &ext_id, + JAWS_Cache_Object *&int_id) +{ + if (this->is_empty ()) + return -1; + + Cache_Heap_Item *item = this->heap_[0]; + item->int_id_->heap_item (0); + + this->remove_i (); + + ext_id = item->ext_id_; + int_id = item->int_id_; + + ACE_DES_FREE_TEMPLATE4(item, this->allocator_->free, + JAWS_Cache_Heap_Item, + EXT_ID, FACT, H_FN, E_FN); + + item = 0; + return 0; +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> int +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::remove (void *item) +{ + if (item == 0) + return 0; + + Cache_Heap_Item *real_item = (Cache_Heap_Item *) item; + + // Make sure the item is where it thinks it is. + if (this->heap_[real_item->heap_idx_] != real_item) + return -1; + + real_item->int_id_->heap_item (0); + this->remove_i (real_item->heap_idx_); + + ACE_DES_FREE_TEMPLATE4(real_item, this->allocator_->free, + JAWS_Cache_Heap_Item, + EXT_ID, FACT, H_FN, E_FN); + + real_item = 0; + + return 0; +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> int +JAWS_Cache_Heap<EXT_ID,FACT,H_FN,E_FN>::adjust (void *item) +{ + if (item == 0) + return 0; + + Cache_Heap_Item *real_item = (Cache_Heap_Item *) item; + + // Make sure the item is where it thinks it is. + if (this->heap_[real_item->heap_idx_] != real_item) + return -1; + + this->remove_i (real_item->heap_idx_); + this->insert_i (real_item); + + return 0; +} + + +template <class EXT_ID, class FACT, class H_FN, class E_FN> +JAWS_Cache_Heap_Item<EXT_ID,FACT,H_FN,E_FN>:: +JAWS_Cache_Heap_Item (const EXT_ID &ext_id, JAWS_Cache_Object *const &int_id) + : ext_id_ (ext_id), + int_id_ (int_id), + heap_idx_ (0) +{ + this->int_id_->heap_item (this); +} + +template <class EXT_ID, class FACT, class H_FN, class E_FN> unsigned int +JAWS_Cache_Heap_Item<EXT_ID,FACT,H_FN,E_FN>::priority (void) +{ + return this->int_id_->priority (); +} + + +#endif /* JAWS_CACHE_HEAP_T_CPP */ |