?? hash_bucket_t.cpp
字號:
// Hash_Bucket_T.cpp,v 1.1 2000/04/27 23:43:20 jxh Exp
#ifndef JAWS_HASH_BUCKET_T_CPP
#define JAWS_HASH_BUCKET_T_CPP
#include "JAWS/Hash_Bucket_T.h"
// -----------------
// Hash_Bucket_Item
// -----------------
template <class EXT_ID, class INT_ID>
JAWS_Hash_Bucket_Item<EXT_ID, INT_ID>
::JAWS_Hash_Bucket_Item (const EXT_ID &ext_id, const INT_ID &int_id,
JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *next,
JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *prev)
: ext_id_ (ext_id),
int_id_ (int_id),
next_ (next),
prev_ (prev)
{
}
template <class EXT_ID, class INT_ID>
JAWS_Hash_Bucket_Item<EXT_ID, INT_ID>
::JAWS_Hash_Bucket_Item (JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *next,
JAWS_Hash_Bucket_Item<EXT_ID, INT_ID> *prev)
: next_ (next),
prev_ (prev)
{
}
template <class EXT_ID, class INT_ID>
JAWS_Hash_Bucket_Item<EXT_ID, INT_ID>::~JAWS_Hash_Bucket_Item (void)
{
this->next_ = 0;
this->prev_ = 0;
}
// ---------------------
// Hash_Bucket_DLCStack
// ---------------------
template <class EXT_ID, class INT_ID>
JAWS_Hash_Bucket_DLCStack<EXT_ID, INT_ID>::
JAWS_Hash_Bucket_DLCStack (ACE_Allocator *alloc)
: allocator_ (alloc),
head_ (0),
tail_ (0)
{
if (this->allocator_ == 0)
this->allocator_ = ACE_Allocator::instance ();
}
template <class EXT_ID, class INT_ID>
JAWS_Hash_Bucket_DLCStack<EXT_ID, INT_ID>::
~JAWS_Hash_Bucket_DLCStack (void)
{
this->reset ();
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack<EXT_ID, INT_ID>::
is_empty (void) const
{
return this->head_ == 0 && this->tail_ == 0;
}
template <class EXT_ID, class INT_ID> JAWS_HASH_BUCKET_ITEM *
JAWS_Hash_Bucket_DLCStack<EXT_ID, INT_ID>::
push (const EXT_ID &ext_id, const INT_ID &int_id)
{
size_t malloc_size = sizeof (JAWS_HASH_BUCKET_ITEM);
JAWS_HASH_BUCKET_ITEM *item;
ACE_NEW_MALLOC_RETURN (item,
(JAWS_HASH_BUCKET_ITEM *)
this->allocator_->malloc (malloc_size),
JAWS_HASH_BUCKET_ITEM (ext_id, int_id), 0);
if (item != 0)
{
if (this->is_empty ())
{
this->head_ = item;
this->tail_ = item;
item->next_ = this->head_;
item->prev_ = this->tail_;
}
else
{
item->next_ = this->head_;
item->prev_ = this->tail_;
this->head_->prev_ = item;
this->tail_->next_ = item;
this->head_ = item;
}
}
return item;
}
template <class EXT_ID, class INT_ID> JAWS_HASH_BUCKET_ITEM *
JAWS_Hash_Bucket_DLCStack<EXT_ID, INT_ID>::pop (void)
{
JAWS_HASH_BUCKET_ITEM *item = 0;
if (! this->is_empty ())
{
item = this->head_;
if (this->head_ == this->tail_)
{
this->head_ = this->tail_ = 0;
}
else
{
this->head_ = this->head_->next_;
this->head_->prev_ = this->tail_;
this->tail_->next_ = this->head_;
}
item->next_ = 0;
item->prev_ = 0;
}
return item;
}
template <class EXT_ID, class INT_ID> void
JAWS_Hash_Bucket_DLCStack<EXT_ID, INT_ID>::reset (void)
{
JAWS_HASH_BUCKET_ITEM *item = 0;
while ((item = this->pop ()) != 0)
this->remove (item);
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack<EXT_ID, INT_ID>::remove (JAWS_HASH_BUCKET_ITEM *item)
{
int result = 0;
if (item != 0)
{
if (item->next_ != 0 && item->prev_ != 0)
{
if (item->next_ != item)
{
if (this->head_ == item)
this->head_ = item->next_;
if (this->tail_ == item)
this->tail_ = item->prev_;
item->next_->prev_ = item->prev_;
item->prev_->next_ = item->next_;
}
else
{
this->head_ = this->tail_ = 0;
}
item->next_ = 0;
item->prev_ = 0;
}
if (item->next_ == 0 && item->prev_ == 0)
{
ACE_DES_FREE_TEMPLATE2 (item, this->allocator_->free,
JAWS_Hash_Bucket_Item, EXT_ID, INT_ID);
}
else
result = -1;
}
return result;
}
// ------------------------------
// Hash_Bucket_DLCStack_Iterator
// ------------------------------
template <class EXT_ID, class INT_ID>
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::
JAWS_Hash_Bucket_DLCStack_Iterator (const JAWS_HASH_BUCKET_DLCSTACK &dlcstack)
: dlcstack_ (dlcstack),
next_ (0),
prev_ (0),
done_ (0)
{
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::first (void)
{
int result = 0;
if (! this->dlcstack_.is_empty ())
{
result = 1;
this->next_ = this->dlcstack_.head_;
this->prev_ = this->dlcstack_.tail_;
this->done_ = 0;
}
return result;
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::last (void)
{
return this->first ();
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::advance (void)
{
int result = 1;
if (this->next_ != 0)
{
this->prev_ = this->next_;
this->next_ = this->next_->next_;
if (this->next_ == this->dlcstack_.head_)
{
this->done_ = 1;
result = 0;
}
}
else
result = this->first ();
return result;
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::revert (void)
{
int result = 1;
if (this->prev_ != 0)
{
this->next_ = this->prev_;
this->prev_ = this->prev_->prev_;
if (this->prev_ == this->dlcstack_.tail_)
{
this->done_ = 1;
result = 0;
}
}
else
result = this->last ();
return result;
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::
next (JAWS_HASH_BUCKET_ITEM *&item)
{
if (this->next_ == 0)
this->first ();
item = this->next_;
return ! this->done ();
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::
next (JAWS_HASH_BUCKET_ITEM *&item) const
{
item = this->next_;
return ! this->done ();
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::
prev (JAWS_HASH_BUCKET_ITEM *&item)
{
if (this->prev_ == 0)
this->last ();
item = this->prev_;
return ! this->done ();
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::
prev (JAWS_HASH_BUCKET_ITEM *&item) const
{
item = this->prev_;
return ! this->done ();
}
template <class EXT_ID, class INT_ID> int
JAWS_Hash_Bucket_DLCStack_Iterator<EXT_ID, INT_ID>::done (void) const
{
return this->done_;
}
// --------------------
// Hash_Bucket_Manager
// --------------------
template <class EXT_ID, class INT_ID, class EQ_FUNC>
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>
::JAWS_Hash_Bucket_Manager (ACE_Allocator *alloc)
: dlcstack_ (alloc)
{
if (alloc == 0)
this->dlcstack_.allocator_ = ACE_Allocator::instance ();
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> int
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>::open (ACE_Allocator *alloc)
{
this->dlcstack_.allocator_ = alloc;
if (alloc == 0)
this->dlcstack_.allocator_ = ACE_Allocator::instance ();
return 0;
}
template <class EXT_ID, class INT_ID, class EQ_FUNC>
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>::~JAWS_Hash_Bucket_Manager (void)
{
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> int
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>::close (void)
{
this->dlcstack_.reset ();
return 0;
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> JAWS_HASH_BUCKET_ITEM *
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>
::find_i (const EXT_ID &ext_id) const
{
JAWS_HASH_BUCKET_DLCSTACK_ITERATOR iter (this->dlcstack_);
JAWS_HASH_BUCKET_ITEM *item = 0;
if (iter.first ())
while (!iter.done ())
{
iter.next (item);
if (item && EQ_FUNC (item->ext_id_, ext_id))
break;
iter.advance ();
}
return (item && EQ_FUNC (item->ext_id_, ext_id)) ? item : 0;
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> int
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>::find (const EXT_ID &ext_id,
INT_ID &int_id) const
{
int result = -1;
JAWS_HASH_BUCKET_ITEM *item = this->find_i (ext_id);
if (item)
{
int_id = item->int_id_;
result = 0;
}
return result;
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> int
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>
::find (const EXT_ID &ext_id) const
{
INT_ID dummy_id;
return this->find (ext_id, dummy_id);
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> int
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>::bind (const EXT_ID &ext_id,
const INT_ID &int_id)
{
int result = 0;
if (this->find (ext_id) == 0)
{
result = 1;
}
else
{
if (this->dlcstack_.push (ext_id, int_id) == 0)
result = -1;
}
return result;
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> int
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>::trybind (const EXT_ID &ext_id,
INT_ID &int_id)
{
int result = 0;
if (this->find (ext_id, int_id) == 0)
{
result = 1;
}
else
{
if (this->dlcstack_.push (ext_id, int_id) == 0)
result = -1;
}
return result;
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> int
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>::rebind (const EXT_ID &ext_id,
const INT_ID &int_id,
EXT_ID &old_ext_id,
INT_ID &old_int_id)
{
int result = 0;
JAWS_HASH_BUCKET_ITEM *item = this->find_i (ext_id);
if (item)
{
result = 1;
old_ext_id = item->ext_id_;
old_int_id = item->int_id_;
this->dlcstack_.remove (item);
}
if (this->dlcstack_.push (ext_id, int_id) == 0)
result = -1;
return result;
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> int
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>::unbind (const EXT_ID &ext_id,
INT_ID &int_id)
{
int result = -1;
JAWS_HASH_BUCKET_ITEM *item = this->find_i (ext_id);
if (item)
{
result = 0;
int_id = item->int_id_;
this->dlcstack_.remove (item);
}
return result;
}
template <class EXT_ID, class INT_ID, class EQ_FUNC> int
JAWS_Hash_Bucket_Manager<EXT_ID,INT_ID,EQ_FUNC>::unbind (const EXT_ID &ext_id)
{
INT_ID dummy_id;
return this->unbind (ext_id, dummy_id);
}
#endif /* JAWS_HASH_BUCKET_T_CPP */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -