|
|
|
|
/******************************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ϣģ<EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* Ŀ<EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD>ṩһ<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>, Ϊ<EFBFBD>ճ<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṩһ<EFBFBD><EFBFBD>ģ<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
|