Home | History | Annotate | Download | only in include
      1 /*---------------------------------------------------------------------------*
      2  *  HashMap.h  *
      3  *                                                                           *
      4  *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
      5  *                                                                           *
      6  *  Licensed under the Apache License, Version 2.0 (the 'License');          *
      7  *  you may not use this file except in compliance with the License.         *
      8  *                                                                           *
      9  *  You may obtain a copy of the License at                                  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0                           *
     11  *                                                                           *
     12  *  Unless required by applicable law or agreed to in writing, software      *
     13  *  distributed under the License is distributed on an 'AS IS' BASIS,        *
     14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
     15  *  See the License for the specific language governing permissions and      *
     16  *  limitations under the License.                                           *
     17  *                                                                           *
     18  *---------------------------------------------------------------------------*/
     19 
     20 #ifndef __HASHMAP_H
     21 #define __HASHMAP_H
     22 
     23 
     24 
     25 #include "ESR_ReturnCode.h"
     26 #include "ESR_SharedPrefix.h"
     27 #include "ptypes.h"
     28 #include <stdlib.h>
     29 
     30 
     31 /**
     32  * @addtogroup HashMapModule HashMap API functions
     33  * Hashed [key, value] mapping.
     34  *
     35  * @{
     36  */
     37 
     38 /**
     39  * Hashed [key, value] mapping.
     40  */
     41 typedef struct HashMap_t
     42 {
     43   /**
     44    * Sets new mapping, storing a reference to the value.
     45    * The key can be safely deallocated after this operation.
     46    *
     47    * @param self HashMap handle
     48    * @param key Mapping key
     49    * @param value Mapping value
     50    * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
     51    */
     52   ESR_ReturnCode(*put)(struct HashMap_t* self, const LCHAR* key, void* value);
     53 
     54   /**
     55    * Removes the mapping for this key from this map if present.
     56    *
     57    * @param self HashMap handle
     58    * @param key Key whose mapping is to be removed from the map.
     59    * @return ESR_INVALID_ARGUMENT if self is null
     60    */
     61   ESR_ReturnCode(*remove)(struct HashMap_t* self, const LCHAR* key);
     62 
     63   /**
     64    * Removes the mapping for this key from this map if present and frees the value.
     65    *
     66    * @param self HashMap handle
     67    * @param key Key whose mapping is to be removed from the map.
     68     * @return ESR_INVALID_ARGUMENT if self is null
     69    */
     70   ESR_ReturnCode(*removeAndFree)(struct HashMap_t* self, const LCHAR* key);
     71 
     72   /**
     73    * Removes the mappings for the key at the specified index.
     74    *
     75    * @param self HashMap handle
     76    * @param index Index of element to be removed
     77    * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
     78    */
     79   ESR_ReturnCode(*removeAtIndex)(struct HashMap_t* self, const size_t index);
     80 
     81   /**
     82    * Removes all mappings from this map.
     83    *
     84    * @param self HashMap handle
     85    * @return ESR_INVALID_ARGUMENT if self is null
     86    */
     87   ESR_ReturnCode(*removeAll)(struct HashMap_t* self);
     88 
     89   /**
     90    * Removes all mappings from this map and frees the values.
     91    *
     92    * @param self HashMap handle
     93    * @return ESR_INVALID_ARGUMENT if self is null
     94    */
     95   ESR_ReturnCode(*removeAndFreeAll)(struct HashMap_t* self);
     96 
     97   /**
     98    * Indicates if element is contained within the list.
     99    *
    100    * @param self HashMap handle
    101    * @param key Key to check for
    102    * @param exists True if key was found
    103    * @return ESR_INVALID_ARGUMENT if self is null
    104    */
    105   ESR_ReturnCode(*containsKey)(struct HashMap_t* self, const LCHAR* key, ESR_BOOL* exists);
    106 
    107   /**
    108    * Returns the number of mappings contained in this map.
    109    *
    110    * @param self HashMap handle
    111    * @param size Returned size
    112    * @return ESR_INVALID_ARGUMENT if self is null
    113    */
    114   ESR_ReturnCode(*getSize)(struct HashMap_t* self, size_t* size);
    115 
    116   /**
    117    * Returns the value to which the specified key is mapped in this identity hash map,
    118    * or null if the map contains no mapping for this key.
    119    *
    120    * @param self HashMap handle
    121    * @param key the key whose associated value is to be returned.
    122    * @param value the value to which this map maps the specified key, or null if the
    123    *              map contains no mapping for this key.
    124    * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if key cannot be found
    125    */
    126   ESR_ReturnCode(*get)(struct HashMap_t* self, const LCHAR* key, void** value);
    127   /**
    128    * Returns the key at the specified index.
    129    *
    130    * @param self HashMap handle
    131    * @param index the key index
    132    * @param key the key at the specified index
    133    * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
    134    */
    135   ESR_ReturnCode(*getKeyAtIndex)(struct HashMap_t* self, const size_t index, LCHAR** key);
    136   /**
    137    * Returns the value at the specified index.
    138    *
    139    * @param self HashMap handle
    140    * @param index the key index
    141    * @param value the value at the specified index
    142    * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
    143    */
    144   ESR_ReturnCode(*getValueAtIndex)(struct HashMap_t* self, const size_t index, void** value);
    145   /**
    146    * Destroys the HashMap.
    147    *
    148    * @param self HashMap handle
    149    * @return ESR_INVALID_ARGUMENT if self is null
    150    */
    151   ESR_ReturnCode(*destroy)(struct HashMap_t* self);
    152 }
    153 HashMap;
    154 
    155 /**
    156  * Creates a new HashMap.
    157  *
    158  * @param self HashMap handle
    159  * @return ESR_INVALID_ARGUMENT if self or the value it points to are null
    160  */
    161 ESR_SHARED_API ESR_ReturnCode HashMapCreate(HashMap** self);
    162 /**
    163  * Creates a new HashMap.
    164  *
    165  * @param bins The number of hashing bins to be used.
    166  * @param self HashMap handle
    167  * @return ESR_INVALID_ARGUMENT if self or the value it points to are null
    168  */
    169 ESR_SHARED_API ESR_ReturnCode HashMapCreateBins(size_t nbBins, HashMap** self);
    170 /**
    171  * Sets new mapping, storing a reference to the value.
    172  * The key can be safely deallocated after this operation.
    173  *
    174  * @param self HashMap handle
    175  * @param key Mapping key
    176  * @param value Mapping value
    177  * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY if system is out of memory
    178  */
    179 ESR_SHARED_API ESR_ReturnCode HashMapPut(HashMap* self, const LCHAR* key, void* value);
    180 /**
    181  * Removes the mapping for this key from this map if present.
    182  * The value can be safely deallocated after this operation.
    183  * If the map previously contained a mapping for this key, the old value is replaced,
    184  * but not deallocated.
    185  *
    186  * @param self HashMap handle
    187  * @param key Key whose mapping is to be removed from the map.
    188  * @return ESR_INVALID_ARGUMENT if self is null
    189  */
    190 ESR_SHARED_API ESR_ReturnCode HashMapRemove(HashMap* self, const LCHAR* key);
    191 /**
    192  * Removes the mapping for this key from this map if present and frees the value.
    193  * The value can be safely deallocated after this operation.
    194  *
    195  * @param self HashMap handle
    196  * @param key Key whose mapping is to be removed from the map.
    197  * @return ESR_INVALID_ARGUMENT if self is null
    198  */
    199 ESR_SHARED_API ESR_ReturnCode HashMapRemoveAndFree(HashMap* self, const LCHAR* key);
    200 /**
    201  * Removes the mappings for the key at the specified index.
    202  *
    203  * @param self HashMap handle
    204  * @param index Index of element to be removed
    205  * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
    206  */
    207 ESR_SHARED_API ESR_ReturnCode HashMapRemoveAtIndex(HashMap* self, const size_t index);
    208 /**
    209  * Removes all mappings from this map.
    210  *
    211  * @param self HashMap handle
    212  * @return ESR_INVALID_ARGUMENT if self is null
    213  */
    214 ESR_SHARED_API ESR_ReturnCode HashMapRemoveAll(HashMap* self);
    215 /**
    216  * Removes all mappings from this map and frees the values.
    217  *
    218  * @param self HashMap handle
    219  * @return ESR_INVALID_ARGUMENT if self is null
    220  */
    221 ESR_SHARED_API ESR_ReturnCode HashMapRemoveAndFreeAll(HashMap* self);
    222 /**
    223  * Indicates if element is contained within the list.
    224  *
    225  * @param self HashMap handle
    226  * @param key Key to check for
    227  * @param exists True if key was found
    228  * @return ESR_INVALID_ARGUMENT if self is null
    229  */
    230 ESR_SHARED_API ESR_ReturnCode HashMapContainsKey(HashMap* self, const LCHAR* key, ESR_BOOL* exists);
    231 /**
    232  * Returns the number of mappings contained in this map.
    233  *
    234  * @param self HashMap handle
    235  * @param size Returned size
    236  * @return ESR_INVALID_ARGUMENT if self is null
    237  */
    238 ESR_SHARED_API ESR_ReturnCode HashMapGetSize(HashMap* self, size_t* size);
    239 /**
    240  * Returns the value to which the specified key is mapped in this identity hash map,
    241  * or null if the map contains no mapping for this key.
    242  *
    243  * @param self HashMap handle
    244  * @param key the key whose associated value is to be returned.
    245  * @param value the value to which this map maps the specified key, or null if the
    246  *              map contains no mapping for this key.
    247  * @return ESR_INVALID_ARGUMENT if self is null; ESR_NO_MATCH_ERROR if key cannot be found
    248  */
    249 ESR_SHARED_API ESR_ReturnCode HashMapGet(HashMap* self, const LCHAR* key, void** value);
    250 /**
    251  * Returns the key at the specified index.
    252  *
    253  * @param self HashMap handle
    254  * @param index the key index
    255  * @param key the key at the specified index
    256  * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
    257  */
    258 ESR_SHARED_API ESR_ReturnCode HashMapGetKeyAtIndex(HashMap* self, const size_t index, LCHAR** key);
    259 /**
    260  * Returns the value at the specified index.
    261  *
    262  * @param self HashMap handle
    263  * @param index the key index
    264  * @param value the key at the specified index
    265  * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
    266  */
    267 ESR_SHARED_API ESR_ReturnCode HashMapGetValueAtIndex(HashMap* self, const size_t index, void** value);
    268 /**
    269  * Destroys an HashMap.
    270  *
    271  * @param self HashMap handle
    272  * @return ESR_INVALID_ARGUMENT if self is null
    273  */
    274 ESR_SHARED_API ESR_ReturnCode HashMapDestroy(HashMap* self);
    275 
    276 /**
    277  * @}
    278  */
    279 
    280 
    281 #endif /* __HASHMAP_H */
    282