20 while ( a_iSize != 0 )
22 uiHash = ( uiHash * 0x10 ) + *pBuffer++;
23 if ( ( uiHash & 0xF0000000 ) != 0 )
25 uiHash = uiHash ^ ( uiHash & 0xF0000000 ) >> 24 ^ ( uiHash & 0xF0000000 );
30 return uiHash - ( uiHash / a_uiMaxValue ) * a_uiMaxValue;
38 m_iItemCountTotal = 0;
40 m_iHashNodeCountTotal = 0;
41 m_pHashToBucketId =
TNULL;
44 m_ItemHashFunc =
TNULL;
45 m_ItemCompareFunc =
TNULL;
55 delete[] m_pHashToBucketId;
56 m_pHashToBucketId =
TNULL;
78 return ( pFoundBucket ) ? pFoundBucket :
Append( a_pData );
86 if ( pBuckets !=
TNULL )
88 TUINT32 uiHash = m_ItemHashFunc( a_pData, m_iItemSize, m_iBucketSize );
89 TINT iBucket = pBuckets[ uiHash ];
93 Bucket& item = m_pBuckets[ iBucket ];
95 if ( m_ItemCompareFunc( a_pData, m_pItems + m_iItemSize * item.
iItemIndex, m_iItemSize ) )
109 if ( m_pHashToBucketId !=
TNULL )
111 TASSERT( !( ( m_iHashNodeCount == m_iHashNodeCountTotal ) || ( m_iItemCount == m_iItemCountTotal ) ) );
113 if ( !( ( m_iHashNodeCount == m_iHashNodeCountTotal ) || ( m_iItemCount == m_iItemCountTotal ) ) )
115 TUINT32 uiHash = m_ItemHashFunc( a_pData, m_iItemSize, m_iBucketSize );
117 m_pBuckets[ m_iHashNodeCountTotal ].iNextBucketId = m_pHashToBucketId[ uiHash ];
118 m_pBuckets[ m_iHashNodeCountTotal ].iItemIndex = m_iItemCount;
120 TUtil::MemCopy( m_pItems + m_iItemCount * m_iItemSize, a_pData, m_iItemSize );
122 m_pHashToBucketId[ uiHash ] = m_iHashNodeCountTotal;
125 m_iHashNodeCountTotal++;
127 return &m_pBuckets[ m_iHashNodeCountTotal ];
136 if ( m_pHashToBucketId ==
TNULL )
138 if ( a_iHashNodeCount < a_iItemCountTotal )
140 a_iHashNodeCount = a_iItemCountTotal;
143 m_iBucketSize = a_iBucketSize;
144 m_iItemSize = a_iItemSize;
146 m_iItemCountTotal = a_iItemCountTotal;
147 m_iHashNodeCount = a_iHashNodeCount;
148 m_pHashToBucketId =
new TINT[ m_iBucketSize ];
149 m_pBuckets =
new Bucket[ m_iHashNodeCount ];
155 for (
TINT i = 0; i < m_iBucketSize; i++ )
void * TMemalign(TSIZE a_uiAlignment, TSIZE a_uiSize, Toshi::TMemory::MemBlock *a_pMemBlock)
Allocates aligned memory from a specific memory block.
void TFree(void *a_pMem)
Frees previously allocated memory.
#define TSTATICCAST(POINTERTYPE, VALUE)
#define TREINTERPRETCAST(TYPE, VALUE)
#define TOSHI_NAMESPACE_START
#define TOSHI_NAMESPACE_END
void SetItemHashFunction(t_ItemHashFunc a_HashCompareFunc)
Bucket * Find(void *a_pData)
TUINT32(*)(const void *a_pMem, TSIZE a_iSize, TUINT32 a_uiMaxValue) t_ItemHashFunc
void DeleteBucketMemory()
Bucket * Insert(void *a_pData)
TBOOL(*)(const void *a_pMem1, const void *a_pMem2, TSIZE a_iSize) t_ItemCompareFunc
Bucket * Append(void *a_pData)
void SetItemCompareFunction(t_ItemCompareFunc a_HashCompareFunc)
TINT * GetHashToBucketIds() const
static constexpr TINT INVALID_BUCKET_ID
TBOOL Create(TINT a_iItemCountTotal, TINT a_iItemSize, TINT a_iBucketSize, TINT a_iHashNodeCount)
static void * MemCopy(void *dst, const void *src, TSIZE size)
static TINT MemCompare(const void *ptr1, const void *ptr2, TSIZE size)