| /*---------------------------------------------------------------------------* |
| * HashMap.h * |
| * * |
| * Copyright 2007, 2008 Nuance Communciations, Inc. * |
| * * |
| * Licensed under the Apache License, Version 2.0 (the 'License'); * |
| * you may not use this file except in compliance with the License. * |
| * * |
| * You may obtain a copy of the License at * |
| * http://www.apache.org/licenses/LICENSE-2.0 * |
| * * |
| * Unless required by applicable law or agreed to in writing, software * |
| * distributed under the License is distributed on an 'AS IS' BASIS, * |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * |
| * See the License for the specific language governing permissions and * |
| * limitations under the License. * |
| * * |
| *---------------------------------------------------------------------------*/ |
| |
| #ifndef __HASHMAP_H |
| #define __HASHMAP_H |
| |
| |
| |
| #include "ESR_ReturnCode.h" |
| #include "ESR_SharedPrefix.h" |
| #include "ptypes.h" |
| #include <stdlib.h> |
| |
| |
| /** |
| * @addtogroup HashMapModule HashMap API functions |
| * Hashed [key, value] mapping. |
| * |
| * @{ |
| */ |
| |
| /** |
| * Hashed [key, value] mapping. |
| */ |
| typedef struct HashMap_t |
| { |
| /** |
| * Sets new mapping, storing a reference to the value. |
| * The key can be safely deallocated after this operation. |
| * |
| * @param self HashMap handle |
| * @param key Mapping key |
| * @param value Mapping value |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory |
| */ |
| ESR_ReturnCode(*put)(struct HashMap_t* self, const LCHAR* key, void* value); |
| |
| /** |
| * Removes the mapping for this key from this map if present. |
| * |
| * @param self HashMap handle |
| * @param key Key whose mapping is to be removed from the map. |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*remove)(struct HashMap_t* self, const LCHAR* key); |
| |
| /** |
| * Removes the mapping for this key from this map if present and frees the value. |
| * |
| * @param self HashMap handle |
| * @param key Key whose mapping is to be removed from the map. |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*removeAndFree)(struct HashMap_t* self, const LCHAR* key); |
| |
| /** |
| * Removes the mappings for the key at the specified index. |
| * |
| * @param self HashMap handle |
| * @param index Index of element to be removed |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds |
| */ |
| ESR_ReturnCode(*removeAtIndex)(struct HashMap_t* self, const size_t index); |
| |
| /** |
| * Removes all mappings from this map. |
| * |
| * @param self HashMap handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*removeAll)(struct HashMap_t* self); |
| |
| /** |
| * Removes all mappings from this map and frees the values. |
| * |
| * @param self HashMap handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*removeAndFreeAll)(struct HashMap_t* self); |
| |
| /** |
| * Indicates if element is contained within the list. |
| * |
| * @param self HashMap handle |
| * @param key Key to check for |
| * @param exists True if key was found |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*containsKey)(struct HashMap_t* self, const LCHAR* key, ESR_BOOL* exists); |
| |
| /** |
| * Returns the number of mappings contained in this map. |
| * |
| * @param self HashMap handle |
| * @param size Returned size |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*getSize)(struct HashMap_t* self, size_t* size); |
| |
| /** |
| * Returns the value to which the specified key is mapped in this identity hash map, |
| * or null if the map contains no mapping for this key. |
| * |
| * @param self HashMap handle |
| * @param key the key whose associated value is to be returned. |
| * @param value the value to which this map maps the specified key, or null if the |
| * map contains no mapping for this key. |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if key cannot be found |
| */ |
| ESR_ReturnCode(*get)(struct HashMap_t* self, const LCHAR* key, void** value); |
| /** |
| * Returns the key at the specified index. |
| * |
| * @param self HashMap handle |
| * @param index the key index |
| * @param key the key at the specified index |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds |
| */ |
| ESR_ReturnCode(*getKeyAtIndex)(struct HashMap_t* self, const size_t index, LCHAR** key); |
| /** |
| * Returns the value at the specified index. |
| * |
| * @param self HashMap handle |
| * @param index the key index |
| * @param value the value at the specified index |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds |
| */ |
| ESR_ReturnCode(*getValueAtIndex)(struct HashMap_t* self, const size_t index, void** value); |
| /** |
| * Destroys the HashMap. |
| * |
| * @param self HashMap handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_ReturnCode(*destroy)(struct HashMap_t* self); |
| } |
| HashMap; |
| |
| /** |
| * Creates a new HashMap. |
| * |
| * @param self HashMap handle |
| * @return ESR_INVALID_ARGUMENT if self or the value it points to are null |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapCreate(HashMap** self); |
| /** |
| * Creates a new HashMap. |
| * |
| * @param bins The number of hashing bins to be used. |
| * @param self HashMap handle |
| * @return ESR_INVALID_ARGUMENT if self or the value it points to are null |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapCreateBins(size_t nbBins, HashMap** self); |
| /** |
| * Sets new mapping, storing a reference to the value. |
| * The key can be safely deallocated after this operation. |
| * |
| * @param self HashMap handle |
| * @param key Mapping key |
| * @param value Mapping value |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapPut(HashMap* self, const LCHAR* key, void* value); |
| /** |
| * Removes the mapping for this key from this map if present. |
| * The value can be safely deallocated after this operation. |
| * If the map previously contained a mapping for this key, the old value is replaced, |
| * but not deallocated. |
| * |
| * @param self HashMap handle |
| * @param key Key whose mapping is to be removed from the map. |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapRemove(HashMap* self, const LCHAR* key); |
| /** |
| * Removes the mapping for this key from this map if present and frees the value. |
| * The value can be safely deallocated after this operation. |
| * |
| * @param self HashMap handle |
| * @param key Key whose mapping is to be removed from the map. |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapRemoveAndFree(HashMap* self, const LCHAR* key); |
| /** |
| * Removes the mappings for the key at the specified index. |
| * |
| * @param self HashMap handle |
| * @param index Index of element to be removed |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapRemoveAtIndex(HashMap* self, const size_t index); |
| /** |
| * Removes all mappings from this map. |
| * |
| * @param self HashMap handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapRemoveAll(HashMap* self); |
| /** |
| * Removes all mappings from this map and frees the values. |
| * |
| * @param self HashMap handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapRemoveAndFreeAll(HashMap* self); |
| /** |
| * Indicates if element is contained within the list. |
| * |
| * @param self HashMap handle |
| * @param key Key to check for |
| * @param exists True if key was found |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapContainsKey(HashMap* self, const LCHAR* key, ESR_BOOL* exists); |
| /** |
| * Returns the number of mappings contained in this map. |
| * |
| * @param self HashMap handle |
| * @param size Returned size |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapGetSize(HashMap* self, size_t* size); |
| /** |
| * Returns the value to which the specified key is mapped in this identity hash map, |
| * or null if the map contains no mapping for this key. |
| * |
| * @param self HashMap handle |
| * @param key the key whose associated value is to be returned. |
| * @param value the value to which this map maps the specified key, or null if the |
| * map contains no mapping for this key. |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if key cannot be found |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapGet(HashMap* self, const LCHAR* key, void** value); |
| /** |
| * Returns the key at the specified index. |
| * |
| * @param self HashMap handle |
| * @param index the key index |
| * @param key the key at the specified index |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapGetKeyAtIndex(HashMap* self, const size_t index, LCHAR** key); |
| /** |
| * Returns the value at the specified index. |
| * |
| * @param self HashMap handle |
| * @param index the key index |
| * @param value the key at the specified index |
| * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapGetValueAtIndex(HashMap* self, const size_t index, void** value); |
| /** |
| * Destroys an HashMap. |
| * |
| * @param self HashMap handle |
| * @return ESR_INVALID_ARGUMENT if self is null |
| */ |
| ESR_SHARED_API ESR_ReturnCode HashMapDestroy(HashMap* self); |
| |
| /** |
| * @} |
| */ |
| |
| |
| #endif /* __HASHMAP_H */ |