| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/fxcrt/include/fx_basic.h" | 7 #include "core/fxcrt/include/fx_basic.h" |
| 8 #include "core/fxcrt/plex.h" | 8 #include "core/fxcrt/plex.h" |
| 9 | 9 |
| 10 CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize) | 10 CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize) |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 | 70 |
| 71 void* CFX_MapPtrToPtr::GetValueAt(void* key) const { | 71 void* CFX_MapPtrToPtr::GetValueAt(void* key) const { |
| 72 uint32_t nHash; | 72 uint32_t nHash; |
| 73 CAssoc* pAssoc = GetAssocAt(key, nHash); | 73 CAssoc* pAssoc = GetAssocAt(key, nHash); |
| 74 return pAssoc ? pAssoc->value : nullptr; | 74 return pAssoc ? pAssoc->value : nullptr; |
| 75 } | 75 } |
| 76 | 76 |
| 77 void*& CFX_MapPtrToPtr::operator[](void* key) { | 77 void*& CFX_MapPtrToPtr::operator[](void* key) { |
| 78 uint32_t nHash; | 78 uint32_t nHash; |
| 79 CAssoc* pAssoc; | 79 CAssoc* pAssoc; |
| 80 if ((pAssoc = GetAssocAt(key, nHash)) == NULL) { | 80 if (!(pAssoc = GetAssocAt(key, nHash))) { |
| 81 if (!m_pHashTable) { | 81 if (!m_pHashTable) |
| 82 InitHashTable(m_nHashTableSize); | 82 InitHashTable(m_nHashTableSize); |
| 83 } | |
| 84 pAssoc = NewAssoc(); | 83 pAssoc = NewAssoc(); |
| 85 pAssoc->key = key; | 84 pAssoc->key = key; |
| 86 pAssoc->pNext = m_pHashTable[nHash]; | 85 pAssoc->pNext = m_pHashTable[nHash]; |
| 87 m_pHashTable[nHash] = pAssoc; | 86 m_pHashTable[nHash] = pAssoc; |
| 88 } | 87 } |
| 89 return pAssoc->value; | 88 return pAssoc->value; |
| 90 } | 89 } |
| 91 CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::GetAssocAt(void* key, | 90 CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::GetAssocAt(void* key, |
| 92 uint32_t& nHash) const { | 91 uint32_t& nHash) const { |
| 93 nHash = HashKey(key) % m_nHashTableSize; | 92 nHash = HashKey(key) % m_nHashTableSize; |
| 94 if (!m_pHashTable) { | 93 if (!m_pHashTable) { |
| 95 return NULL; | 94 return nullptr; |
| 96 } | 95 } |
| 97 CAssoc* pAssoc; | 96 CAssoc* pAssoc; |
| 98 for (pAssoc = m_pHashTable[nHash]; pAssoc; pAssoc = pAssoc->pNext) { | 97 for (pAssoc = m_pHashTable[nHash]; pAssoc; pAssoc = pAssoc->pNext) { |
| 99 if (pAssoc->key == key) | 98 if (pAssoc->key == key) |
| 100 return pAssoc; | 99 return pAssoc; |
| 101 } | 100 } |
| 102 return NULL; | 101 return nullptr; |
| 103 } | 102 } |
| 104 CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::NewAssoc() { | 103 CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::NewAssoc() { |
| 105 if (!m_pFreeList) { | 104 if (!m_pFreeList) { |
| 106 CFX_Plex* newBlock = CFX_Plex::Create(m_pBlocks, m_nBlockSize, | 105 CFX_Plex* newBlock = CFX_Plex::Create(m_pBlocks, m_nBlockSize, |
| 107 sizeof(CFX_MapPtrToPtr::CAssoc)); | 106 sizeof(CFX_MapPtrToPtr::CAssoc)); |
| 108 CFX_MapPtrToPtr::CAssoc* pAssoc = | 107 CFX_MapPtrToPtr::CAssoc* pAssoc = |
| 109 (CFX_MapPtrToPtr::CAssoc*)newBlock->data(); | 108 (CFX_MapPtrToPtr::CAssoc*)newBlock->data(); |
| 110 pAssoc += m_nBlockSize - 1; | 109 pAssoc += m_nBlockSize - 1; |
| 111 for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) { | 110 for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) { |
| 112 pAssoc->pNext = m_pFreeList; | 111 pAssoc->pNext = m_pFreeList; |
| 113 m_pFreeList = pAssoc; | 112 m_pFreeList = pAssoc; |
| 114 } | 113 } |
| 115 } | 114 } |
| 116 CFX_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList; | 115 CFX_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList; |
| 117 m_pFreeList = m_pFreeList->pNext; | 116 m_pFreeList = m_pFreeList->pNext; |
| 118 m_nCount++; | 117 m_nCount++; |
| 119 ASSERT(m_nCount > 0); | 118 ASSERT(m_nCount > 0); |
| 120 pAssoc->key = 0; | 119 pAssoc->key = 0; |
| 121 pAssoc->value = 0; | 120 pAssoc->value = 0; |
| 122 return pAssoc; | 121 return pAssoc; |
| 123 } | 122 } |
| 124 void CFX_MapPtrToPtr::InitHashTable(uint32_t nHashSize, FX_BOOL bAllocNow) { | 123 void CFX_MapPtrToPtr::InitHashTable(uint32_t nHashSize, FX_BOOL bAllocNow) { |
| 125 ASSERT(m_nCount == 0); | 124 ASSERT(m_nCount == 0); |
| 126 ASSERT(nHashSize > 0); | 125 ASSERT(nHashSize > 0); |
| 127 FX_Free(m_pHashTable); | 126 FX_Free(m_pHashTable); |
| 128 m_pHashTable = NULL; | 127 m_pHashTable = nullptr; |
| 129 if (bAllocNow) { | 128 if (bAllocNow) { |
| 130 m_pHashTable = FX_Alloc(CAssoc*, nHashSize); | 129 m_pHashTable = FX_Alloc(CAssoc*, nHashSize); |
| 131 } | 130 } |
| 132 m_nHashTableSize = nHashSize; | 131 m_nHashTableSize = nHashSize; |
| 133 } | 132 } |
| 134 FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key) { | 133 FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key) { |
| 135 if (!m_pHashTable) { | 134 if (!m_pHashTable) { |
| 136 return FALSE; | 135 return FALSE; |
| 137 } | 136 } |
| 138 CAssoc** ppAssocPrev; | 137 CAssoc** ppAssocPrev; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 150 } | 149 } |
| 151 void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc) { | 150 void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc) { |
| 152 pAssoc->pNext = m_pFreeList; | 151 pAssoc->pNext = m_pFreeList; |
| 153 m_pFreeList = pAssoc; | 152 m_pFreeList = pAssoc; |
| 154 m_nCount--; | 153 m_nCount--; |
| 155 ASSERT(m_nCount >= 0); | 154 ASSERT(m_nCount >= 0); |
| 156 if (m_nCount == 0) { | 155 if (m_nCount == 0) { |
| 157 RemoveAll(); | 156 RemoveAll(); |
| 158 } | 157 } |
| 159 } | 158 } |
| OLD | NEW |