• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* Copyright (C) 2011 The Android Open Source Project
2  **
3  ** This software is licensed under the terms of the GNU General Public
4  ** License version 2, as published by the Free Software Foundation, and
5  ** may be copied, distributed, and modified under those terms.
6  **
7  ** This program is distributed in the hope that it will be useful,
8  ** but WITHOUT ANY WARRANTY; without even the implied warranty of
9  ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  ** GNU General Public License for more details.
11  */
12  #ifndef _ANDROID_UTILS_INTMAP_H
13  #define _ANDROID_UTILS_INTMAP_H
14  
15  /* A simple container that can hold a simple mapping from integers to
16   * references. I.e. a dictionary where keys are integers, and values
17   * are liberal pointer values (NULL is allowed).
18   */
19  
20  typedef struct AIntMap  AIntMap;
21  
22  /* Create new integer map */
23  AIntMap*  aintMap_new(void);
24  
25  /* Returns the number of keys stored in the map */
26  int       aintmap_getCount( AIntMap* map );
27  
28  /* Returns TRUE if the map has a value for the 'key'. Necessary because
29   * NULL is a valid value for the map.
30   */
31  int       aintmap_has( AIntMap*  map, int key );
32  
33  /* Get the value associated with a 'key', or NULL if not in map */
34  void*     aintMap_get( AIntMap*  map, int  key );
35  
36  /* Get the value associated with a 'key', or 'def' if not in map */
37  void*     aintMap_getWithDefault( AIntMap*  map, int key, void*  def );
38  
39  /* Set the value associated to a 'key', return the old value, if any, or NULL */
40  void*     aintMap_set( AIntMap* map, int key, void* value );
41  
42  /* Delete a given value associated to a 'key', return the old value, or NULL */
43  void*     aintMap_del( AIntMap* map, int key );
44  
45  /* Destroy a given integer map */
46  void      aintMap_free( AIntMap*  map );
47  
48  /* Integer map iterator. First call aintMapIterator_init(), then call
49   * aintMapIterator_next() until it returns 0. Then finish with
50   * aintMapIterator_done().
51   *
52   * Example:
53   *    AIntMapIterator  iter[1];
54   *    aintMapIterator_init(iter, map);
55   *    while (aintMapIterator_next(iter, &key, &value)) {
56   *        // do something
57   *    }
58   *    aintMapIterator_done(iter);
59   */
60  typedef struct AIntMapIterator {
61      int    key;
62      void*  value;
63      void*  magic[4];
64  } AIntMapIterator;
65  
66  /* Initialize iterator. Returns -1 if the map is empty, or 0 otherwise
67   * On success, the first (key,value) pair can be read from the iterator
68   * directly.
69   */
70  void aintMapIterator_init( AIntMapIterator* iter, AIntMap* map );
71  
72  /* Read the next (key,value) pair with an iterator, returns -1 when
73   * there isn't anything more, or 0 otherwise. On success, the key and
74   * value can be read directly from the iterator.
75   */
76  int  aintMapIterator_next( AIntMapIterator* iter );
77  
78  /* Finalize an iterator. This only needs to be called if you stop
79   * the iteration before aintMapIterator_init() or aintMapIterator_next()
80   * return -1.
81   */
82  void aintMapIterator_done( AIntMapIterator* iter );
83  
84  #define AINTMAP_FOREACH_KEY(map, keyvarname, stmnt) \
85      do { \
86          AIntMapIterator  __aintmap_foreach_iter[1]; \
87          aintMapIterator_init(__aintmap_foreach_iter, (map)); \
88          while (aintMapIterator_next(__aintmap_foreach_iter)) { \
89              int keyvarname = __aintmap_foreach_iter->key; \
90              stmnt; \
91          } \
92          aintMapIterator_done(__aintmap_foreach_iter); \
93      } while (0)
94  
95  #define AINTMAP_FOREACH_VALUE(map, valvarname, stmnt) \
96      do { \
97          AIntMapIterator  __aintmap_foreach_iter[1]; \
98          aintMapIterator_init(__aintmap_foreach_iter, (map)); \
99          while (aintMapIterator_next(__aintmap_foreach_iter)) { \
100              void* valvarname = __aintmap_foreach_iter->value; \
101              stmnt; \
102          } \
103          aintMapIterator_done(__aintmap_foreach_iter); \
104      } while (0)
105  
106  #endif /* _ANDROID_UTILS_INTMAP_H */
107