Index: core/src/fxcrt/fx_basic_maps.cpp |
diff --git a/core/src/fxcrt/fx_basic_maps.cpp b/core/src/fxcrt/fx_basic_maps.cpp |
index 1558ae6f75bd3f085afe6fb9918570ebda7d0428..6bcb91546a929dace8f21897994fb91f24b55169 100644 |
--- a/core/src/fxcrt/fx_basic_maps.cpp |
+++ b/core/src/fxcrt/fx_basic_maps.cpp |
@@ -7,12 +7,6 @@ |
#include "../../include/fxcrt/fx_basic.h" |
#include "plex.h" |
-static void ConstructElement(CFX_ByteString* pNewData) { |
- new (pNewData) CFX_ByteString(); |
-} |
-static void DestructElement(CFX_ByteString* pOldData) { |
- pOldData->~CFX_ByteString(); |
-} |
CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize) |
: m_pHashTable(NULL), |
m_nHashTableSize(17), |
@@ -165,192 +159,6 @@ void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc) { |
RemoveAll(); |
} |
} |
-CFX_MapByteStringToPtr::CFX_MapByteStringToPtr(int nBlockSize) |
- : m_pHashTable(NULL), |
- m_nHashTableSize(17), |
- m_nCount(0), |
- m_pFreeList(NULL), |
- m_pBlocks(NULL), |
- m_nBlockSize(nBlockSize) { |
- ASSERT(m_nBlockSize > 0); |
-} |
-void CFX_MapByteStringToPtr::RemoveAll() { |
- if (m_pHashTable != NULL) { |
- for (FX_DWORD nHash = 0; nHash < m_nHashTableSize; nHash++) { |
- CAssoc* pAssoc; |
- for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; |
- pAssoc = pAssoc->pNext) { |
- DestructElement(&pAssoc->key); |
- } |
- } |
- FX_Free(m_pHashTable); |
- m_pHashTable = NULL; |
- } |
- m_nCount = 0; |
- m_pFreeList = NULL; |
- m_pBlocks->FreeDataChain(); |
- m_pBlocks = NULL; |
-} |
-CFX_MapByteStringToPtr::~CFX_MapByteStringToPtr() { |
- RemoveAll(); |
- ASSERT(m_nCount == 0); |
-} |
-void CFX_MapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition, |
- CFX_ByteString& rKey, |
- void*& rValue) const { |
- ASSERT(m_pHashTable != NULL); |
- CAssoc* pAssocRet = (CAssoc*)rNextPosition; |
- ASSERT(pAssocRet != NULL); |
- if (pAssocRet == (CAssoc*)-1) { |
- for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++) |
- if ((pAssocRet = m_pHashTable[nBucket]) != NULL) { |
- break; |
- } |
- ASSERT(pAssocRet != NULL); |
- } |
- CAssoc* pAssocNext; |
- if ((pAssocNext = pAssocRet->pNext) == NULL) { |
- for (FX_DWORD nBucket = pAssocRet->nHashValue + 1; |
- nBucket < m_nHashTableSize; nBucket++) |
- if ((pAssocNext = m_pHashTable[nBucket]) != NULL) { |
- break; |
- } |
- } |
- rNextPosition = (FX_POSITION)pAssocNext; |
- rKey = pAssocRet->key; |
- rValue = pAssocRet->value; |
-} |
-void* CFX_MapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const { |
- ASSERT(m_pHashTable != NULL); |
- CAssoc* pAssocRet = (CAssoc*)rNextPosition; |
- ASSERT(pAssocRet != NULL); |
- if (pAssocRet == (CAssoc*)-1) { |
- for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++) |
- if ((pAssocRet = m_pHashTable[nBucket]) != NULL) { |
- break; |
- } |
- ASSERT(pAssocRet != NULL); |
- } |
- CAssoc* pAssocNext; |
- if ((pAssocNext = pAssocRet->pNext) == NULL) { |
- for (FX_DWORD nBucket = pAssocRet->nHashValue + 1; |
- nBucket < m_nHashTableSize; nBucket++) |
- if ((pAssocNext = m_pHashTable[nBucket]) != NULL) { |
- break; |
- } |
- } |
- rNextPosition = (FX_POSITION)pAssocNext; |
- return pAssocRet->value; |
-} |
-void*& CFX_MapByteStringToPtr::operator[](const CFX_ByteStringC& key) { |
- FX_DWORD nHash; |
- CAssoc* pAssoc; |
- if ((pAssoc = GetAssocAt(key, nHash)) == NULL) { |
- if (m_pHashTable == NULL) { |
- InitHashTable(m_nHashTableSize); |
- } |
- pAssoc = NewAssoc(); |
- pAssoc->nHashValue = nHash; |
- pAssoc->key = key; |
- pAssoc->pNext = m_pHashTable[nHash]; |
- m_pHashTable[nHash] = pAssoc; |
- } |
- return pAssoc->value; |
-} |
-CFX_MapByteStringToPtr::CAssoc* CFX_MapByteStringToPtr::NewAssoc() { |
- if (m_pFreeList == NULL) { |
- CFX_Plex* newBlock = CFX_Plex::Create( |
- m_pBlocks, m_nBlockSize, sizeof(CFX_MapByteStringToPtr::CAssoc)); |
- CFX_MapByteStringToPtr::CAssoc* pAssoc = |
- (CFX_MapByteStringToPtr::CAssoc*)newBlock->data(); |
- pAssoc += m_nBlockSize - 1; |
- for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) { |
- pAssoc->pNext = m_pFreeList; |
- m_pFreeList = pAssoc; |
- } |
- } |
- ASSERT(m_pFreeList != NULL); |
- CFX_MapByteStringToPtr::CAssoc* pAssoc = m_pFreeList; |
- m_pFreeList = m_pFreeList->pNext; |
- m_nCount++; |
- ASSERT(m_nCount > 0); |
- ConstructElement(&pAssoc->key); |
- pAssoc->value = 0; |
- return pAssoc; |
-} |
-void CFX_MapByteStringToPtr::FreeAssoc(CFX_MapByteStringToPtr::CAssoc* pAssoc) { |
- DestructElement(&pAssoc->key); |
- pAssoc->pNext = m_pFreeList; |
- m_pFreeList = pAssoc; |
- m_nCount--; |
- ASSERT(m_nCount >= 0); |
- if (m_nCount == 0) { |
- RemoveAll(); |
- } |
-} |
-CFX_MapByteStringToPtr::CAssoc* CFX_MapByteStringToPtr::GetAssocAt( |
- const CFX_ByteStringC& key, |
- FX_DWORD& nHash) const { |
- nHash = HashKey(key) % m_nHashTableSize; |
- if (m_pHashTable == NULL) { |
- return NULL; |
- } |
- CAssoc* pAssoc; |
- for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) { |
- if (pAssoc->key == key) { |
- return pAssoc; |
- } |
- } |
- return NULL; |
-} |
-FX_BOOL CFX_MapByteStringToPtr::Lookup(const CFX_ByteStringC& key, |
- void*& rValue) const { |
- FX_DWORD nHash; |
- CAssoc* pAssoc = GetAssocAt(key, nHash); |
- if (pAssoc == NULL) { |
- return FALSE; |
- } |
- rValue = pAssoc->value; |
- return TRUE; |
-} |
-void CFX_MapByteStringToPtr::InitHashTable(FX_DWORD nHashSize, |
- FX_BOOL bAllocNow) { |
- ASSERT(m_nCount == 0); |
- ASSERT(nHashSize > 0); |
- FX_Free(m_pHashTable); |
- m_pHashTable = NULL; |
- if (bAllocNow) { |
- m_pHashTable = FX_Alloc(CAssoc*, nHashSize); |
- } |
- m_nHashTableSize = nHashSize; |
-} |
-inline FX_DWORD CFX_MapByteStringToPtr::HashKey( |
- const CFX_ByteStringC& key) const { |
- FX_DWORD nHash = 0; |
- int len = key.GetLength(); |
- const uint8_t* buf = key.GetPtr(); |
- for (int i = 0; i < len; i++) { |
- nHash = (nHash << 5) + nHash + buf[i]; |
- } |
- return nHash; |
-} |
-FX_BOOL CFX_MapByteStringToPtr::RemoveKey(const CFX_ByteStringC& key) { |
- if (m_pHashTable == NULL) { |
- return FALSE; |
- } |
- CAssoc** ppAssocPrev; |
- ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize]; |
- CAssoc* pAssoc; |
- for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) { |
- if (pAssoc->key == key) { |
- *ppAssocPrev = pAssoc->pNext; |
- FreeAssoc(pAssoc); |
- return TRUE; |
- } |
- ppAssocPrev = &pAssoc->pNext; |
- } |
- return FALSE; |
-} |
struct _CompactString { |
uint8_t m_CompactLen; |
uint8_t m_LenHigh; |