📄 hash_bucket_t.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 + -