⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cache_heap_t.cpp

📁 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework)
💻 CPP
字号:
// Cache_Heap_T.cpp,v 1.2 2000/05/31 19:15:07 jxh Exp#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> intJAWS_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> intJAWS_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_tJAWS_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_tJAWS_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> intJAWS_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> voidJAWS_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> intJAWS_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> voidJAWS_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> voidJAWS_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> intJAWS_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> intJAWS_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> intJAWS_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 intJAWS_Cache_Heap_Item<EXT_ID,FACT,H_FN,E_FN>::priority (void){  return this->int_id_->priority ();}#endif /* JAWS_CACHE_HEAP_T_CPP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -