/*---------------------------------------------------------------------------*
* 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 */