Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1551)

Side by Side Diff: core/src/fxcrt/fx_basic_maps.cpp

Issue 1297723002: CFX_MapByteStringToPtr considered harmful. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Separate reload & delete. Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "../../include/fxcrt/fx_basic.h" 7 #include "../../include/fxcrt/fx_basic.h"
8 #include "plex.h" 8 #include "plex.h"
9 9
10 static void ConstructElement(CFX_ByteString* pNewData) {
11 new (pNewData) CFX_ByteString();
12 }
13 static void DestructElement(CFX_ByteString* pOldData) {
14 pOldData->~CFX_ByteString();
15 }
16 CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize) 10 CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize)
17 : m_pHashTable(NULL), 11 : m_pHashTable(NULL),
18 m_nHashTableSize(17), 12 m_nHashTableSize(17),
19 m_nCount(0), 13 m_nCount(0),
20 m_pFreeList(NULL), 14 m_pFreeList(NULL),
21 m_pBlocks(NULL), 15 m_pBlocks(NULL),
22 m_nBlockSize(nBlockSize) { 16 m_nBlockSize(nBlockSize) {
23 ASSERT(m_nBlockSize > 0); 17 ASSERT(m_nBlockSize > 0);
24 } 18 }
25 void CFX_MapPtrToPtr::RemoveAll() { 19 void CFX_MapPtrToPtr::RemoveAll() {
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 } 156 }
163 void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc) { 157 void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc) {
164 pAssoc->pNext = m_pFreeList; 158 pAssoc->pNext = m_pFreeList;
165 m_pFreeList = pAssoc; 159 m_pFreeList = pAssoc;
166 m_nCount--; 160 m_nCount--;
167 ASSERT(m_nCount >= 0); 161 ASSERT(m_nCount >= 0);
168 if (m_nCount == 0) { 162 if (m_nCount == 0) {
169 RemoveAll(); 163 RemoveAll();
170 } 164 }
171 } 165 }
172 CFX_MapByteStringToPtr::CFX_MapByteStringToPtr(int nBlockSize)
173 : m_pHashTable(NULL),
174 m_nHashTableSize(17),
175 m_nCount(0),
176 m_pFreeList(NULL),
177 m_pBlocks(NULL),
178 m_nBlockSize(nBlockSize) {
179 ASSERT(m_nBlockSize > 0);
180 }
181 void CFX_MapByteStringToPtr::RemoveAll() {
182 if (m_pHashTable != NULL) {
183 for (FX_DWORD nHash = 0; nHash < m_nHashTableSize; nHash++) {
184 CAssoc* pAssoc;
185 for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL;
186 pAssoc = pAssoc->pNext) {
187 DestructElement(&pAssoc->key);
188 }
189 }
190 FX_Free(m_pHashTable);
191 m_pHashTable = NULL;
192 }
193 m_nCount = 0;
194 m_pFreeList = NULL;
195 m_pBlocks->FreeDataChain();
196 m_pBlocks = NULL;
197 }
198 CFX_MapByteStringToPtr::~CFX_MapByteStringToPtr() {
199 RemoveAll();
200 ASSERT(m_nCount == 0);
201 }
202 void CFX_MapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition,
203 CFX_ByteString& rKey,
204 void*& rValue) const {
205 ASSERT(m_pHashTable != NULL);
206 CAssoc* pAssocRet = (CAssoc*)rNextPosition;
207 ASSERT(pAssocRet != NULL);
208 if (pAssocRet == (CAssoc*)-1) {
209 for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
210 if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
211 break;
212 }
213 ASSERT(pAssocRet != NULL);
214 }
215 CAssoc* pAssocNext;
216 if ((pAssocNext = pAssocRet->pNext) == NULL) {
217 for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;
218 nBucket < m_nHashTableSize; nBucket++)
219 if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
220 break;
221 }
222 }
223 rNextPosition = (FX_POSITION)pAssocNext;
224 rKey = pAssocRet->key;
225 rValue = pAssocRet->value;
226 }
227 void* CFX_MapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const {
228 ASSERT(m_pHashTable != NULL);
229 CAssoc* pAssocRet = (CAssoc*)rNextPosition;
230 ASSERT(pAssocRet != NULL);
231 if (pAssocRet == (CAssoc*)-1) {
232 for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
233 if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
234 break;
235 }
236 ASSERT(pAssocRet != NULL);
237 }
238 CAssoc* pAssocNext;
239 if ((pAssocNext = pAssocRet->pNext) == NULL) {
240 for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;
241 nBucket < m_nHashTableSize; nBucket++)
242 if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
243 break;
244 }
245 }
246 rNextPosition = (FX_POSITION)pAssocNext;
247 return pAssocRet->value;
248 }
249 void*& CFX_MapByteStringToPtr::operator[](const CFX_ByteStringC& key) {
250 FX_DWORD nHash;
251 CAssoc* pAssoc;
252 if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {
253 if (m_pHashTable == NULL) {
254 InitHashTable(m_nHashTableSize);
255 }
256 pAssoc = NewAssoc();
257 pAssoc->nHashValue = nHash;
258 pAssoc->key = key;
259 pAssoc->pNext = m_pHashTable[nHash];
260 m_pHashTable[nHash] = pAssoc;
261 }
262 return pAssoc->value;
263 }
264 CFX_MapByteStringToPtr::CAssoc* CFX_MapByteStringToPtr::NewAssoc() {
265 if (m_pFreeList == NULL) {
266 CFX_Plex* newBlock = CFX_Plex::Create(
267 m_pBlocks, m_nBlockSize, sizeof(CFX_MapByteStringToPtr::CAssoc));
268 CFX_MapByteStringToPtr::CAssoc* pAssoc =
269 (CFX_MapByteStringToPtr::CAssoc*)newBlock->data();
270 pAssoc += m_nBlockSize - 1;
271 for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {
272 pAssoc->pNext = m_pFreeList;
273 m_pFreeList = pAssoc;
274 }
275 }
276 ASSERT(m_pFreeList != NULL);
277 CFX_MapByteStringToPtr::CAssoc* pAssoc = m_pFreeList;
278 m_pFreeList = m_pFreeList->pNext;
279 m_nCount++;
280 ASSERT(m_nCount > 0);
281 ConstructElement(&pAssoc->key);
282 pAssoc->value = 0;
283 return pAssoc;
284 }
285 void CFX_MapByteStringToPtr::FreeAssoc(CFX_MapByteStringToPtr::CAssoc* pAssoc) {
286 DestructElement(&pAssoc->key);
287 pAssoc->pNext = m_pFreeList;
288 m_pFreeList = pAssoc;
289 m_nCount--;
290 ASSERT(m_nCount >= 0);
291 if (m_nCount == 0) {
292 RemoveAll();
293 }
294 }
295 CFX_MapByteStringToPtr::CAssoc* CFX_MapByteStringToPtr::GetAssocAt(
296 const CFX_ByteStringC& key,
297 FX_DWORD& nHash) const {
298 nHash = HashKey(key) % m_nHashTableSize;
299 if (m_pHashTable == NULL) {
300 return NULL;
301 }
302 CAssoc* pAssoc;
303 for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {
304 if (pAssoc->key == key) {
305 return pAssoc;
306 }
307 }
308 return NULL;
309 }
310 FX_BOOL CFX_MapByteStringToPtr::Lookup(const CFX_ByteStringC& key,
311 void*& rValue) const {
312 FX_DWORD nHash;
313 CAssoc* pAssoc = GetAssocAt(key, nHash);
314 if (pAssoc == NULL) {
315 return FALSE;
316 }
317 rValue = pAssoc->value;
318 return TRUE;
319 }
320 void CFX_MapByteStringToPtr::InitHashTable(FX_DWORD nHashSize,
321 FX_BOOL bAllocNow) {
322 ASSERT(m_nCount == 0);
323 ASSERT(nHashSize > 0);
324 if (m_pHashTable != NULL) {
325 FX_Free(m_pHashTable);
326 m_pHashTable = NULL;
327 }
328 if (bAllocNow) {
329 m_pHashTable = FX_Alloc(CAssoc*, nHashSize);
330 }
331 m_nHashTableSize = nHashSize;
332 }
333 inline FX_DWORD CFX_MapByteStringToPtr::HashKey(
334 const CFX_ByteStringC& key) const {
335 FX_DWORD nHash = 0;
336 int len = key.GetLength();
337 const uint8_t* buf = key.GetPtr();
338 for (int i = 0; i < len; i++) {
339 nHash = (nHash << 5) + nHash + buf[i];
340 }
341 return nHash;
342 }
343 FX_BOOL CFX_MapByteStringToPtr::RemoveKey(const CFX_ByteStringC& key) {
344 if (m_pHashTable == NULL) {
345 return FALSE;
346 }
347 CAssoc** ppAssocPrev;
348 ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];
349 CAssoc* pAssoc;
350 for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {
351 if (pAssoc->key == key) {
352 *ppAssocPrev = pAssoc->pNext;
353 FreeAssoc(pAssoc);
354 return TRUE;
355 }
356 ppAssocPrev = &pAssoc->pNext;
357 }
358 return FALSE;
359 }
360 struct _CompactString { 166 struct _CompactString {
361 uint8_t m_CompactLen; 167 uint8_t m_CompactLen;
362 uint8_t m_LenHigh; 168 uint8_t m_LenHigh;
363 uint8_t m_LenLow; 169 uint8_t m_LenLow;
364 uint8_t m_Unused; 170 uint8_t m_Unused;
365 uint8_t* m_pBuffer; 171 uint8_t* m_pBuffer;
366 }; 172 };
367 static void _CompactStringRelease(_CompactString* pCompact) { 173 static void _CompactStringRelease(_CompactString* pCompact) {
368 if (pCompact->m_CompactLen == 0xff) { 174 if (pCompact->m_CompactLen == 0xff) {
369 FX_Free(pCompact->m_pBuffer); 175 FX_Free(pCompact->m_pBuffer);
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 } else { 413 } else {
608 buf[mid].value = value; 414 buf[mid].value = value;
609 return; 415 return;
610 } 416 }
611 } 417 }
612 m_Buffer.InsertBlock(low * sizeof(_DWordPair), &pair, sizeof(_DWordPair)); 418 m_Buffer.InsertBlock(low * sizeof(_DWordPair), &pair, sizeof(_DWordPair));
613 } 419 }
614 void CFX_CMapDWordToDWord::EstimateSize(FX_DWORD size, FX_DWORD grow_by) { 420 void CFX_CMapDWordToDWord::EstimateSize(FX_DWORD size, FX_DWORD grow_by) {
615 m_Buffer.EstimateSize(size, grow_by); 421 m_Buffer.EstimateSize(size, grow_by);
616 } 422 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698