| 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 e34acb088d15293e5efe67f7c5d4ede7335fe13c..14a681b832c28c032f6175d9165ecc841b929631 100644
|
| --- a/core/src/fxcrt/fx_basic_maps.cpp
|
| +++ b/core/src/fxcrt/fx_basic_maps.cpp
|
| @@ -7,636 +7,610 @@
|
| #include "../../include/fxcrt/fx_basic.h"
|
| #include "plex.h"
|
|
|
| -static void ConstructElement(CFX_ByteString* pNewData)
|
| -{
|
| - new (pNewData) CFX_ByteString();
|
| +static void ConstructElement(CFX_ByteString* pNewData) {
|
| + new (pNewData) CFX_ByteString();
|
| }
|
| -static void DestructElement(CFX_ByteString* pOldData)
|
| -{
|
| - pOldData->~CFX_ByteString();
|
| +static void DestructElement(CFX_ByteString* pOldData) {
|
| + pOldData->~CFX_ByteString();
|
| }
|
| CFX_MapPtrToPtr::CFX_MapPtrToPtr(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_MapPtrToPtr::RemoveAll()
|
| -{
|
| - if (m_pHashTable) {
|
| - FX_Free(m_pHashTable);
|
| - m_pHashTable = NULL;
|
| - }
|
| - m_nCount = 0;
|
| - m_pFreeList = NULL;
|
| - m_pBlocks->FreeDataChain();
|
| - m_pBlocks = NULL;
|
| -}
|
| -CFX_MapPtrToPtr::~CFX_MapPtrToPtr()
|
| -{
|
| - RemoveAll();
|
| - ASSERT(m_nCount == 0);
|
| -}
|
| -FX_DWORD CFX_MapPtrToPtr::HashKey(void* key) const
|
| -{
|
| - return ((FX_DWORD)(uintptr_t)key) >> 4;
|
| -}
|
| -void CFX_MapPtrToPtr::GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const
|
| -{
|
| - ASSERT(m_pHashTable != NULL);
|
| - CAssoc* pAssocRet = (CAssoc*)rNextPosition;
|
| + : m_pHashTable(NULL),
|
| + m_nHashTableSize(17),
|
| + m_nCount(0),
|
| + m_pFreeList(NULL),
|
| + m_pBlocks(NULL),
|
| + m_nBlockSize(nBlockSize) {
|
| + ASSERT(m_nBlockSize > 0);
|
| +}
|
| +void CFX_MapPtrToPtr::RemoveAll() {
|
| + if (m_pHashTable) {
|
| + FX_Free(m_pHashTable);
|
| + m_pHashTable = NULL;
|
| + }
|
| + m_nCount = 0;
|
| + m_pFreeList = NULL;
|
| + m_pBlocks->FreeDataChain();
|
| + m_pBlocks = NULL;
|
| +}
|
| +CFX_MapPtrToPtr::~CFX_MapPtrToPtr() {
|
| + RemoveAll();
|
| + ASSERT(m_nCount == 0);
|
| +}
|
| +FX_DWORD CFX_MapPtrToPtr::HashKey(void* key) const {
|
| + return ((FX_DWORD)(uintptr_t)key) >> 4;
|
| +}
|
| +void CFX_MapPtrToPtr::GetNextAssoc(FX_POSITION& rNextPosition,
|
| + void*& 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);
|
| - 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 = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1; nBucket < m_nHashTableSize; nBucket ++) {
|
| - if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - rNextPosition = (FX_POSITION) pAssocNext;
|
| - rKey = pAssocRet->key;
|
| - rValue = pAssocRet->value;
|
| -}
|
| -FX_BOOL CFX_MapPtrToPtr::Lookup(void* key, void*& rValue) const
|
| -{
|
| - FX_DWORD nHash;
|
| - CAssoc* pAssoc = GetAssocAt(key, nHash);
|
| - if (pAssoc == NULL) {
|
| - return FALSE;
|
| - }
|
| - rValue = pAssoc->value;
|
| - return TRUE;
|
| -}
|
| -void* CFX_MapPtrToPtr::GetValueAt(void* key) const
|
| -{
|
| - FX_DWORD nHash;
|
| - CAssoc* pAssoc = GetAssocAt(key, nHash);
|
| - if (pAssoc == NULL) {
|
| - return NULL;
|
| - }
|
| - return pAssoc->value;
|
| -}
|
| -void*& CFX_MapPtrToPtr::operator[](void* key)
|
| -{
|
| - FX_DWORD nHash;
|
| - CAssoc* pAssoc;
|
| - if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {
|
| - if (m_pHashTable == NULL) {
|
| - InitHashTable(m_nHashTableSize);
|
| - }
|
| - pAssoc = NewAssoc();
|
| - pAssoc->key = key;
|
| - pAssoc->pNext = m_pHashTable[nHash];
|
| - m_pHashTable[nHash] = pAssoc;
|
| - }
|
| - return pAssoc->value;
|
| -}
|
| -CFX_MapPtrToPtr::CAssoc*
|
| -CFX_MapPtrToPtr::GetAssocAt(void* 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;
|
| - }
|
| - }
|
| + }
|
| + CAssoc* pAssocNext;
|
| + if ((pAssocNext = pAssocRet->pNext) == NULL) {
|
| + for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1;
|
| + nBucket < m_nHashTableSize; nBucket++) {
|
| + if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + rNextPosition = (FX_POSITION)pAssocNext;
|
| + rKey = pAssocRet->key;
|
| + rValue = pAssocRet->value;
|
| +}
|
| +FX_BOOL CFX_MapPtrToPtr::Lookup(void* key, void*& rValue) const {
|
| + FX_DWORD nHash;
|
| + CAssoc* pAssoc = GetAssocAt(key, nHash);
|
| + if (pAssoc == NULL) {
|
| + return FALSE;
|
| + }
|
| + rValue = pAssoc->value;
|
| + return TRUE;
|
| +}
|
| +void* CFX_MapPtrToPtr::GetValueAt(void* key) const {
|
| + FX_DWORD nHash;
|
| + CAssoc* pAssoc = GetAssocAt(key, nHash);
|
| + if (pAssoc == NULL) {
|
| return NULL;
|
| + }
|
| + return pAssoc->value;
|
| }
|
| -CFX_MapPtrToPtr::CAssoc*
|
| -CFX_MapPtrToPtr::NewAssoc()
|
| -{
|
| - if (m_pFreeList == NULL) {
|
| - CFX_Plex* newBlock = CFX_Plex::Create(m_pBlocks, m_nBlockSize, sizeof(CFX_MapPtrToPtr::CAssoc));
|
| - CFX_MapPtrToPtr::CAssoc* pAssoc = (CFX_MapPtrToPtr::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_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList;
|
| - m_pFreeList = m_pFreeList->pNext;
|
| - m_nCount++;
|
| - ASSERT(m_nCount > 0);
|
| - pAssoc->key = 0;
|
| - pAssoc->value = 0;
|
| - return pAssoc;
|
| -}
|
| -void CFX_MapPtrToPtr::InitHashTable(
|
| - FX_DWORD nHashSize, FX_BOOL bAllocNow)
|
| -{
|
| - ASSERT(m_nCount == 0);
|
| - ASSERT(nHashSize > 0);
|
| - if (m_pHashTable != NULL) {
|
| - FX_Free(m_pHashTable);
|
| - m_pHashTable = NULL;
|
| - }
|
| - if (bAllocNow) {
|
| - m_pHashTable = FX_Alloc(CAssoc*, nHashSize);
|
| - }
|
| - m_nHashTableSize = nHashSize;
|
| -}
|
| -FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key)
|
| -{
|
| +void*& CFX_MapPtrToPtr::operator[](void* key) {
|
| + FX_DWORD nHash;
|
| + CAssoc* pAssoc;
|
| + if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {
|
| 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;
|
| - }
|
| + InitHashTable(m_nHashTableSize);
|
| + }
|
| + pAssoc = NewAssoc();
|
| + pAssoc->key = key;
|
| + pAssoc->pNext = m_pHashTable[nHash];
|
| + m_pHashTable[nHash] = pAssoc;
|
| + }
|
| + return pAssoc->value;
|
| +}
|
| +CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::GetAssocAt(void* 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;
|
| +}
|
| +CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::NewAssoc() {
|
| + if (m_pFreeList == NULL) {
|
| + CFX_Plex* newBlock = CFX_Plex::Create(m_pBlocks, m_nBlockSize,
|
| + sizeof(CFX_MapPtrToPtr::CAssoc));
|
| + CFX_MapPtrToPtr::CAssoc* pAssoc =
|
| + (CFX_MapPtrToPtr::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_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList;
|
| + m_pFreeList = m_pFreeList->pNext;
|
| + m_nCount++;
|
| + ASSERT(m_nCount > 0);
|
| + pAssoc->key = 0;
|
| + pAssoc->value = 0;
|
| + return pAssoc;
|
| +}
|
| +void CFX_MapPtrToPtr::InitHashTable(FX_DWORD nHashSize, FX_BOOL bAllocNow) {
|
| + ASSERT(m_nCount == 0);
|
| + ASSERT(nHashSize > 0);
|
| + if (m_pHashTable != NULL) {
|
| + FX_Free(m_pHashTable);
|
| + m_pHashTable = NULL;
|
| + }
|
| + if (bAllocNow) {
|
| + m_pHashTable = FX_Alloc(CAssoc*, nHashSize);
|
| + }
|
| + m_nHashTableSize = nHashSize;
|
| +}
|
| +FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key) {
|
| + if (m_pHashTable == NULL) {
|
| return FALSE;
|
| -}
|
| -void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc)
|
| -{
|
| - pAssoc->pNext = m_pFreeList;
|
| - m_pFreeList = pAssoc;
|
| - m_nCount--;
|
| - ASSERT(m_nCount >= 0);
|
| - if (m_nCount == 0) {
|
| - RemoveAll();
|
| - }
|
| + }
|
| + 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;
|
| +}
|
| +void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc) {
|
| + pAssoc->pNext = m_pFreeList;
|
| + m_pFreeList = pAssoc;
|
| + m_nCount--;
|
| + ASSERT(m_nCount >= 0);
|
| + if (m_nCount == 0) {
|
| + 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);
|
| + : 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;
|
| + 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);
|
| - 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;
|
| + }
|
| + 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);
|
| - 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;
|
| + }
|
| + 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) {
|
| - 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);
|
| - if (m_pHashTable != NULL) {
|
| - 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;
|
| + 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();
|
| + }
|
| }
|
| -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;
|
| - }
|
| +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);
|
| + if (m_pHashTable != NULL) {
|
| + 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;
|
| - uint8_t m_LenLow;
|
| - uint8_t m_Unused;
|
| - uint8_t* m_pBuffer;
|
| + uint8_t m_CompactLen;
|
| + uint8_t m_LenHigh;
|
| + uint8_t m_LenLow;
|
| + uint8_t m_Unused;
|
| + uint8_t* m_pBuffer;
|
| };
|
| -static void _CompactStringRelease(_CompactString* pCompact)
|
| -{
|
| - if (pCompact->m_CompactLen == 0xff) {
|
| - FX_Free(pCompact->m_pBuffer);
|
| - }
|
| -}
|
| -static FX_BOOL _CompactStringSame(_CompactString* pCompact, const uint8_t* pStr, int len)
|
| -{
|
| - if (len < sizeof(_CompactString)) {
|
| - if (pCompact->m_CompactLen != len) {
|
| - return FALSE;
|
| - }
|
| - return FXSYS_memcmp(&pCompact->m_LenHigh, pStr, len) == 0;
|
| - }
|
| - if (pCompact->m_CompactLen != 0xff || pCompact->m_LenHigh * 256 + pCompact->m_LenLow != len) {
|
| - return FALSE;
|
| - }
|
| - return FXSYS_memcmp(pCompact->m_pBuffer, pStr, len) == 0;
|
| -}
|
| -static void _CompactStringStore(_CompactString* pCompact, const uint8_t* pStr, int len)
|
| -{
|
| - if (len < (int)sizeof(_CompactString)) {
|
| - pCompact->m_CompactLen = (uint8_t)len;
|
| - FXSYS_memcpy(&pCompact->m_LenHigh, pStr, len);
|
| - return;
|
| - }
|
| - pCompact->m_CompactLen = 0xff;
|
| - pCompact->m_LenHigh = len / 256;
|
| - pCompact->m_LenLow = len % 256;
|
| - pCompact->m_pBuffer = FX_Alloc(uint8_t, len);
|
| - FXSYS_memcpy(pCompact->m_pBuffer, pStr, len);
|
| -}
|
| -static CFX_ByteStringC _CompactStringGet(_CompactString* pCompact)
|
| -{
|
| - if (pCompact->m_CompactLen == 0xff) {
|
| - return CFX_ByteStringC(pCompact->m_pBuffer, pCompact->m_LenHigh * 256 + pCompact->m_LenLow);
|
| - }
|
| - if (pCompact->m_CompactLen == 0xfe) {
|
| - return CFX_ByteStringC();
|
| - }
|
| - return CFX_ByteStringC(&pCompact->m_LenHigh, pCompact->m_CompactLen);
|
| -}
|
| -#define CMAP_ALLOC_STEP 8
|
| -#define CMAP_INDEX_SIZE 8
|
| +static void _CompactStringRelease(_CompactString* pCompact) {
|
| + if (pCompact->m_CompactLen == 0xff) {
|
| + FX_Free(pCompact->m_pBuffer);
|
| + }
|
| +}
|
| +static FX_BOOL _CompactStringSame(_CompactString* pCompact,
|
| + const uint8_t* pStr,
|
| + int len) {
|
| + if (len < sizeof(_CompactString)) {
|
| + if (pCompact->m_CompactLen != len) {
|
| + return FALSE;
|
| + }
|
| + return FXSYS_memcmp(&pCompact->m_LenHigh, pStr, len) == 0;
|
| + }
|
| + if (pCompact->m_CompactLen != 0xff ||
|
| + pCompact->m_LenHigh * 256 + pCompact->m_LenLow != len) {
|
| + return FALSE;
|
| + }
|
| + return FXSYS_memcmp(pCompact->m_pBuffer, pStr, len) == 0;
|
| +}
|
| +static void _CompactStringStore(_CompactString* pCompact,
|
| + const uint8_t* pStr,
|
| + int len) {
|
| + if (len < (int)sizeof(_CompactString)) {
|
| + pCompact->m_CompactLen = (uint8_t)len;
|
| + FXSYS_memcpy(&pCompact->m_LenHigh, pStr, len);
|
| + return;
|
| + }
|
| + pCompact->m_CompactLen = 0xff;
|
| + pCompact->m_LenHigh = len / 256;
|
| + pCompact->m_LenLow = len % 256;
|
| + pCompact->m_pBuffer = FX_Alloc(uint8_t, len);
|
| + FXSYS_memcpy(pCompact->m_pBuffer, pStr, len);
|
| +}
|
| +static CFX_ByteStringC _CompactStringGet(_CompactString* pCompact) {
|
| + if (pCompact->m_CompactLen == 0xff) {
|
| + return CFX_ByteStringC(pCompact->m_pBuffer,
|
| + pCompact->m_LenHigh * 256 + pCompact->m_LenLow);
|
| + }
|
| + if (pCompact->m_CompactLen == 0xfe) {
|
| + return CFX_ByteStringC();
|
| + }
|
| + return CFX_ByteStringC(&pCompact->m_LenHigh, pCompact->m_CompactLen);
|
| +}
|
| +#define CMAP_ALLOC_STEP 8
|
| +#define CMAP_INDEX_SIZE 8
|
| CFX_CMapByteStringToPtr::CFX_CMapByteStringToPtr()
|
| - : m_Buffer(sizeof(_CompactString) + sizeof(void*), CMAP_ALLOC_STEP, CMAP_INDEX_SIZE)
|
| -{
|
| -}
|
| -CFX_CMapByteStringToPtr::~CFX_CMapByteStringToPtr()
|
| -{
|
| - RemoveAll();
|
| -}
|
| -void CFX_CMapByteStringToPtr::RemoveAll()
|
| -{
|
| - int size = m_Buffer.GetSize();
|
| - for (int i = 0; i < size; i++) {
|
| - _CompactStringRelease((_CompactString*)m_Buffer.GetAt(i));
|
| - }
|
| - m_Buffer.RemoveAll();
|
| -}
|
| -FX_POSITION CFX_CMapByteStringToPtr::GetStartPosition() const
|
| -{
|
| - int size = m_Buffer.GetSize();
|
| - for (int i = 0; i < size; i ++) {
|
| - _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
|
| - if (pKey->m_CompactLen != 0xfe) {
|
| - return (FX_POSITION)(uintptr_t)(i + 1);
|
| - }
|
| - }
|
| + : m_Buffer(sizeof(_CompactString) + sizeof(void*),
|
| + CMAP_ALLOC_STEP,
|
| + CMAP_INDEX_SIZE) {}
|
| +CFX_CMapByteStringToPtr::~CFX_CMapByteStringToPtr() {
|
| + RemoveAll();
|
| +}
|
| +void CFX_CMapByteStringToPtr::RemoveAll() {
|
| + int size = m_Buffer.GetSize();
|
| + for (int i = 0; i < size; i++) {
|
| + _CompactStringRelease((_CompactString*)m_Buffer.GetAt(i));
|
| + }
|
| + m_Buffer.RemoveAll();
|
| +}
|
| +FX_POSITION CFX_CMapByteStringToPtr::GetStartPosition() const {
|
| + int size = m_Buffer.GetSize();
|
| + for (int i = 0; i < size; i++) {
|
| + _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
|
| + if (pKey->m_CompactLen != 0xfe) {
|
| + return (FX_POSITION)(uintptr_t)(i + 1);
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +void CFX_CMapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition,
|
| + CFX_ByteString& rKey,
|
| + void*& rValue) const {
|
| + if (rNextPosition == NULL) {
|
| + return;
|
| + }
|
| + int index = (int)(uintptr_t)rNextPosition - 1;
|
| + _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| + rKey = _CompactStringGet(pKey);
|
| + rValue = *(void**)(pKey + 1);
|
| + index++;
|
| + int size = m_Buffer.GetSize();
|
| + while (index < size) {
|
| + pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| + if (pKey->m_CompactLen != 0xfe) {
|
| + rNextPosition = (FX_POSITION)(uintptr_t)(index + 1);
|
| + return;
|
| + }
|
| + index++;
|
| + }
|
| + rNextPosition = NULL;
|
| +}
|
| +void* CFX_CMapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const {
|
| + if (rNextPosition == NULL) {
|
| return NULL;
|
| -}
|
| -void CFX_CMapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const
|
| -{
|
| - if (rNextPosition == NULL) {
|
| - return;
|
| - }
|
| - int index = (int)(uintptr_t)rNextPosition - 1;
|
| + }
|
| + int index = (int)(uintptr_t)rNextPosition - 1;
|
| + _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| + void* rValue = *(void**)(pKey + 1);
|
| + index++;
|
| + int size = m_Buffer.GetSize();
|
| + while (index < size) {
|
| + pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| + if (pKey->m_CompactLen != 0xfe) {
|
| + rNextPosition = (FX_POSITION)(uintptr_t)(index + 1);
|
| + return rValue;
|
| + }
|
| + index++;
|
| + }
|
| + rNextPosition = NULL;
|
| + return rValue;
|
| +}
|
| +FX_BOOL _CMapLookupCallback(void* param, void* pData) {
|
| + return !_CompactStringSame((_CompactString*)pData,
|
| + ((CFX_ByteStringC*)param)->GetPtr(),
|
| + ((CFX_ByteStringC*)param)->GetLength());
|
| +}
|
| +FX_BOOL CFX_CMapByteStringToPtr::Lookup(const CFX_ByteStringC& key,
|
| + void*& rValue) const {
|
| + void* p = m_Buffer.Iterate(_CMapLookupCallback, (void*)&key);
|
| + if (!p) {
|
| + return FALSE;
|
| + }
|
| + rValue = *(void**)((_CompactString*)p + 1);
|
| + return TRUE;
|
| +}
|
| +void CFX_CMapByteStringToPtr::SetAt(const CFX_ByteStringC& key, void* value) {
|
| + ASSERT(value != NULL);
|
| + int index, key_len = key.GetLength();
|
| + int size = m_Buffer.GetSize();
|
| + for (index = 0; index < size; index++) {
|
| _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| - rKey = _CompactStringGet(pKey);
|
| - rValue = *(void**)(pKey + 1);
|
| - index ++;
|
| - int size = m_Buffer.GetSize();
|
| - while (index < size) {
|
| - pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| - if (pKey->m_CompactLen != 0xfe) {
|
| - rNextPosition = (FX_POSITION)(uintptr_t)(index + 1);
|
| - return;
|
| - }
|
| - index ++;
|
| - }
|
| - rNextPosition = NULL;
|
| -}
|
| -void* CFX_CMapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const
|
| -{
|
| - if (rNextPosition == NULL) {
|
| - return NULL;
|
| + if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) {
|
| + continue;
|
| }
|
| - int index = (int)(uintptr_t)rNextPosition - 1;
|
| + *(void**)(pKey + 1) = value;
|
| + return;
|
| + }
|
| + for (index = 0; index < size; index++) {
|
| _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| - void* rValue = *(void**)(pKey + 1);
|
| - index ++;
|
| - int size = m_Buffer.GetSize();
|
| - while (index < size) {
|
| - pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| - if (pKey->m_CompactLen != 0xfe) {
|
| - rNextPosition = (FX_POSITION)(uintptr_t)(index + 1);
|
| - return rValue;
|
| - }
|
| - index ++;
|
| - }
|
| - rNextPosition = NULL;
|
| - return rValue;
|
| -}
|
| -FX_BOOL _CMapLookupCallback(void* param, void* pData)
|
| -{
|
| - return !_CompactStringSame((_CompactString*)pData, ((CFX_ByteStringC*)param)->GetPtr(), ((CFX_ByteStringC*)param)->GetLength());
|
| -}
|
| -FX_BOOL CFX_CMapByteStringToPtr::Lookup(const CFX_ByteStringC& key, void*& rValue) const
|
| -{
|
| - void* p = m_Buffer.Iterate(_CMapLookupCallback, (void*)&key);
|
| - if (!p) {
|
| - return FALSE;
|
| - }
|
| - rValue = *(void**)((_CompactString*)p + 1);
|
| - return TRUE;
|
| -}
|
| -void CFX_CMapByteStringToPtr::SetAt(const CFX_ByteStringC& key, void* value)
|
| -{
|
| - ASSERT(value != NULL);
|
| - int index, key_len = key.GetLength();
|
| - int size = m_Buffer.GetSize();
|
| - for (index = 0; index < size; index ++) {
|
| - _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| - if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) {
|
| - continue;
|
| - }
|
| - *(void**)(pKey + 1) = value;
|
| - return;
|
| + if (pKey->m_CompactLen) {
|
| + continue;
|
| }
|
| - for (index = 0; index < size; index ++) {
|
| - _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| - if (pKey->m_CompactLen) {
|
| - continue;
|
| - }
|
| - _CompactStringStore(pKey, key.GetPtr(), key_len);
|
| - *(void**)(pKey + 1) = value;
|
| - return;
|
| - }
|
| - _CompactString* pKey = (_CompactString*)m_Buffer.Add();
|
| _CompactStringStore(pKey, key.GetPtr(), key_len);
|
| *(void**)(pKey + 1) = value;
|
| -}
|
| -void CFX_CMapByteStringToPtr::AddValue(const CFX_ByteStringC& key, void* value)
|
| -{
|
| - ASSERT(value != NULL);
|
| - _CompactString* pKey = (_CompactString*)m_Buffer.Add();
|
| - _CompactStringStore(pKey, key.GetPtr(), key.GetLength());
|
| - *(void**)(pKey + 1) = value;
|
| -}
|
| -void CFX_CMapByteStringToPtr::RemoveKey(const CFX_ByteStringC& key)
|
| -{
|
| - int key_len = key.GetLength();
|
| - int size = m_Buffer.GetSize();
|
| - for (int index = 0; index < size; index++) {
|
| - _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| - if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) {
|
| - continue;
|
| - }
|
| - _CompactStringRelease(pKey);
|
| - pKey->m_CompactLen = 0xfe;
|
| - return;
|
| + return;
|
| + }
|
| + _CompactString* pKey = (_CompactString*)m_Buffer.Add();
|
| + _CompactStringStore(pKey, key.GetPtr(), key_len);
|
| + *(void**)(pKey + 1) = value;
|
| +}
|
| +void CFX_CMapByteStringToPtr::AddValue(const CFX_ByteStringC& key,
|
| + void* value) {
|
| + ASSERT(value != NULL);
|
| + _CompactString* pKey = (_CompactString*)m_Buffer.Add();
|
| + _CompactStringStore(pKey, key.GetPtr(), key.GetLength());
|
| + *(void**)(pKey + 1) = value;
|
| +}
|
| +void CFX_CMapByteStringToPtr::RemoveKey(const CFX_ByteStringC& key) {
|
| + int key_len = key.GetLength();
|
| + int size = m_Buffer.GetSize();
|
| + for (int index = 0; index < size; index++) {
|
| + _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
|
| + if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) {
|
| + continue;
|
| }
|
| + _CompactStringRelease(pKey);
|
| + pKey->m_CompactLen = 0xfe;
|
| + return;
|
| + }
|
| }
|
| -int CFX_CMapByteStringToPtr::GetCount() const
|
| -{
|
| - int count = 0;
|
| - int size = m_Buffer.GetSize();
|
| - for (int i = 0; i < size; i ++) {
|
| - _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
|
| - if (pKey->m_CompactLen != 0xfe) {
|
| - count ++;
|
| - }
|
| +int CFX_CMapByteStringToPtr::GetCount() const {
|
| + int count = 0;
|
| + int size = m_Buffer.GetSize();
|
| + for (int i = 0; i < size; i++) {
|
| + _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
|
| + if (pKey->m_CompactLen != 0xfe) {
|
| + count++;
|
| }
|
| - return count;
|
| + }
|
| + return count;
|
| }
|
| extern "C" {
|
| - static int _CompareDWord(const void* p1, const void* p2)
|
| - {
|
| - return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
|
| - }
|
| +static int _CompareDWord(const void* p1, const void* p2) {
|
| + return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
|
| +}
|
| };
|
| struct _DWordPair {
|
| - FX_DWORD key;
|
| - FX_DWORD value;
|
| + FX_DWORD key;
|
| + FX_DWORD value;
|
| };
|
| -FX_BOOL CFX_CMapDWordToDWord::Lookup(FX_DWORD key, FX_DWORD& value) const
|
| -{
|
| - void* pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_DWordPair),
|
| - sizeof(_DWordPair), _CompareDWord);
|
| - if (pResult == NULL) {
|
| - return FALSE;
|
| - }
|
| - value = ((FX_DWORD*)pResult)[1];
|
| - return TRUE;
|
| -}
|
| -FX_POSITION CFX_CMapDWordToDWord::GetStartPosition() const
|
| -{
|
| - FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
|
| - if (count == 0) {
|
| - return NULL;
|
| - }
|
| - return (FX_POSITION)1;
|
| +FX_BOOL CFX_CMapDWordToDWord::Lookup(FX_DWORD key, FX_DWORD& value) const {
|
| + void* pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(),
|
| + m_Buffer.GetSize() / sizeof(_DWordPair),
|
| + sizeof(_DWordPair), _CompareDWord);
|
| + if (pResult == NULL) {
|
| + return FALSE;
|
| + }
|
| + value = ((FX_DWORD*)pResult)[1];
|
| + return TRUE;
|
| }
|
| -void CFX_CMapDWordToDWord::GetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const
|
| -{
|
| - if (pos == 0) {
|
| - return;
|
| - }
|
| - FX_DWORD index = ((FX_DWORD)(uintptr_t)pos) - 1;
|
| - FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
|
| - _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
|
| - key = buf[index].key;
|
| - value = buf[index].value;
|
| - if (index == count - 1) {
|
| - pos = 0;
|
| +FX_POSITION CFX_CMapDWordToDWord::GetStartPosition() const {
|
| + FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
|
| + if (count == 0) {
|
| + return NULL;
|
| + }
|
| + return (FX_POSITION)1;
|
| +}
|
| +void CFX_CMapDWordToDWord::GetNextAssoc(FX_POSITION& pos,
|
| + FX_DWORD& key,
|
| + FX_DWORD& value) const {
|
| + if (pos == 0) {
|
| + return;
|
| + }
|
| + FX_DWORD index = ((FX_DWORD)(uintptr_t)pos) - 1;
|
| + FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
|
| + _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
|
| + key = buf[index].key;
|
| + value = buf[index].value;
|
| + if (index == count - 1) {
|
| + pos = 0;
|
| + } else {
|
| + pos = (FX_POSITION)((uintptr_t)pos + 1);
|
| + }
|
| +}
|
| +void CFX_CMapDWordToDWord::SetAt(FX_DWORD key, FX_DWORD value) {
|
| + FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
|
| + _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
|
| + _DWordPair pair = {key, value};
|
| + if (count == 0 || key > buf[count - 1].key) {
|
| + m_Buffer.AppendBlock(&pair, sizeof(_DWordPair));
|
| + return;
|
| + }
|
| + int low = 0, high = count - 1;
|
| + while (low <= high) {
|
| + int mid = (low + high) / 2;
|
| + if (buf[mid].key < key) {
|
| + low = mid + 1;
|
| + } else if (buf[mid].key > key) {
|
| + high = mid - 1;
|
| } else {
|
| - pos = (FX_POSITION)((uintptr_t)pos + 1);
|
| - }
|
| -}
|
| -void CFX_CMapDWordToDWord::SetAt(FX_DWORD key, FX_DWORD value)
|
| -{
|
| - FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
|
| - _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
|
| - _DWordPair pair = {key, value};
|
| - if (count == 0 || key > buf[count - 1].key) {
|
| - m_Buffer.AppendBlock(&pair, sizeof(_DWordPair));
|
| - return;
|
| - }
|
| - int low = 0, high = count - 1;
|
| - while (low <= high) {
|
| - int mid = (low + high) / 2;
|
| - if (buf[mid].key < key) {
|
| - low = mid + 1;
|
| - } else if (buf[mid].key > key) {
|
| - high = mid - 1;
|
| - } else {
|
| - buf[mid].value = value;
|
| - return;
|
| - }
|
| + buf[mid].value = value;
|
| + return;
|
| }
|
| - m_Buffer.InsertBlock(low * sizeof(_DWordPair), &pair, sizeof(_DWordPair));
|
| + }
|
| + m_Buffer.InsertBlock(low * sizeof(_DWordPair), &pair, sizeof(_DWordPair));
|
| }
|
| -void CFX_CMapDWordToDWord::EstimateSize(FX_DWORD size, FX_DWORD grow_by)
|
| -{
|
| - m_Buffer.EstimateSize(size, grow_by);
|
| +void CFX_CMapDWordToDWord::EstimateSize(FX_DWORD size, FX_DWORD grow_by) {
|
| + m_Buffer.EstimateSize(size, grow_by);
|
| }
|
|
|