14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * HashMapImpl.c * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "HashMap.h" 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "HashMapImpl.h" 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h" 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "string.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MTAG NULL 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode HashMapCreate_Internal(PHashTableArgs *hashArgs, 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap **self) 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapImpl* impl; 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self == NULL) 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl = NEW(HashMapImpl, MTAG); 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl == NULL) 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_OUT_OF_MEMORY; 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PHashTableCreate(hashArgs, MTAG, &impl->table)) != ESR_SUCCESS) 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(impl); 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.put = &HashMap_Put; 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.remove = &HashMap_Remove; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.removeAndFree = &HashMap_RemoveAndFree; 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.removeAll = &HashMap_RemoveAll; 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.removeAndFreeAll = &HashMap_RemoveAndFreeAll; 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.removeAtIndex = &HashMap_RemoveAtIndex; 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.containsKey = &HashMap_ContainsKey; 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getKeyAtIndex = &HashMap_GetKeyAtIndex; 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.get = &HashMap_Get; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getValueAtIndex = &HashMap_GetValueAtIndex; 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getSize = &HashMap_GetSize; 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.destroy = &HashMap_Destroy; 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *self = (HashMap*) impl; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMapCreate(HashMap** self) 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return HashMapCreate_Internal(NULL, self); 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMapCreateBins(size_t nbBins, HashMap** self) 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableArgs hashArgs; 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hashArgs.capacity = nbBins; 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hashArgs.maxLoadFactor = PHASH_TABLE_DEFAULT_MAX_LOAD_FACTOR; 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hashArgs.hashFunction = PHASH_TABLE_DEFAULT_HASH_FUNCTION; 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hashArgs.compFunction = PHASH_TABLE_DEFAULT_COMP_FUNCTION; 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return HashMapCreate_Internal(&hashArgs, self); 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_Put(HashMap* self, const LCHAR* key, void* value) 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapImpl* impl = (HashMapImpl*) self; 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableEntry *entry = NULL; 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL exists; 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PHashTableContainsKey(impl->table, key, &exists)); 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!exists) 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Not found, clone the key and insert it. */ 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR *clone = (LCHAR *) MALLOC(sizeof(LCHAR) * (LSTRLEN(key) + 1), MTAG); 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (clone == NULL) return ESR_OUT_OF_MEMORY; 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(clone, key); 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PHashTablePutValue(impl->table, clone, value, NULL)) != ESR_SUCCESS) 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(clone); 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Key already present in table, just change the value. */ 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PHashTableGetEntry(impl->table, key, &entry)); 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PHashTableEntrySetValue(entry, value, NULL); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode HashMap_Remove_Internal(HashMapImpl* impl, const LCHAR* key, ESR_BOOL freeValue) 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableEntry *entry = NULL; 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR *clonedKey = NULL; 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *value = NULL; 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHK(rc, PHashTableGetEntry(impl->table, key, &entry)); 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHK(rc, PHashTableEntryGetKeyValue(entry, (void **)&clonedKey, (void **)&value)); 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (clonedKey) 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(clonedKey); 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (freeValue && value) 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(value); 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return PHashTableEntryRemove(entry); 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_Remove(HashMap* self, const LCHAR* key) 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return HashMap_Remove_Internal((HashMapImpl*) self, key, ESR_FALSE); 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_RemoveAndFree(HashMap* self, const LCHAR* key) 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return HashMap_Remove_Internal((HashMapImpl*) self, key, ESR_TRUE); 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode HashMap_RemoveAll_Internal(HashMapImpl *impl, ESR_BOOL freeValues) 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableEntry *entry1 = NULL; 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableEntry *entry2 = NULL; 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR *key = NULL; 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *value = NULL; 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PHashTableEntryGetFirst(impl->table, &entry1)) != ESR_SUCCESS) 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (entry1 != NULL) 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PHashTableEntryGetKeyValue(entry1, (void **)&key, (void **)&value)) != ESR_SUCCESS) 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (key) FREE(key); 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (freeValues && value) FREE(value); 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project entry2 = entry1; 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PHashTableEntryAdvance(&entry1)) != ESR_SUCCESS) 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PHashTableEntryRemove(entry2)) != ESR_SUCCESS) 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectend: 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_RemoveAll(HashMap* self) 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return HashMap_RemoveAll_Internal((HashMapImpl *) self, ESR_FALSE); 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_RemoveAndFreeAll(HashMap* self) 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return HashMap_RemoveAll_Internal((HashMapImpl *) self, ESR_TRUE); 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_ContainsKey(HashMap* self, const LCHAR* key, ESR_BOOL* exists) 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapImpl* impl = (HashMapImpl*) self; 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, PHashTableContainsKey(impl->table, key, exists)); 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_Get(HashMap* self, const LCHAR* key, void** value) 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapImpl* impl = (HashMapImpl*) self; 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableEntry *entry = NULL; 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHK(rc, PHashTableGetEntry(impl->table, key, &entry)); 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHK(rc, PHashTableEntryGetKeyValue(entry, (void **)NULL, (void **)value)); 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode HashMap_GetEntryAtIndex(HashMapImpl *impl, const size_t index, 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableEntry **entry) 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i = 0; 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PHashTableEntryGetFirst(impl->table, entry)) != ESR_SUCCESS) 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (*entry != NULL && i < index) 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ++i; 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PHashTableEntryAdvance(entry)) != ESR_SUCCESS) 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (*entry == NULL) 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_ARGUMENT_OUT_OF_BOUNDS; 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectend: 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_GetKeyAtIndex(HashMap* self, const size_t index, LCHAR** key) 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapImpl* impl = (HashMapImpl*) self; 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableEntry *entry = NULL; 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = HashMap_GetEntryAtIndex(impl, index, &entry)) != ESR_SUCCESS) 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PHashTableEntryGetKeyValue(entry, (void **) key, (void **) NULL); 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectend: 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_GetValueAtIndex(HashMap* self, const size_t index, void** value) 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapImpl* impl = (HashMapImpl*) self; 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableEntry *entry = NULL; 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = HashMap_GetEntryAtIndex(impl, index, &entry)) != ESR_SUCCESS) 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PHashTableEntryGetKeyValue(entry, (void **)NULL, (void **)value); 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectend: 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_RemoveAtIndex(HashMap* self, const size_t index) 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapImpl* impl = (HashMapImpl*) self; 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PHashTableEntry *entry = NULL; 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void *key; 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = HashMap_GetEntryAtIndex(impl, index, &entry)) != ESR_SUCCESS) 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PHashTableEntryGetKeyValue(entry, (void **)&key, (void **)NULL)) != ESR_SUCCESS) 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (key != NULL) FREE(key); 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PHashTableEntryRemove(entry); 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectend: 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_GetSize(HashMap* self, size_t* size) 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapImpl* impl = (HashMapImpl*) self; 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return PHashTableGetSize(impl->table, size); 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode HashMap_Destroy(HashMap* self) 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapImpl* impl = (HashMapImpl*) self; 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = self->removeAll(self)) != ESR_SUCCESS) 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto end; 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->table != NULL) 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PHashTableDestroy(impl->table); 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(impl); 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectend: 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 294