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