From bbb81047a39e39021b3b10e2d86af146d514bf8c Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Thu, 17 Mar 2011 14:48:44 +0100 Subject: Add which implements an integer-keyed map of pointers. This will be used later to support QEMUD fast pipes. --- android/utils/intmap.h | 106 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 android/utils/intmap.h (limited to 'android/utils/intmap.h') diff --git a/android/utils/intmap.h b/android/utils/intmap.h new file mode 100644 index 0000000..6fd450a --- /dev/null +++ b/android/utils/intmap.h @@ -0,0 +1,106 @@ +/* Copyright (C) 2011 The Android Open Source Project +** +** This software is licensed under the terms of the GNU General Public +** License version 2, as published by the Free Software Foundation, and +** may be copied, distributed, and modified under those terms. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +*/ +#ifndef _ANDROID_UTILS_INTMAP_H +#define _ANDROID_UTILS_INTMAP_H + +/* A simple container that can hold a simple mapping from integers to + * references. I.e. a dictionary where keys are integers, and values + * are liberal pointer values (NULL is allowed). + */ + +typedef struct AIntMap AIntMap; + +/* Create new integer map */ +AIntMap* aintMap_new(void); + +/* Returns the number of keys stored in the map */ +int aintmap_getCount( AIntMap* map ); + +/* Returns TRUE if the map has a value for the 'key'. Necessary because + * NULL is a valid value for the map. + */ +int aintmap_has( AIntMap* map, int key ); + +/* Get the value associated with a 'key', or NULL if not in map */ +void* aintMap_get( AIntMap* map, int key ); + +/* Get the value associated with a 'key', or 'def' if not in map */ +void* aintMap_getWithDefault( AIntMap* map, int key, void* def ); + +/* Set the value associated to a 'key', return the old value, if any, or NULL */ +void* aintMap_set( AIntMap* map, int key, void* value ); + +/* Delete a given value associated to a 'key', return the old value, or NULL */ +void* aintMap_del( AIntMap* map, int key ); + +/* Destroy a given integer map */ +void aintMap_free( AIntMap* map ); + +/* Integer map iterator. First call aintMapIterator_init(), then call + * aintMapIterator_next() until it returns 0. Then finish with + * aintMapIterator_done(). + * + * Example: + * AIntMapIterator iter[1]; + * aintMapIterator_init(iter, map); + * while (aintMapIterator_next(iter, &key, &value)) { + * // do something + * } + * aintMapIterator_done(iter); + */ +typedef struct AIntMapIterator { + int key; + void* value; + void* magic[4]; +} AIntMapIterator; + +/* Initialize iterator. Returns -1 if the map is empty, or 0 otherwise + * On success, the first (key,value) pair can be read from the iterator + * directly. + */ +void aintMapIterator_init( AIntMapIterator* iter, AIntMap* map ); + +/* Read the next (key,value) pair with an iterator, returns -1 when + * there isn't anything more, or 0 otherwise. On success, the key and + * value can be read directly from the iterator. + */ +int aintMapIterator_next( AIntMapIterator* iter ); + +/* Finalize an iterator. This only needs to be called if you stop + * the iteration before aintMapIterator_init() or aintMapIterator_next() + * return -1. + */ +void aintMapIterator_done( AIntMapIterator* iter ); + +#define AINTMAP_FOREACH_KEY(map, keyvarname, stmnt) \ + do { \ + AIntMapIterator __aintmap_foreach_iter[1]; \ + aintMapIterator_init(__aintmap_foreach_iter, (map)); \ + while (aintMapIterator_next(__aintmap_foreach_iter)) { \ + int keyvarname = __aintmap_foreach_iter->key; \ + stmnt; \ + } \ + aintMapIterator_done(__aintmap_foreach_iter); \ + } while (0) + +#define AINTMAP_FOREACH_VALUE(map, valvarname, stmnt) \ + do { \ + AIntMapIterator __aintmap_foreach_iter[1]; \ + aintMapIterator_init(__aintmap_foreach_iter, (map)); \ + while (aintMapIterator_next(__aintmap_foreach_iter)) { \ + void* valvarname = __aintmap_foreach_iter->value; \ + stmnt; \ + } \ + aintMapIterator_done(__aintmap_foreach_iter); \ + } while (0) + +#endif /* _ANDROID_UTILS_INTMAP_H */ -- cgit v1.1