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

📄 hash_bucket_t.h

📁 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework)
💻 H
字号:
/* -*- c++ -*- */// Hey Emacs!  This is a C++ file!// Hash_Bucket_T.h,v 1.2 2002/01/19 22:39:11 dhinton Exp#ifndef JAWS_HASH_BUCKET_T_H#define JAWS_HASH_BUCKET_T_H#include "ace/Containers.h"#define JAWS_HASH_BUCKET_ITEM JAWS_Hash_Bucket_Item<EXT_ID, INT_ID>#define JAWS_HASH_BUCKET_DLCSTACK JAWS_Hash_Bucket_DLCStack<EXT_ID, INT_ID>#define JAWS_HASH_BUCKET_DLCSTACK_ITERATOR \        JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>// Why Hash_Bucket?//// This is an attempt to simplify the creation of high-performance// hash tables with respect to concurrent access by multiple threads.// To this end, we attempt to raise the amount of concurrency through// the use or readers/writer locks rather than through mutual// exclusion.template <class EXT_ID, class INT_ID>class JAWS_Hash_Bucket_Item{public:  JAWS_Hash_Bucket_Item (const EXT_ID &ext_id, const INT_ID &int_id,                        JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *next = 0,                        JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *prev = 0);  JAWS_Hash_Bucket_Item (JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *next = 0,                        JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *prev = 0);  ~JAWS_Hash_Bucket_Item (void);  // Destructor.  EXT_ID ext_id_;  // Key used to look up an entry.  INT_ID int_id_;  // The contents of the entry itself.  JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *next_;  // Pointer to the next item in the bucket of overflow nodes.  JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *prev_;  // Pointer to the prev item in the bucket of overflow nodes.};template <class EXT_ID, class INT_ID> class JAWS_Hash_Bucket_DLCStack_Iterator;template <class EXT_ID, class INT_ID, class EQ_FUNC>class JAWS_Hash_Bucket_Manager;template <class EXT_ID, class INT_ID>class JAWS_Hash_Bucket_DLCStack// Create a doubly linked circular stack to be managed by the// Hash_Bucket_Manager{  friend class JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>;public:  JAWS_Hash_Bucket_DLCStack (ACE_Allocator *alloc = 0);  ~JAWS_Hash_Bucket_DLCStack (void);  int is_empty (void) const;  // Returns 1 if the container is empty, otherwise returns 0.  JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *push (const EXT_ID &ext_id,                                              const INT_ID &int_id);  // Adds <new_item> to the head of the list.  // Returns the new item that was inserted.  JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *pop (void);  // Removes and returns the first <item> in the list.  Returns  // internal node's address on success, 0 if the queue was empty.  // This method will *not* free the internal node.  void reset (void);  // Reset the <JAWS_Hash_Bucket_DLCStack> to be empty.  // Notice that since no one is interested in the items within,  // This operation will delete all items.  int remove (JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *item);  // If item is still part of the CStack, it is removed.  // In anycase, if there is no error, item is freed.  // Returns 0 if ok, -1 on error.  ACE_Allocator *allocator_;private:  JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *head_;  JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *tail_;};template <class EXT_ID, class INT_ID>class JAWS_Hash_Bucket_DLCStack_Iterator{public:  JAWS_Hash_Bucket_DLCStack_Iterator (const JAWS_HASH_BUCKET_DLCSTACK &dlcstack);  int first (void);  // Moves to first element in the set, clears done flag.  Returns 0  // if empty, 1 otherwise.  int last (void);  // Moves to last element in the set, clears done flag.  Returns 0 if  // empty, 1 otherwise.  int advance (void);  // Move forward by one element of set.  Returns 0 if empty or we end  // up being the first element in the set, 1 otherwise.  If advance  // takes us to the first element, done is set to true.  int revert (void);  // Move backward by one element of set.  Returns 0 if empty or we  // end up being the last element in the set, 1 otherwise.  If revert  // takes us to the last element, done is set to true.  int next (JAWS_HASH_BUCKET_ITEM *&item);  int next (JAWS_HASH_BUCKET_ITEM *&item) const;  // Pass back the next item.  Returns 0 if done is true, 1 otherwise.  int prev (JAWS_HASH_BUCKET_ITEM *&item);  int prev (JAWS_HASH_BUCKET_ITEM *&item) const;  // Pass back the previous item.  Returns 0 if done is true, 1  // otherwise.  int done (void) const;  // Returns 1 if done_ flag is set, 0 otherwise.  done_ flag is set  // if next takes us to first element or prev takes us to last  // element.private:  const JAWS_HASH_BUCKET_DLCSTACK &dlcstack_;  JAWS_HASH_BUCKET_ITEM *next_;  JAWS_HASH_BUCKET_ITEM *prev_;  int done_;};template <class EXT_ID, class INT_ID, class EQ_FUNC>class JAWS_Hash_Bucket_Manager{public:  JAWS_Hash_Bucket_Manager (ACE_Allocator *alloc = 0);  int open (ACE_Allocator *alloc = 0);  ~JAWS_Hash_Bucket_Manager (void);  int close (void);  int find (const EXT_ID &ext_id) const;  int find (const EXT_ID &ext_id, INT_ID &int_id) const;  // Locate <ext_id> and pass out parameter via <int_id>.  If found,  // return 0, returns -1 if not found.  int bind (const EXT_ID &ext_id, const INT_ID &int_id);  int trybind (const EXT_ID &ext_id, INT_ID &int_id);  // Associate <ext_id> with <int_id> if and only if <ext_id> is not  // in the map.  If <ext_id> is already in the map then the <int_id>  // parameter is assigned the existing value in the map.  Returns 0  // if a new entry is bound successfully, returns 1 if an attempt is  // made to bind an existing entry, and returns -1 if failures occur.  int rebind (const EXT_ID &ext_id, const INT_ID &int_id,	      EXT_ID &old_ext_id, INT_ID &old_int_id);  // Associate <ext_id> with <int_id>.  If <ext_id> is not in the map  // then behaves just like <bind>.  Otherwise, store the old values  // of <ext_id> and <int_id> into the "out" parameters and rebind the  // new parameters.  This is very useful if you need to have an  // atomic way of updating <JAWS_Hash_Map_Entrys> and you also need full  // control over memory allocation.  Returns 0 if a new entry is  // bound successfully, returns 1 if an existing entry was rebound,  // and returns -1 if failures occur.  int unbind (const EXT_ID &ext_id);  int unbind (const EXT_ID &ext_id, INT_ID &int_id);  // Break any association of <ext_id>.  Returns the value of <int_id>  // in case the caller needs to deallocate memory.  Return value is 0  // if unbind succeeds, -1 otherwise.protected:  JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *find_i (const EXT_ID &ext_id) const;  // Returns the item associated with ext_id if found in list.  // Returns NULL if not found.private:  JAWS_Hash_Bucket_DLCStack<EXT_ID, INT_ID> dlcstack_;};#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)#include "JAWS/Hash_Bucket_T.cpp"#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */#endif /* JAWS_HASH_BUCKET_T_H */

⌨️ 快捷键说明

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