You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1022 lines
25 KiB
C

2 years ago
/******************************************************************************************
*
* :
2 years ago
*
*
2 years ago
*
* :
* , .
* .
2 years ago
*
* $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $
*
* $Log: harximoban.h,v $
* Revision 1.2 2006/08/04 03:37:33 zhuzhenhua
* no message
*
* Revision 1.5 2003/06/05 03:56:21 jehu
* doxgen
2 years ago
*
* Revision 1.4 2003/05/06 02:31:31 scada
* : $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $, $Log: harximoban.h,v $
* : $Id: chain_hash.h,v 1.5 2003/06/05 03:56:21 jehu Exp $, Revision 1.2 2006/08/04 03:37:33 zhuzhenhua
* : $Id: chain_hash.h,v 1.5 2003/06/05 03:56:21 jehu Exp $, no message
* : $Id: chain_hash.h,v 1.5 2003/06/05 03:56:21 jehu Exp $,
* : $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $, Revision 1.5 2003/06/05 03:56:21 jehu
* : $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $, doxgen
* : $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $,
2 years ago
*
*
******************************************************************************************/
#ifndef __CHAIN_HASH_H__ASDFJQWPEUTOUDSAFHJDSAFADSAFWQERUGSKGEWRTPYZNXM
#define __CHAIN_HASH_H__ASDFJQWPEUTOUDSAFHJDSAFADSAFWQERUGSKGEWRTPYZNXM
/*!
* \if developer_doc
* \file
*
* \brief
2 years ago
*
* , ,
* .\n
2 years ago
* id: $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $
*
* \author prcharold@sina.com.cn develop1@szscada.com
2 years ago
* \endif
*/
/*!
* \brief
2 years ago
*/
#define CONST_CHAIN_HASH_DEFAULT_MIN_SIZE 0x10
/*!
* \brief
2 years ago
*/
#define CONST_CHAIN_HASH_DEFAULT_MAX_SIZE 0xffff
/*!
* \brief
* \param T ----
2 years ago
*
* \par
2 years ago
* #include <util/util.h>
*/
#pragma pack (1)
// 是pc机系统还是嵌入式系统
2 years ago
#ifdef PC_MACHINE
#ifdef OS_WINDOWS
#pragma pack (push,1)
#else// OS_UNIX
#pragma pack(1)
#endif //OS_UNIX
#endif
template <class T> class TChainHash
{
public:
/*! 根据哈希表存储的元素的关键字以及哈希表的尺寸,求哈希序号的函数重定义 */
2 years ago
typedef u32 (* pfnindex_of_t)(const void * pKey, u32 hash_size);
/*! 根据哈希表存储的元素的关键字的函数重定义 */
2 years ago
typedef void * (* pfnkey_of_t)(const T * pItem);
/*! 两个哈希表中存储的元素的关键字之间的比较,主要是比较是否相等 */
2 years ago
typedef int (* pfncompare_t)(const void * pKey1, const void * pKey2);
/*! 根据已经一个已经存在的哈希元素,赋值一个新的对象 */
2 years ago
typedef T * (* pfncreate_item_t)(const T * pItem);
/*! 释放调用 *pfncreate_item_t 返回的对象 */
2 years ago
typedef void (* pfnfree_item_t)(T * pItem);
/*! 哈希元素之间的拷贝 */
2 years ago
typedef T * (* pfncopy_item_t)(T * pItemDest, const T * pItemSrc);
/*! 使用者提供的内存分配函数 */
2 years ago
typedef void * (* pfnalloc_t)(u32 size);
/*! 释放调用 *pfnalloc_t 分配的内存 */
2 years ago
typedef void (* pfndealloc_t)(void *);
/*!
* "数据"
2 years ago
*/
typedef struct
{
/*!
* "数据"
2 years ago
*/
T * pT;
/*!
* 使
2 years ago
*/
void * pvTKey;
} ITEM_t, *PITEM_t, **PPITEM_t;
/*!
* , "同义", \n
* .\n
* 使线.
2 years ago
*/
typedef struct
{
/*!
* --
2 years ago
*/
u32 cntItems;
/*!
* .
* pItems
2 years ago
*/
u32 cntAllocItems;
/*!
*
2 years ago
*/
PITEM_t pItems;
/*!
* "数据"
2 years ago
*/
T * pT;
/*!
*
2 years ago
*/
void * pvTKey;
} TABLEENTRY_t, *PTABLEENTRY_t, **PPTABLEENTRY_t;
private:
/*!
* 使.
2 years ago
*/
TChainHash(){};
public:
/*!
* \brief
*
* \param u32TableSize --[in]
* \param pfnIndexOf --[in] 使
* \param pfnKeyOf --[in] 使.
* \param pfnCompare --[in]
* \param pfnCreateItem --[in] 使
* \param pfnFreeItem --[in] 使
* \param pfnCopyItem --[in] 使.
* \param pfnAlloc --[in] 使.
* \param pfnDeAlloc --[in] 使pfnAlloc
2 years ago
*
* \note
* 使.
* .
2 years ago
*/
TChainHash(
u32 u32TableSize,
u32 (* pfnIndexOf)(const void * pKey, u32 hash_size),
void * (* pfnKeyOf)(const T * pItem),
int (* pfnCompare)(const void * pKey1, const void * pKey2),
T * (* pfnCreateItem)(const T * pItem),
void (* pfnFreeItem)(T * pItem),
T * (* pfnCopyItem)(T * pItemDest, const T * pItemSrc),
void * (* pfnAlloc)(u32 size),
void (* pfnDeAlloc)(void *)
)
{
/*
* 使
2 years ago
*/
if(pfnIndexOf)
m_pfnIndexOf = pfnIndexOf;
else
m_pfnIndexOf = NULL;
if(pfnKeyOf)
m_pfnKeyOf = pfnKeyOf;
else
m_pfnKeyOf = NULL;
if(pfnCompare)
m_pfnCompare = pfnCompare;
else
m_pfnCompare = NULL;
if(pfnCreateItem)
m_pfnCreateItem = pfnCreateItem;
else
m_pfnCreateItem = NULL;
if(pfnFreeItem)
m_pfnFreeItem = pfnFreeItem;
else
m_pfnFreeItem = NULL;
if(pfnCopyItem)
m_pfnCopyItem = pfnCopyItem;
else
m_pfnCopyItem = NULL;
if(pfnAlloc)
m_pfnAlloc = pfnAlloc;
else
m_pfnAlloc = NULL;
if(pfnDeAlloc)
m_pfnDeAlloc = pfnDeAlloc;
else
m_pfnDeAlloc = NULL;
/*
*
2 years ago
*/
m_uiSize = u32TableSize;
if(m_uiSize > (u32)CONST_CHAIN_HASH_DEFAULT_MAX_SIZE)
m_uiSize = (u32)CONST_CHAIN_HASH_DEFAULT_MAX_SIZE;
if(m_uiSize < CONST_CHAIN_HASH_DEFAULT_MIN_SIZE)
m_uiSize = CONST_CHAIN_HASH_DEFAULT_MIN_SIZE;
/*
*
2 years ago
*/
if(m_pfnAlloc && m_pfnDeAlloc)
m_pTable = (PTABLEENTRY_t)(*m_pfnAlloc)((u32)sizeof(TABLEENTRY_t) * m_uiSize);
else
m_pTable = (PTABLEENTRY_t) new u_8[(sizeof(TABLEENTRY_t) * m_uiSize)];
if(NULL != m_pTable)
memset((void *)m_pTable, 0, sizeof(TABLEENTRY_t) * m_uiSize);
}
/*!
* \brief
2 years ago
*/
virtual ~TChainHash()
{
if(NULL == m_pTable)
return;
/*
* .
2 years ago
*/
for(u32 i = 0; i < m_uiSize; i++)
{
if(NULL != m_pTable[i].pItems)
{
if(m_pfnAlloc && m_pfnDeAlloc)
{
(*m_pfnDeAlloc)(m_pTable[i].pItems);
m_pTable[i].pItems = NULL;
}
else
{
delete m_pTable[i].pItems;
m_pTable[i].pItems = NULL;
}
}
}
/*
*
2 years ago
*/
if(m_pfnAlloc && m_pfnDeAlloc)
{
(*m_pfnDeAlloc)(m_pTable);
m_pTable = NULL;
}
else
{
delete m_pTable;
m_pTable = NULL;
}
}
private:
/*!
*
2 years ago
*/
u32 m_uiSize;
/*!
*
2 years ago
*/
PTABLEENTRY_t m_pTable;
/*!
* \brief ,
2 years ago
*
* \param pKey --[in]
* \param hash_size --[in]
2 years ago
*
* \return
* [0 -- hash_size - 1)
2 years ago
*/
u32 (* m_pfnIndexOf)(const void * pKey, u32 hash_size);
/*!
* \brief
2 years ago
*
* \param pItem --[in]
2 years ago
*
* \return
*
2 years ago
*/
void * (* m_pfnKeyOf)(const T * pItem);
/*!
* \brief
2 years ago
*
* \param pKey1 --[in] 1
* \param pKey2 --[in] 2
2 years ago
*
* \return
* 0 -- pKey1pKey2
* 0 -- pKey1pKey2
* 0 -- pKey1pKey2
2 years ago
*/
int (* m_pfnCompare)(const void * pKey1, const void * pKey2);
/*!
* \brief , .
2 years ago
*
* \param pItem --[in]
2 years ago
*
* \return
*
2 years ago
*/
T * (* m_pfnCreateItem)(const T * pItem);
/*!
* \brief m_pfnCreateItem, m_pfnCreateItem
2 years ago
*
* \param pItem --[in]
2 years ago
*/
void (* m_pfnFreeItem)(T * pItem);
/*!
* \brief .
2 years ago
*
* \param pItemDest --[in]
* \param pItemSrc --[in]
2 years ago
*
* \return
*
2 years ago
*/
T * (* m_pfnCopyItem)(T * pItemDest, const T * pItemSrc);
/*!
* \brief , 使, 使.
2 years ago
*
* \param size --[in] ,
2 years ago
*
* \return
*
2 years ago
*/
void * (* m_pfnAlloc)(u32 size);
/*!
* \brief m_pfnAlloc, m_pfnAlloc, m_pfnAlloc.
2 years ago
*
* \param pVoid --[in][out] m_pfnAlloc
2 years ago
*/
void (* m_pfnDeAlloc)(void * pVoid);
/*!
* \brief , ,
* , , .
2 years ago
*
* \param pEntry -- .
2 years ago
*
* \retval true --
* \retval false --
2 years ago
*
* \note
* 使
2 years ago
*/
bool increaseSynonyms(PTABLEENTRY_t pEntry)
{
// 倍增式地分配内存
2 years ago
u32 count = pEntry->cntAllocItems;
if(0 == count)
count = 2;
else
count = count * 2;
// 首先分配目的尺寸的哈希项数组--同义词数组
2 years ago
PITEM_t pItems = NULL;
if(m_pfnAlloc && m_pfnDeAlloc)
pItems = (PITEM_t) (*m_pfnAlloc)(count * (u32)sizeof(ITEM_t));
else
pItems = (PITEM_t) new u_8[count * sizeof(ITEM_t)];
if(NULL != pItems)
memset((void *)pItems, 0, count * sizeof(ITEM_t));
else
return false;
// 拷贝, 此处显然两块内存不会重叠, 所以使用memcpy内存拷贝, 而不是memmove
2 years ago
memcpy((void *)pItems, (void *)pEntry->pItems, pEntry->cntItems * sizeof(ITEM_t));
if(m_pfnAlloc && m_pfnDeAlloc)
{
(*m_pfnDeAlloc)(pEntry->pItems);
pEntry->pItems = NULL;
}
else
{
delete pEntry->pItems;
pEntry->pItems = NULL;
}
pEntry->pItems = pItems;
pEntry->cntAllocItems = count;
return true;
}
/*!
* \brief "", , , .
2 years ago
*
* \param pEntry --[in]
* \param pT --[in]
* \param pvTKey --[in] .
2 years ago
*
* \retval true --
* \retval false --
2 years ago
*
* \note
* , .
2 years ago
*/
bool insertIntoEntry(PTABLEENTRY_t pEntry, T * pT, void * pvTKey)
{
if(NULL == pEntry->pT)
{
pEntry->pT = pT;
pEntry->pvTKey = pvTKey;
return true;
}
if(pEntry->cntItems == pEntry->cntAllocItems)
{
if(false == increaseSynonyms(pEntry))
return false;
}
u32 count = pEntry->cntItems;
pEntry->pItems[count].pT = pT;
pEntry->pItems[count].pvTKey = pvTKey;
pEntry->cntItems++;
return true;
}
public:
/*!
* \brief
2 years ago
*/
u32 hash_size()
{
return m_uiSize;
}
/*!
* \brief
2 years ago
*/
u32 count()
{
u32 count;
PTABLEENTRY_t pEntry = NULL;
for(int i = 0; i < m_uiSize; i++)
{
if(NULL != pEntry->pT)
count += 1;
if(pEntry->cntItems > 0 && NULL != pEntry->pItems)
count += pEntry->cntItems + 1;
}
return count;
}
/*!
* \brief , , , .
2 years ago
*
* \param pKey --[in]
2 years ago
*
* \retval --
* \retval NULL -- , ,
2 years ago
*
* \note
* ,\n
* 使使:\n
* pfnKeyOf -- 使;\n
* pfnCompare -- ;\n
2 years ago
*/
T * searchItem(const void * pKey)
{
if(NULL == m_pTable || NULL == m_pfnIndexOf || NULL == m_pfnCompare)
return NULL;
/*
* .
2 years ago
*/
u32 u32index = (*m_pfnIndexOf)(pKey, m_uiSize);
if(u32index >= m_uiSize)
return NULL;
// 找到同义词数组
2 years ago
PTABLEENTRY_t pEntry = &m_pTable[u32index];
if(NULL != pEntry->pT && 0 == (*m_pfnCompare)(pKey, pEntry->pvTKey))
return pEntry->pT;
// 查看首项是否符合.
2 years ago
u32 count = pEntry->cntItems;
PITEM_t pSynonyms = pEntry->pItems;
if(0 == count || NULL == pSynonyms)
return NULL;
// 在同义词数组中作线性搜索
2 years ago
for(u32 i = 0; i < count; i++)
{
if(pSynonyms[i].pT)
{
if(0 == (*m_pfnCompare)(pKey, pSynonyms[i].pvTKey))
return pSynonyms[i].pT;
}
}
return NULL;
}
/*!
* \brief , ,
* , , ,
*
2 years ago
*
* \param size --[in]
2 years ago
*
* \retval true --
* \retval false --
2 years ago
*
* \note
* , .\n
* 使使, \n
* pfnIndexOf -- 使.
2 years ago
*/
bool resize(u32 size)
{
if(size == m_uiSize || NULL == m_pfnIndexOf)
return true;
// 设置新的尺寸
2 years ago
u32 u32Size = size;
if(u32Size > CONST_CHAIN_HASH_DEFAULT_MAX_SIZE)
u32Size = CONST_CHAIN_HASH_DEFAULT_MAX_SIZE;
if(u32Size < CONST_CHAIN_HASH_DEFAULT_MIN_SIZE)
u32Size = CONST_CHAIN_HASH_DEFAULT_MIN_SIZE;
// 分配哈希表
2 years ago
PTABLEENTRY_t pTable = NULL;
if(m_pfnAlloc && m_pfnDeAlloc)
pTable = (PTABLEENTRY_t) (*m_pfnAlloc)(sizeof(TABLEENTRY_t) * size);
else
pTable = (PTABLEENTRY_t) new unsigned char[sizeof(TABLEENTRY_t) * size];
if(NULL == pTable)
return false;
memset((void *)pTable, 0, sizeof(TABLEENTRY_t) * size);
// 把原哈希表中的元素逐个插入到新的哈希表中去
2 years ago
u32 u32Index = 0;
PITEM_t pSynonyms = NULL;
u32 i = 0, j = 0;
for(i = 0; i < m_uiSize; i++)
{
if(NULL != m_pTable[i].pT)
{
u32Index = (*m_pfnIndexOf)(m_pTable[i].pvTKey, u32Size);
if(u32Index >= u32Size)
goto label_failed_resize;
if(!insertIntoEntry(&pTable[u32Index], m_pTable[i].pT, m_pTable[i].pvTKey))
goto label_failed_resize;
}
pSynonyms = m_pTable[i].pItems;
for(j = 0; j < m_pTable[i].cntItems; j++)
{
if(NULL != pSynonyms[j].pT)
{
u32Index = (*m_pfnIndexOf)(pSynonyms[j].pvTKey, u32Size);
if(u32Index >= u32Size)
goto label_failed_resize;
if(false == insertIntoEntry(&pTable[u32Index], pSynonyms[j].pT, pSynonyms[j].pvTKey))
goto label_failed_resize;
}
}
}
// 释放原哈希表所扎内存
2 years ago
for(i = 0; i < m_uiSize; i++)
{
if(NULL != m_pTable[i].pItems)
{
if(m_pfnAlloc && m_pfnDeAlloc)
{
(*m_pfnDeAlloc)(m_pTable[i].pItems);
m_pTable[i].pItems = NULL;
}
else
{
delete m_pTable[i].pItems;
m_pTable[i].pItems = NULL;
}
}
}
if(m_pfnAlloc && m_pfnDeAlloc)
{
(*m_pfnDeAlloc)(m_pTable);
m_pTable = NULL;
}
else
{
delete m_pTable;
m_pTable = NULL;
}
// 置换新的哈希表及尺寸
2 years ago
m_pTable = pTable;
m_uiSize = u32Size;
return true;
// 如果执行失败, 则释放执行过程中分配的内存
2 years ago
label_failed_resize:
for(i = 0; i < u32Size; i++)
{
if(NULL != pTable[i].pItems)
{
if(m_pfnAlloc && m_pfnDeAlloc)
{
(*m_pfnDeAlloc)(pTable[i].pItems);
pTable[i].pItems = NULL;
}
else
{
delete pTable[i].pItems;
pTable[i].pItems = NULL;
}
}
}
if(m_pfnAlloc && m_pfnDeAlloc)
{
(*m_pfnDeAlloc)(pTable);
pTable = NULL;
}
else
{
delete pTable;
pTable = NULL;
}
return false;
}
/*!
* \brief
2 years ago
*
* \param pT --[in]
2 years ago
*
* \retval true --
* \retval false --
2 years ago
*
* \note
* , .\n
* 使使\n
* pfnIndexOf -- 使\n
* pfnKeyOf -- 使.
2 years ago
*/
bool insertItem(T * pT)
{
if(NULL == pT || NULL == m_pTable || NULL == m_pfnKeyOf || NULL == m_pfnIndexOf)
return false;
// 求关键字及哈希值
2 years ago
void * pKey = (*m_pfnKeyOf)(pT);
u32 index = (*m_pfnIndexOf)(pKey, m_uiSize);
if(index >= m_uiSize)
return false;
PTABLEENTRY_t pEntry = &m_pTable[index];
if(NULL == pEntry->pT)
{
pEntry->pT = pT;
pEntry->pvTKey = pKey;
return true;
}
// 插入到同义词数组中去
2 years ago
if(pEntry->cntItems == pEntry->cntAllocItems)
{
if(false == this->increaseSynonyms(pEntry))
return false;
}
PITEM_t pSynonyms = pEntry->pItems;
u32 count = pEntry->cntItems;
pSynonyms[count].pT = pT;
pSynonyms[count].pvTKey = pKey;
pEntry->cntItems++;
return true;
}
/*!
* \brief
2 years ago
*
* \param pT --[in]
2 years ago
*
* \retval true --
* \retval false -- , ,
2 years ago
*
* \note
* false, \n
* 使使\n
* pfnIndexOf -- 使\n
* pfnKeyOf -- 使. \n
* pfnCompare -- \n
* pfnFreeItem-- 使pfnAlloc
2 years ago
*/
bool deleteItem(T * pT)
{
if(NULL == pT || NULL == m_pTable || NULL == m_pfnKeyOf
|| NULL == m_pfnIndexOf || NULL == m_pfnCompare || NULL == m_pfnFreeItem)
return false;
void * pKey = (*m_pfnKeyOf)(pT);
return deleteItem_with_key(pKey);
}
/*!
* \brief
2 years ago
*
* \param pKey --[in]
2 years ago
*
* \retval true --
* \retval false -- , ,
2 years ago
*
* \note
* false, \n
* 使使\n
* pfnIndexOf -- 使\n
* pfnCompare -- \n
* pfnFreeItem -- 使pfnAlloc
2 years ago
*/
bool deleteItem_with_key(void * pKey)
{
u32 i = 0;
if(NULL == m_pTable || NULL == m_pfnIndexOf || NULL == m_pfnCompare || NULL == m_pfnFreeItem)
return false;
// 求哈希值
2 years ago
u32 index = (*m_pfnIndexOf)(pKey, m_uiSize);
if(index >= m_uiSize)
return false;
PTABLEENTRY_t pEntry = &m_pTable[index];
if(NULL != pEntry->pT && 0 == (*m_pfnCompare)(pKey, pEntry->pvTKey))
{
(*m_pfnFreeItem)(pEntry->pT);
pEntry->pT = NULL;
pEntry->pvTKey = NULL;
return true;
}
if(0 == pEntry->cntItems || NULL == pEntry->pItems)
return false;
u32 count = pEntry->cntItems;
PITEM_t pSynonyms = pEntry->pItems;
for(i = 0; i < count; i++)
{
if(NULL == pSynonyms[i].pT)
continue;
if(0 == (*m_pfnCompare)(pKey, pSynonyms[i].pvTKey))
{
(*m_pfnFreeItem)(pSynonyms[i].pT);
pSynonyms[i].pT = NULL;
pSynonyms[i].pvTKey = NULL;
memmove((void *)(pSynonyms + i), (void *)(pSynonyms + i + 1), sizeof(*pSynonyms) * (count - i - 1));
memset((void *)(pSynonyms + count - 1), 0, sizeof(*pSynonyms));
pEntry->cntItems -= 1;
break;
}
}
if(i == count)
return false;
else
return true;
}
/*!
* \brief
2 years ago
*
* \param pT --[in]
2 years ago
*
* \retval --
* \retval NULL -- , ,
2 years ago
*
* \note
* , .\n
* NULL, \n
* 使使\n
* pfnIndexOf -- 使\n
* pfnKeyOf -- 使. \n
* pfnCompare -- \n
2 years ago
*/
T * detachItem(T * pT)
{
if(NULL == pT || NULL == m_pfnKeyOf || NULL == m_pfnIndexOf || NULL == m_pfnCompare)
return NULL;
void * pKey = (*m_pfnKeyOf)(pT);
return detachItem_with_key(pKey);
}
/*!
* \brief
2 years ago
*
* \param pKey --[in]
2 years ago
*
* \retval --
* \retval NULL -- , ,
2 years ago
*
* \note
* , .\n
* NULL, \n
* 使使\n
* pfnIndexOf -- 使\n
* pfnCompare -- \n
2 years ago
*/
T * detachItem_with_key(void * pKey)
{
if(NULL == m_pTable || NULL == m_pfnIndexOf || NULL == m_pfnCompare)
return NULL;
u32 index = (*m_pfnIndexOf)(pKey, m_uiSize);
if(index >= m_uiSize)
return NULL;
PTABLEENTRY_t pEntry = &m_pTable[index];
if(NULL != pEntry->pT && 0 == (*m_pfnCompare)(pKey, pEntry->pvTKey))
{
T * ptempT = pEntry->pT;
pEntry->pT = NULL;
pEntry->pvTKey = NULL;
return ptempT;
}
if(0 == pEntry->cntItems || NULL == pEntry->pItems)
return NULL;
u32 count = pEntry->cntItems;
PITEM_t pSynonyms = pEntry->pItems;
for(u32 i = 0; i < count; i++)
{
if(NULL == pSynonyms[i].pT)
continue;
if(0 == (*m_pfnCompare)(pKey, pSynonyms[i].pvTKey))
{
T * ptempT = NULL;
ptempT = pSynonyms[i].pT;
memmove((void *)(pSynonyms + i), (void *)(pSynonyms + i + 1), sizeof(*pSynonyms) * (count - i - 1));
memset((void *)(pSynonyms + count - 1), 0, sizeof(*pSynonyms));
pEntry->cntItems -= 1;
return ptempT;
}
}
return NULL;
}
/*!
* \brief
2 years ago
*
* \note
* 使使\n
* pfnFreeItem -- 使pfnAlloc
2 years ago
*/
bool deleteItems()
{
if(NULL == m_pTable)
return true;
if(m_pfnFreeItem== NULL)
return false;
PTABLEENTRY_t pEntry = NULL;
PITEM_t pSynonyms = NULL;
for(u32 i = 0; i < m_uiSize; i++)
{
pEntry = &m_pTable[i];
if(pEntry->pT)
(*m_pfnFreeItem)(pEntry->pT);
pEntry->pT = NULL;
pEntry->pvTKey = NULL;
if(pEntry->cntItems > 0 && NULL != pEntry->pItems)
{
pSynonyms = pEntry->pItems;
for(u32 j = 0; j < pEntry->cntItems; j++)
{
if(pSynonyms[j].pT)
(*m_pfnFreeItem)(pSynonyms[j].pT);
pSynonyms[j].pT = NULL;
pSynonyms[j].pvTKey = NULL;
}
}
pEntry->cntItems = 0;
}
return true;
}
/*!
* \brief
2 years ago
*/
void detachItems()
{
if(NULL == m_pTable)
return;
PTABLEENTRY_t pEntry = NULL;
for(u32 i = 0; i < m_uiSize; i++)
{
pEntry = &m_pTable[i];
pEntry->pT = NULL;
pEntry->pvTKey = NULL;
if(pEntry->cntItems > 0 && NULL != pEntry->pItems)
memset((void *)pEntry->pItems, 0, sizeof(pEntry->pItems[0]) * pEntry->cntAllocItems);
pEntry->cntItems = 0;
}
}
};
// 是pc机系统还是嵌入式系统
2 years ago
#ifdef PC_MACHINE
#ifdef OS_WINDOWS
#pragma pack (pop)
#else// OS_UNIX
#pragma pack (0)
#endif //OS_UNIX
#endif
#endif //__CHAIN_HASH_H__ASDFJQWPEUTOUDSAFHJDSAFADSAFWQERUGSKGEWRTPYZNXM