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/include/fxcrt/fx_basic.h" | 7 #include "core/include/fxcrt/fx_basic.h" |
8 #include "plex.h" | 8 #include "plex.h" |
9 | 9 |
10 CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize) | 10 CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize) |
(...skipping 16 matching lines...) Expand all Loading... | |
27 CFX_MapPtrToPtr::~CFX_MapPtrToPtr() { | 27 CFX_MapPtrToPtr::~CFX_MapPtrToPtr() { |
28 RemoveAll(); | 28 RemoveAll(); |
29 ASSERT(m_nCount == 0); | 29 ASSERT(m_nCount == 0); |
30 } | 30 } |
31 FX_DWORD CFX_MapPtrToPtr::HashKey(void* key) const { | 31 FX_DWORD CFX_MapPtrToPtr::HashKey(void* key) const { |
32 return ((FX_DWORD)(uintptr_t)key) >> 4; | 32 return ((FX_DWORD)(uintptr_t)key) >> 4; |
33 } | 33 } |
34 void CFX_MapPtrToPtr::GetNextAssoc(FX_POSITION& rNextPosition, | 34 void CFX_MapPtrToPtr::GetNextAssoc(FX_POSITION& rNextPosition, |
35 void*& rKey, | 35 void*& rKey, |
36 void*& rValue) const { | 36 void*& rValue) const { |
37 ASSERT(m_pHashTable != NULL); | 37 ASSERT(m_pHashTable); |
38 CAssoc* pAssocRet = (CAssoc*)rNextPosition; | 38 CAssoc* pAssocRet = (CAssoc*)rNextPosition; |
39 ASSERT(pAssocRet != NULL); | 39 ASSERT(pAssocRet); |
40 if (pAssocRet == (CAssoc*)-1) { | 40 if (pAssocRet == (CAssoc*)-1) { |
41 for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++) | 41 for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++) |
42 if ((pAssocRet = m_pHashTable[nBucket]) != NULL) { | 42 if ((pAssocRet = m_pHashTable[nBucket]) != NULL) { |
Tom Sepez
2015/12/14 19:14:11
nit: {} in for statement, not if statement.
Lei Zhang
2015/12/15 01:38:33
Done.
| |
43 break; | 43 break; |
44 } | 44 } |
45 ASSERT(pAssocRet != NULL); | 45 ASSERT(pAssocRet); |
46 } | 46 } |
47 CAssoc* pAssocNext; | 47 CAssoc* pAssocNext; |
48 if ((pAssocNext = pAssocRet->pNext) == NULL) { | 48 if ((pAssocNext = pAssocRet->pNext) == NULL) { |
49 for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1; | 49 for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1; |
50 nBucket < m_nHashTableSize; nBucket++) { | 50 nBucket < m_nHashTableSize; nBucket++) { |
51 if ((pAssocNext = m_pHashTable[nBucket]) != NULL) { | 51 if ((pAssocNext = m_pHashTable[nBucket]) != NULL) { |
52 break; | 52 break; |
53 } | 53 } |
54 } | 54 } |
55 } | 55 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
88 } | 88 } |
89 return pAssoc->value; | 89 return pAssoc->value; |
90 } | 90 } |
91 CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::GetAssocAt(void* key, | 91 CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::GetAssocAt(void* key, |
92 FX_DWORD& nHash) const { | 92 FX_DWORD& nHash) const { |
93 nHash = HashKey(key) % m_nHashTableSize; | 93 nHash = HashKey(key) % m_nHashTableSize; |
94 if (m_pHashTable == NULL) { | 94 if (m_pHashTable == NULL) { |
95 return NULL; | 95 return NULL; |
96 } | 96 } |
97 CAssoc* pAssoc; | 97 CAssoc* pAssoc; |
98 for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) { | 98 for (pAssoc = m_pHashTable[nHash]; pAssoc; pAssoc = pAssoc->pNext) { |
99 if (pAssoc->key == key) { | 99 if (pAssoc->key == key) { |
Tom Sepez
2015/12/14 19:14:11
nit: no {} for if
Lei Zhang
2015/12/15 01:38:33
Done.
| |
100 return pAssoc; | 100 return pAssoc; |
101 } | 101 } |
102 } | 102 } |
103 return NULL; | 103 return NULL; |
104 } | 104 } |
105 CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::NewAssoc() { | 105 CFX_MapPtrToPtr::CAssoc* CFX_MapPtrToPtr::NewAssoc() { |
106 if (m_pFreeList == NULL) { | 106 if (m_pFreeList == NULL) { |
107 CFX_Plex* newBlock = CFX_Plex::Create(m_pBlocks, m_nBlockSize, | 107 CFX_Plex* newBlock = CFX_Plex::Create(m_pBlocks, m_nBlockSize, |
108 sizeof(CFX_MapPtrToPtr::CAssoc)); | 108 sizeof(CFX_MapPtrToPtr::CAssoc)); |
109 CFX_MapPtrToPtr::CAssoc* pAssoc = | 109 CFX_MapPtrToPtr::CAssoc* pAssoc = |
110 (CFX_MapPtrToPtr::CAssoc*)newBlock->data(); | 110 (CFX_MapPtrToPtr::CAssoc*)newBlock->data(); |
111 pAssoc += m_nBlockSize - 1; | 111 pAssoc += m_nBlockSize - 1; |
112 for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) { | 112 for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) { |
113 pAssoc->pNext = m_pFreeList; | 113 pAssoc->pNext = m_pFreeList; |
114 m_pFreeList = pAssoc; | 114 m_pFreeList = pAssoc; |
115 } | 115 } |
116 } | 116 } |
117 ASSERT(m_pFreeList != NULL); | 117 ASSERT(m_pFreeList); |
Tom Sepez
2015/12/14 19:14:11
nit: seg at 119.
Lei Zhang
2015/12/15 01:38:33
Done.
| |
118 CFX_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList; | 118 CFX_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList; |
119 m_pFreeList = m_pFreeList->pNext; | 119 m_pFreeList = m_pFreeList->pNext; |
120 m_nCount++; | 120 m_nCount++; |
121 ASSERT(m_nCount > 0); | 121 ASSERT(m_nCount > 0); |
122 pAssoc->key = 0; | 122 pAssoc->key = 0; |
123 pAssoc->value = 0; | 123 pAssoc->value = 0; |
124 return pAssoc; | 124 return pAssoc; |
125 } | 125 } |
126 void CFX_MapPtrToPtr::InitHashTable(FX_DWORD nHashSize, FX_BOOL bAllocNow) { | 126 void CFX_MapPtrToPtr::InitHashTable(FX_DWORD nHashSize, FX_BOOL bAllocNow) { |
127 ASSERT(m_nCount == 0); | 127 ASSERT(m_nCount == 0); |
128 ASSERT(nHashSize > 0); | 128 ASSERT(nHashSize > 0); |
129 FX_Free(m_pHashTable); | 129 FX_Free(m_pHashTable); |
130 m_pHashTable = NULL; | 130 m_pHashTable = NULL; |
131 if (bAllocNow) { | 131 if (bAllocNow) { |
132 m_pHashTable = FX_Alloc(CAssoc*, nHashSize); | 132 m_pHashTable = FX_Alloc(CAssoc*, nHashSize); |
133 } | 133 } |
134 m_nHashTableSize = nHashSize; | 134 m_nHashTableSize = nHashSize; |
135 } | 135 } |
136 FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key) { | 136 FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key) { |
137 if (m_pHashTable == NULL) { | 137 if (m_pHashTable == NULL) { |
138 return FALSE; | 138 return FALSE; |
139 } | 139 } |
140 CAssoc** ppAssocPrev; | 140 CAssoc** ppAssocPrev; |
141 ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize]; | 141 ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize]; |
142 CAssoc* pAssoc; | 142 CAssoc* pAssoc; |
143 for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) { | 143 for (pAssoc = *ppAssocPrev; pAssoc; pAssoc = pAssoc->pNext) { |
144 if (pAssoc->key == key) { | 144 if (pAssoc->key == key) { |
145 *ppAssocPrev = pAssoc->pNext; | 145 *ppAssocPrev = pAssoc->pNext; |
146 FreeAssoc(pAssoc); | 146 FreeAssoc(pAssoc); |
147 return TRUE; | 147 return TRUE; |
148 } | 148 } |
149 ppAssocPrev = &pAssoc->pNext; | 149 ppAssocPrev = &pAssoc->pNext; |
150 } | 150 } |
151 return FALSE; | 151 return FALSE; |
152 } | 152 } |
153 void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc) { | 153 void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc) { |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
286 FX_BOOL CFX_CMapByteStringToPtr::Lookup(const CFX_ByteStringC& key, | 286 FX_BOOL CFX_CMapByteStringToPtr::Lookup(const CFX_ByteStringC& key, |
287 void*& rValue) const { | 287 void*& rValue) const { |
288 void* p = m_Buffer.Iterate(_CMapLookupCallback, (void*)&key); | 288 void* p = m_Buffer.Iterate(_CMapLookupCallback, (void*)&key); |
289 if (!p) { | 289 if (!p) { |
290 return FALSE; | 290 return FALSE; |
291 } | 291 } |
292 rValue = *(void**)((_CompactString*)p + 1); | 292 rValue = *(void**)((_CompactString*)p + 1); |
293 return TRUE; | 293 return TRUE; |
294 } | 294 } |
295 void CFX_CMapByteStringToPtr::SetAt(const CFX_ByteStringC& key, void* value) { | 295 void CFX_CMapByteStringToPtr::SetAt(const CFX_ByteStringC& key, void* value) { |
296 ASSERT(value != NULL); | 296 ASSERT(value); |
297 int index, key_len = key.GetLength(); | 297 int index, key_len = key.GetLength(); |
Tom Sepez
2015/12/14 19:14:11
nit: one per line.
Lei Zhang
2015/12/15 01:38:33
Done.
| |
298 int size = m_Buffer.GetSize(); | 298 int size = m_Buffer.GetSize(); |
299 for (index = 0; index < size; index++) { | 299 for (index = 0; index < size; index++) { |
300 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); | 300 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); |
301 if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) { | 301 if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) { |
302 continue; | 302 continue; |
303 } | 303 } |
304 *(void**)(pKey + 1) = value; | 304 *(void**)(pKey + 1) = value; |
305 return; | 305 return; |
306 } | 306 } |
307 for (index = 0; index < size; index++) { | 307 for (index = 0; index < size; index++) { |
308 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); | 308 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); |
309 if (pKey->m_CompactLen) { | 309 if (pKey->m_CompactLen) { |
310 continue; | 310 continue; |
311 } | 311 } |
312 _CompactStringStore(pKey, key.GetPtr(), key_len); | 312 _CompactStringStore(pKey, key.GetPtr(), key_len); |
313 *(void**)(pKey + 1) = value; | 313 *(void**)(pKey + 1) = value; |
314 return; | 314 return; |
315 } | 315 } |
316 _CompactString* pKey = (_CompactString*)m_Buffer.Add(); | 316 _CompactString* pKey = (_CompactString*)m_Buffer.Add(); |
317 _CompactStringStore(pKey, key.GetPtr(), key_len); | 317 _CompactStringStore(pKey, key.GetPtr(), key_len); |
318 *(void**)(pKey + 1) = value; | 318 *(void**)(pKey + 1) = value; |
319 } | 319 } |
320 void CFX_CMapByteStringToPtr::AddValue(const CFX_ByteStringC& key, | 320 void CFX_CMapByteStringToPtr::AddValue(const CFX_ByteStringC& key, |
321 void* value) { | 321 void* value) { |
322 ASSERT(value != NULL); | 322 ASSERT(value); |
323 _CompactString* pKey = (_CompactString*)m_Buffer.Add(); | 323 _CompactString* pKey = (_CompactString*)m_Buffer.Add(); |
324 _CompactStringStore(pKey, key.GetPtr(), key.GetLength()); | 324 _CompactStringStore(pKey, key.GetPtr(), key.GetLength()); |
325 *(void**)(pKey + 1) = value; | 325 *(void**)(pKey + 1) = value; |
326 } | 326 } |
327 void CFX_CMapByteStringToPtr::RemoveKey(const CFX_ByteStringC& key) { | 327 void CFX_CMapByteStringToPtr::RemoveKey(const CFX_ByteStringC& key) { |
328 int key_len = key.GetLength(); | 328 int key_len = key.GetLength(); |
329 int size = m_Buffer.GetSize(); | 329 int size = m_Buffer.GetSize(); |
330 for (int index = 0; index < size; index++) { | 330 for (int index = 0; index < size; index++) { |
331 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); | 331 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); |
332 if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) { | 332 if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) { |
333 continue; | 333 continue; |
334 } | 334 } |
335 _CompactStringRelease(pKey); | 335 _CompactStringRelease(pKey); |
336 pKey->m_CompactLen = 0xfe; | 336 pKey->m_CompactLen = 0xfe; |
337 return; | 337 return; |
338 } | 338 } |
339 } | 339 } |
340 int CFX_CMapByteStringToPtr::GetCount() const { | 340 int CFX_CMapByteStringToPtr::GetCount() const { |
341 int count = 0; | 341 int count = 0; |
342 int size = m_Buffer.GetSize(); | 342 int size = m_Buffer.GetSize(); |
343 for (int i = 0; i < size; i++) { | 343 for (int i = 0; i < size; i++) { |
344 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i); | 344 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i); |
345 if (pKey->m_CompactLen != 0xfe) { | 345 if (pKey->m_CompactLen != 0xfe) { |
346 count++; | 346 count++; |
347 } | 347 } |
348 } | 348 } |
349 return count; | 349 return count; |
350 } | 350 } |
OLD | NEW |