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

📄 map_manager_t.h

📁 ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识
💻 H
字号:
/* -*- c++ -*- */// $Id: Map_Manager_T.h 51890 2003-08-25 07:46:52Z kobica $#ifndef JAWS_CACHE_MAP_MANAGER_T_H#define JAWS_CACHE_MAP_MANAGER_T_H#include "jaws3/Map_Manager.h"template <class EXT_ID>class JAWS_Cache_Map_Entry{public:  JAWS_Cache_Map_Entry ( const EXT_ID &ext_id                       , ACE_Message_Block *&int_id                       , JAWS_Cache_Map_Entry<EXT_ID, INT_ID> *next = 0                       , JAWS_Cache_Map_Entry<EXT_ID, INT_ID> *prev = 0                       );  JAWS_Cache_Map_Entry ( JAWS_Cache_Map_Entry<EXT_ID, INT_ID> *next                       , JAWS_Cache_Map_Entry<EXT_ID, INT_ID> *prev                       );private:  ~JAWS_Cache_Map_Entry (void) {}public:  EXT_ID ext_id_;  ACE_Message_Block *int_id_;  time_t last_update_;  int ref_count_;  JAWS_Cache_Map_Entry<EXT_ID, INT_ID> *next_;  JAWS_Cache_Map_Entry<EXT_ID, INT_ID> *prev_;  int replacement_index_;};template <class EXT_ID, class EQ_FUNC, class ACE_LOCK>class JAWS_Map_Manager{public:  JAWS_Map_Manager (ACE_Allocator *alloc = 0);  JAWS_Map_Manager (size_t size, ACE_Allocator *alloc = 0);  int open ( size_t size = ACE_DEFAULT_MAP_SIZE           , ACE_Allocator *alloc = 0);  int close (void);  ~JAWS_Map_Manager (void);  int bind ( const EXT_ID &key           , const void * const &data           , size_t size           , JAWS_Cache_Map_Entry<EXT_ID> *&entry           );  int rebind ( const EXT_ID &key             , const void * const &data             , size_t size             , JAWS_Cache_Map_Entry<EXT_ID> *&entry             );  int find (const EXT_ID &key, JAWS_Cache_Map_Entry<EXT_ID> *&entry);  int unbind (JAWS_Cache_Map_Entry<EXT_ID> *entry);  ACE_Message_Block * make_message_block ( const void * const &data                                         , size_t size);  ACE_LOCK lock_;  JAWS_Cache_Map_Entry<EXT_ID> *head_;  JAWS_Cache_Map_Entry<EXT_ID> *tail_;  ACE_Allocator *allocator_;};template <class EXT_ID, class ACE_LOCK>class JAWS_Cache_Replacement{public:  JAWS_Cache_Replacement (ACE_Allocator *alloc = 0);  JAWS_Cache_Replacement (size_t max_entries, ACE_Allocator *alloc = 0);  virtual int open ( size_t max_entries = ACE_DEFAULT_MAP_SIZE                   , ACE_Allocator *alloc = 0);  virtual int close (void);  virtual ~JAWS_Cache_Replacement (void);  virtual int insert (JAWS_Cache_Map_Entry<EXT_ID> *entry) = 0;  virtual int update (JAWS_Cache_Map_Entry<EXT_ID> *entry) = 0;  virtual int remove (JAWS_Cache_Map_Entry<EXT_ID> *entry) = 0;  virtual JAWS_Cache_Map_Entry<EXT_ID> * expire (void) = 0;  JAWS_Cache_Map_Entry<EXT_ID> **table_;  ACE_Allocator *allocator_;  ACE_LOCK lock_;};template <class EXT_ID, class ACE_LOCK>class JAWS_LRU_Cache_Replacement  : public JAWS_Cache_Replacement<EXT_ID, ACE_LOCK>{public:  JAWS_LRU_Cache_Replacement (ACE_Allocator *alloc = 0);  JAWS_LRU_Cache_Replacement (size_t max_entries, ACE_Allocator *alloc = 0);  int open ( size_t max_entries = ACE_DEFAULT_MAP_SIZE           , ACE_Allocator *alloc = 0);  int close (void);  ~JAWS_LRU_Cache_Replacement (void);  int insert (JAWS_Cache_Map_Entry<EXT_ID> *entry);  int update (JAWS_Cache_Map_Entry<EXT_ID> *entry);  int remove (JAWS_Cache_Map_Entry<EXT_ID> *entry);  JAWS_Cache_Map_Entry<EXT_ID> * expire (void);protected:  void insert_i (JAWS_Cache_Map_Entry<EXT_ID> *entry)  {    if (this->tail_ == -1)      this->tail_ = 0;    this->table_[this->tail_] = entry;    this->next_[this->tail_] = this->tail_+1;    this->prev_[this->tail_+1] = this->tail_;    this->next_[this->tail_+1] = -1;    if (this->head_ == -1)      this->head_ = 0;    this->count_++;  }  void update_i (int i)  {    if (i == this->tail_)      return;    JAWS_Cache_Map_Entry<EXT_ID> *entry = this->table_[i];    this->remove_i (i);    this->insert_i (entry);  }  void remove_i (int i)  {    if (this->count_ == 0 || i >= this->count_)      return;    --this->count_;    if (i == this->tail_)      this->tail_ = this->prev_[i];    if (i == this->head_)      this->head_ = this->next_[i];    if (i < this->count_)      {        this->swap_i (i, this->count_);        i = this->count_;      }    int p_i = this->prev_[i];    int n_i = this->next_[i];    this->next_[p_i] = n_i;    this->prev_[n_i] = p_i;    if (this->count_ == 0)      this->head_ = -1;  }  void swap_i (int i, int j)  {    int p_i, p_j, n_i, n_j;    p_i = this->prev_[i];    n_i = this->next_[i];    p_j = this->prev_[j];    n_j = this->next_[j];    this->next_[p_i] = j;    this->prev_[n_i] = j;    this->next_[p_j] = i;    this->prev_[n_j] = i;    JAWS_Cache_Map_Entry<EXT_ID> *entry = this->table_[i];    this->table_[i] = this->table_[j];    this->table_[j] = entry;    this->table_[i]->replacement_index_ = i;    this->table_[j]->replacement_index_ = j;    if (this->head_ == i || this->head_ == j)      this->head_ = (this->head_ == i) ? j : i;    if (this->tail_ == i || this->tail_ == j)      this->tail_ = (this->tail_ == i) ? j : i;  }private:  int count_;  int head_;  int tail_;  int *next_;  int *prev_;};template <class EXT_ID, class ACE_LOCK>class JAWS_LFU_Cache_Replacement  : public JAWS_Cache_Replacement<EXT_ID, ACE_LOCK>{public:  JAWS_LFU_Cache_Replacement (ACE_Allocator *alloc = 0);  JAWS_LFU_Cache_Replacement (size_t max_entries, ACE_Allocator *alloc = 0);  int open ( size_t max_entries = ACE_DEFAULT_MAP_SIZE           , ACE_Allocator *alloc = 0);  int close (void);  ~JAWS_LFU_Cache_Replacement (void);  int insert (JAWS_Cache_Map_Entry<EXT_ID> *entry);  int update (JAWS_Cache_Map_Entry<EXT_ID> *entry);  int remove (JAWS_Cache_Map_Entry<EXT_ID> *entry);  JAWS_Cache_Map_Entry<EXT_ID> * expire (void);protected:  int sift_up (int i)  {    JAWS_Cache_Map_Entry<EXT_ID> *entry = this->table_[i];    while (i > 0)      {        int p = this->parent (i);        if (entry->ref_count_ >= this->table_[p]->ref_count_)          break;        this->table_[i] = this->table_[p];        this->table_[i]->replacement_index_ = i;        i = p;      }    this->table_[i] = entry;    this->table_[i]->replacement_index_ = i;    return i;  }  int sift_down (int i)  {    JAWS_Cache_Map_Entry<EXT_ID> *entry = this->table_[i];    while (this->left (i) < this->count_)      {        int l, r;        l = this->left (i);        r = this->right (i);        if (r >= this->count_            || this->table_[l]->ref_count_ <= this->table_[r]->ref_count_)          r = l;        if (entry->ref_count_ <= this->table_[r]->ref_count_)          break;        this->table_[i] = this->table_[r];        this->table_[i]->replacement_index_ = i;        i = r;      }    this->table_[i] = entry;    this->table_[i]->replacement_index_ = i;    return i;  }  int sift (int i)  {    int i_sifted;    i_sifted = this->sift_up (i);    if (i_sifted == i)      i_sifted = this->sift_down (i);    return i_sifted;  }  int parent (int i) { return --i/2; }  int left (int i) { return 2*i+1; }  int right (int i) { return 2*i+2; }private:  int count_;};template <class EXT_ID, class ACE_LOCK>class JAWS_FIFO_Cache_Replacement  : public JAWS_Cache_Replacement<EXT_ID, ACE_LOCK>{public:  JAWS_FIFO_Cache_Replacement (ACE_Allocator *alloc = 0);  JAWS_FIFO_Cache_Replacement (size_t max_entries, ACE_Allocator *alloc = 0);  int open ( size_t max_entries = ACE_DEFAULT_MAP_SIZE           , ACE_Allocator *alloc = 0);  int close (void);  ~JAWS_FIFO_Cache_Replacement (void);  int insert (JAWS_Cache_Map_Entry<EXT_ID> *entry);  int update (JAWS_Cache_Map_Entry<EXT_ID> *entry);  int remove (JAWS_Cache_Map_Entry<EXT_ID> *entry);  JAWS_Cache_Map_Entry<EXT_ID> * expire (void);  int head_;  int tail_;  JAWS_FIFO_Cache_Replacement_Info *info_;};template <class EXT_ID, class ACE_LOCK>class JAWS_RANDOM_Cache_Replacement  : public JAWS_Cache_Replacement<EXT_ID, ACE_LOCK>{public:  JAWS_RANDOM_Cache_Replacement (ACE_Allocator *alloc = 0);  JAWS_RANDOM_Cache_Replacement (size_t max_entries, ACE_Allocator *alloc = 0);  int open ( size_t max_entries = ACE_DEFAULT_MAP_SIZE           , ACE_Allocator *alloc = 0);  int close (void);  ~JAWS_RANDOM_Cache_Replacement (void);  int insert (JAWS_Cache_Map_Entry<EXT_ID> *entry);  int update (JAWS_Cache_Map_Entry<EXT_ID> *entry);  int remove (JAWS_Cache_Map_Entry<EXT_ID> *entry);  JAWS_Cache_Map_Entry<EXT_ID> * expire (void);  int head_;  int tail_;  JAWS_RANDOM_Cache_Replacement_Info *info_;};template <class EXT_ID, class INT_ID, class HASH_FUNC, class EQ_FUNC, class ACE_LOCK>class JAWS_Cache_Map_Manager{public:  JAWS_Map_Manager<EXT_ID, INT_ID, EQ_FUNC, ACE_};#endif /* JAWS_CACHE_MAP_MANAGER_T_H */

⌨️ 快捷键说明

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