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
23 KiB
C

2 years ago
/******************************************************************************************
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ϣģ<EFBFBD><EFBFBD>
*
* Ŀ<EFBFBD><EFBFBD>:
* <EFBFBD>һ<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>, Ϊ<EFBFBD>ճ<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
* <EFBFBD>ù<EFBFBD>ϣģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ.
*
* $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
* <EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>doxgen<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>
*
* Revision 1.4 2003/05/06 02:31:31 scada
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $, $Log: harximoban.h,v $
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: $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
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: $Id: chain_hash.h,v 1.5 2003/06/05 03:56:21 jehu Exp $, no message
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: $Id: chain_hash.h,v 1.5 2003/06/05 03:56:21 jehu Exp $,
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $, Revision 1.5 2003/06/05 03:56:21 jehu
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $, <EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>doxgen<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $,
*
*
******************************************************************************************/
#ifndef __CHAIN_HASH_H__ASDFJQWPEUTOUDSAFHJDSAFADSAFWQERUGSKGEWRTPYZNXM
#define __CHAIN_HASH_H__ASDFJQWPEUTOUDSAFHJDSAFADSAFWQERUGSKGEWRTPYZNXM
/*!
* \if developer_doc
* \file
*
* \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ϣģ<EFBFBD>ͷ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD>һ<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>, Ϊ<EFBFBD>ճ<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
* <EFBFBD>ù<EFBFBD>ϣģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ.\n
* id: $Id: harximoban.h,v 1.2 2006/08/04 03:37:33 zhuzhenhua Exp $
*
* \author <EFBFBD><EFBFBD>С<EFBFBD><EFBFBD> prcharold@sina.com.cn develop1@szscada.com
* \endif
*/
/*!
* \brief <EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>Ĭ<EFBFBD>Ϲ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>
*/
#define CONST_CHAIN_HASH_DEFAULT_MIN_SIZE 0x10
/*!
* \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>Ϲ<EFBFBD>ϣ<EFBFBD>ߴ<EFBFBD>
*/
#define CONST_CHAIN_HASH_DEFAULT_MAX_SIZE 0xffff
/*!
* \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>
* \param T ---- <EFBFBD>ڹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \par <EFBFBD><EFBFBD><EFBFBD>ٲο<EFBFBD>
* #include <util/util.h>
*/
#pragma pack (1)
// <20><>pc<70><63>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>ʽϵͳ
#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:
/*! <20><><EFBFBD>ݹ<EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><E6B4A2>Ԫ<EFBFBD>صĹؼ<C4B9><D8BC><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ijߴ<DFB4><E7A3AC><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ŵĺ<C5B5><C4BA><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD> */
typedef u32 (* pfnindex_of_t)(const void * pKey, u32 hash_size);
/*! <20><><EFBFBD>ݹ<EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><E6B4A2>Ԫ<EFBFBD>صĹؼ<C4B9><D8BC>ֵĺ<D6B5><C4BA><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD> */
typedef void * (* pfnkey_of_t)(const T * pItem);
/*! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>д洢<D0B4><E6B4A2>Ԫ<EFBFBD>صĹؼ<C4B9><D8BC><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ıȽϣ<C8BD><CFA3><EFBFBD>Ҫ<EFBFBD>DZȽ<C7B1><C8BD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> */
typedef int (* pfncompare_t)(const void * pKey1, const void * pKey2);
/*! <20><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ڵĹ<DAB5>ϣԪ<CFA3>أ<EFBFBD><D8A3><EFBFBD>ֵһ<D6B5><D2BB><EFBFBD>µĶ<C2B5><C4B6><EFBFBD> */
typedef T * (* pfncreate_item_t)(const T * pItem);
/*! <20>ͷŵ<CDB7><C5B5><EFBFBD> *pfncreate_item_t <20><><EFBFBD>صĶ<D8B5><C4B6><EFBFBD> */
typedef void (* pfnfree_item_t)(T * pItem);
/*! <20><>ϣԪ<CFA3><D4AA>֮<EFBFBD><D6AE><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD> */
typedef T * (* pfncopy_item_t)(T * pItemDest, const T * pItemSrc);
/*! ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9A9><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><E4BAAF> */
typedef void * (* pfnalloc_t)(u32 size);
/*! <20>ͷŵ<CDB7><C5B5><EFBFBD> *pfnalloc_t <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD> */
typedef void (* pfndealloc_t)(void *);
/*!
* <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
*/
typedef struct
{
/*!
* <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
*/
T * pT;
/*!
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD>ϣ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صļ<EFBFBD>ֵ
*/
void * pvTKey;
} ITEM_t, *PITEM_t, **PPITEM_t;
/*!
* <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>һ<EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"ͬ<EFBFBD><EFBFBD>"<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD>, \n
* <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n
* <EFBFBD>ڼ򵥵<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*/
typedef struct
{
/*!
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С--<EFBFBD><EFBFBD>ͻ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
*/
u32 cntItems;
/*!
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻԪ<EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD>.
* ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pItems<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>Ĵ<EFBFBD>С
*/
u32 cntAllocItems;
/*!
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
PITEM_t pItems;
/*!
* <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
*/
T * pT;
/*!
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ
*/
void * pvTKey;
} TABLEENTRY_t, *PTABLEENTRY_t, **PPTABLEENTRY_t;
private:
/*!
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>ȱʡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*/
TChainHash(){};
public:
/*!
* \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param u32TableSize --[in] <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
* \param pfnIndexOf --[in] ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĴӼ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣֵ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \param pfnKeyOf --[in] ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD>ֵ.
* \param pfnCompare --[in] <EFBFBD>Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD><EFBFBD>ֵĴ<EFBFBD>С
* \param pfnCreateItem --[in] ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>
* \param pfnFreeItem --[in] ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>
* \param pfnCopyItem --[in] ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
* \param pfnAlloc --[in] ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>.
* \param pfnDeAlloc --[in] ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>pfnAlloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>
*
* \note
* <EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ôӹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĺ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ij<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*/
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 *)
)
{
/*
* <EFBFBD><EFBFBD>סʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD>ߺ<EFBFBD><EFBFBD><EFBFBD>
*/
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;
/*
* <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>ijߴ<EFBFBD>
*/
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;
/*
* <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD>
*/
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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual ~TChainHash()
{
if(NULL == m_pTable)
return;
/*
* <EFBFBD>ͷŹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>õ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ռ<EFBFBD>.
*/
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;
}
}
}
/*
* <EFBFBD>ͷŹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>õ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ռ<EFBFBD>
*/
if(m_pfnAlloc && m_pfnDeAlloc)
{
(*m_pfnDeAlloc)(m_pTable);
m_pTable = NULL;
}
else
{
delete m_pTable;
m_pTable = NULL;
}
}
private:
/*!
* <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ijߴ<EFBFBD>
*/
u32 m_uiSize;
/*!
* <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD>
*/
PTABLEENTRY_t m_pTable;
/*!
* \brief <EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ǰ<EFBFBD>޳<EFBFBD>ͻ<EFBFBD>ߴ<EFBFBD>
*
* \param pKey --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ
* \param hash_size --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>ijߴ<EFBFBD>
*
* \return
* [0 -- hash_size - 1)<EFBFBD><EFBFBD>Χ<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
u32 (* m_pfnIndexOf)(const void * pKey, u32 hash_size);
/*!
* \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ
*
* \param pItem --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \return
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ
*/
void * (* m_pfnKeyOf)(const T * pItem);
/*!
* \brief <EFBFBD>Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
*
* \param pKey1 --[in] <EFBFBD><EFBFBD>ֵ1
* \param pKey2 --[in] <EFBFBD><EFBFBD>ֵ2
*
* \return
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0 -- pKey1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pKey2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 0 -- pKey1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pKey2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* С<EFBFBD><EFBFBD>0 -- pKey1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>pKey2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int (* m_pfnCompare)(const void * pKey1, const void * pKey2);
/*!
* \brief <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>µĹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
* \param pItem --[in] Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \return
* <EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
T * (* m_pfnCreateItem)(const T * pItem);
/*!
* \brief <EFBFBD><EFBFBD>m_pfnCreateItem<EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>m_pfnCreateItem<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param pItem --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void (* m_pfnFreeItem)(T * pItem);
/*!
* \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>Ĺ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*
* \param pItemDest --[in] Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \param pItemSrc --[in] Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \return
* Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
T * (* m_pfnCopyItem)(T * pItemDest, const T * pItemSrc);
/*!
* \brief <EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>, ʹ<EFBFBD>øú<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ϣģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>.
*
* \param size --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ijߴ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><EFBFBD>λ
*
* \return
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*/
void * (* m_pfnAlloc)(u32 size);
/*!
* \brief <EFBFBD><EFBFBD>m_pfnAlloc<EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>m_pfnAlloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_pfnAlloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ֵ.
*
* \param pVoid --[in][out] <EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_pfnAlloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
*/
void (* m_pfnDeAlloc)(void * pVoid);
/*!
* \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>һ<EFBFBD>пռ<EFBFBD><EFBFBD>ʱ, <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӿռ<EFBFBD>,
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>˽<EFBFBD>к<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD>ʱ, <EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>.
*
* \param pEntry -- <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>һ<EFBFBD><EFBFBD>.
*
* \retval true -- <EFBFBD>ɹ<EFBFBD>
* \retval false -- ʧ<EFBFBD><EFBFBD>
*
* \note
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
*/
bool increaseSynonyms(PTABLEENTRY_t pEntry)
{
// <20><><EFBFBD><EFBFBD>ʽ<EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD>ڴ<EFBFBD>
u32 count = pEntry->cntAllocItems;
if(0 == count)
count = 2;
else
count = count * 2;
// <09><><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>Ŀ<EFBFBD>ijߴ<C4B3><DFB4>Ĺ<EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
// <09><><EFBFBD><EFBFBD>, <20>˴<EFBFBD><CBB4><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>ڴ治<DAB4><E6B2BB><EFBFBD>ص<EFBFBD>, <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>memcpy<70>ڴ濽<DAB4><E6BFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>memmove
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 <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ԫ<EFBFBD>ز<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<EFBFBD><EFBFBD>", <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>˽<EFBFBD>к<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD>ʱ, <EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>.
*
* \param pEntry --[in] <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>һ<EFBFBD><EFBFBD>
* \param pT --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \param pvTKey --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ.
*
* \retval true -- <EFBFBD>ɹ<EFBFBD>
* \retval false -- ʧ<EFBFBD><EFBFBD>
*
* \note
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>ԭͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα.
*/
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 <EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>ijߴ<EFBFBD>
*/
u32 hash_size()
{
return m_uiSize;
}
/*!
* \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
*/
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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD>ֵĹ<EFBFBD>ϣԪ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ӧ<EFBFBD>ñ<EFBFBD>֤û<EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD>Ĺؼ<EFBFBD><EFBFBD><EFBFBD>.
*
* \param pKey --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ
*
* \retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -- <EFBFBD>ɹ<EFBFBD>
* \retval NULL -- ʧ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>ڹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
*
* \note
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ,\n
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>:\n
* pfnKeyOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD>ֵ;\n
* pfnCompare -- <EFBFBD>Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD><EFBFBD>ֵĴ<EFBFBD>С;\n
*/
T * searchItem(const void * pKey)
{
if(NULL == m_pTable || NULL == m_pfnIndexOf || NULL == m_pfnCompare)
return NULL;
/*
* <EFBFBD>ɼ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣֵ.
*/
u32 u32index = (*m_pfnIndexOf)(pKey, m_uiSize);
if(u32index >= m_uiSize)
return NULL;
// <09>ҵ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PTABLEENTRY_t pEntry = &m_pTable[u32index];
if(NULL != pEntry->pT && 0 == (*m_pfnCompare)(pKey, pEntry->pvTKey))
return pEntry->pT;
// <09><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>.
u32 count = pEntry->cntItems;
PITEM_t pSynonyms = pEntry->pItems;
if(0 == count || NULL == pSynonyms)
return NULL;
// <09><>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD>ȵĹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>ijߴ<EFBFBD><EFBFBD>Ƚ<EFBFBD>С, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɳ<EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>Ҫ<EFBFBD>ܹ<EFBFBD><EFBFBD><EFBFBD>̬
* <EFBFBD>ĸı<EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>ijߴ<EFBFBD>
*
* \param size --[in] <EFBFBD>µĹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>
*
* \retval true -- <EFBFBD>ɹ<EFBFBD>
* \retval false -- ʧ<EFBFBD><EFBFBD>
*
* \note
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤ԭ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα.\n
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>, \n
* pfnIndexOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĴӼ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣֵ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
*/
bool resize(u32 size)
{
if(size == m_uiSize || NULL == m_pfnIndexOf)
return true;
// <09><><EFBFBD><EFBFBD><EFBFBD>µijߴ<C4B3>
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;
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3>
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);
// <09><>ԭ<EFBFBD><D4AD>ϣ<EFBFBD><CFA3><EFBFBD>е<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µĹ<C2B5>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD>ȥ
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;
}
}
}
// <09>ͷ<EFBFBD>ԭ<EFBFBD><D4AD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
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;
}
// <09>û<EFBFBD><C3BB>µĹ<C2B5>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>
m_pTable = pTable;
m_uiSize = u32Size;
return true;
// <09><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>ʧ<EFBFBD><CAA7>, <20><><EFBFBD>ͷ<EFBFBD>ִ<EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param pT --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \retval true -- <EFBFBD>ɹ<EFBFBD>
* \retval false -- ʧ<EFBFBD><EFBFBD>
*
* \note
* <EFBFBD><EFBFBD>ʧ<EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֱ<EFBFBD>֤ԭ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα.\n
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>\n
* pfnIndexOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĴӼ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣֵ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n
* pfnKeyOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD>ֵ.
*/
bool insertItem(T * pT)
{
if(NULL == pT || NULL == m_pTable || NULL == m_pfnKeyOf || NULL == m_pfnIndexOf)
return false;
// <09><><EFBFBD>ؼ<EFBFBD><D8BC>ּ<EFBFBD><D6BC><EFBFBD>ϣֵ
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;
}
// <09><><EFBFBD>뵽ͬ<EBB5BD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ
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 ɾ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param pT --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \retval true -- <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \retval false -- ʧ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \note
* <EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD>false<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֱ<EFBFBD>֤ԭ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα\n
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>\n
* pfnIndexOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĴӼ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣֵ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n
* pfnKeyOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD>ֵ. \n
* pfnCompare -- <EFBFBD>Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD><EFBFBD>ֵĴ<EFBFBD>С\n
* pfnFreeItem-- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>pfnAlloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>
*/
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 ɾ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param pKey --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ
*
* \retval true -- <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \retval false -- ʧ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \note
* <EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD>false<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֱ<EFBFBD>֤ԭ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα\n
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>\n
* pfnIndexOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĴӼ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣֵ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n
* pfnCompare -- <EFBFBD>Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD><EFBFBD>ֵĴ<EFBFBD>С\n
* pfnFreeItem -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>pfnAlloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>
*/
bool deleteItem_with_key(void * pKey)
{
u32 i = 0;
if(NULL == m_pTable || NULL == m_pfnIndexOf || NULL == m_pfnCompare || NULL == m_pfnFreeItem)
return false;
// <09><><EFBFBD><EFBFBD>ϣֵ
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 <EFBFBD>ӹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param pT --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -- <EFBFBD>ɹ<EFBFBD>
* \retval NULL -- ʧ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \note
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>гɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>.\n
* <EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD>NULL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֱ<EFBFBD>֤ԭ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα\n
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>\n
* pfnIndexOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĴӼ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣֵ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n
* pfnKeyOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD>ֵ. \n
* pfnCompare -- <EFBFBD>Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD><EFBFBD>ֵĴ<EFBFBD>С\n
*/
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 <EFBFBD>ӹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param pKey --[in] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֵ
*
* \retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -- <EFBFBD>ɹ<EFBFBD>
* \retval NULL -- ʧ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \note
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>гɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>.\n
* <EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD>NULL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֱ<EFBFBD>֤ԭ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα\n
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>\n
* pfnIndexOf -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĴӼ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣֵ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n
* pfnCompare -- <EFBFBD>Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺؼ<EFBFBD><EFBFBD>ֵĴ<EFBFBD>С\n
*/
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 <EFBFBD>ͷŹ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \note
* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>\n
* pfnFreeItem -- ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>pfnAlloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>
*/
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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
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;
}
}
};
// <20><>pc<70><63>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>ʽϵͳ
#ifdef PC_MACHINE
#ifdef OS_WINDOWS
#pragma pack (pop)
#else// OS_UNIX
#pragma pack (0)
#endif //OS_UNIX
#endif
#endif //__CHAIN_HASH_H__ASDFJQWPEUTOUDSAFHJDSAFADSAFWQERUGSKGEWRTPYZNXM