diff options
author | Tavian Barnes <tavianator@gmail.com> | 2010-05-08 23:21:48 -0600 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2010-05-08 23:21:48 -0600 |
commit | 7a21db5914dd7a5666e603d66ed3948b659ba2fc (patch) | |
tree | bde8e00a1677ba865adae8a82780d1cc832ece8e /libdimension/dimension | |
parent | 152362a57dc7fe9dce830ef69118984f854d6375 (diff) | |
download | dimension-7a21db5914dd7a5666e603d66ed3948b659ba2fc.tar.xz |
New DMNSN_ARRAY_FOREACH() macro, faster than iterating with dmnsn_array_get().
Diffstat (limited to 'libdimension/dimension')
-rw-r--r-- | libdimension/dimension/array.h | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/libdimension/dimension/array.h b/libdimension/dimension/array.h index e3dc7b4..afd5e16 100644 --- a/libdimension/dimension/array.h +++ b/libdimension/dimension/array.h @@ -100,7 +100,21 @@ dmnsn_array_set(dmnsn_array *array, size_t i, const void *obj) memcpy((char *)array->ptr + array->obj_size*i, obj, array->obj_size); } -/* Element access */ +/* First element */ +DMNSN_INLINE void * +dmnsn_array_first(const dmnsn_array *array) +{ + return array->ptr; +} + +/* Last element */ +DMNSN_INLINE void * +dmnsn_array_last(const dmnsn_array *array) +{ + return (char *)array->ptr + array->obj_size*(array->length - 1); +} + +/* Arbitrary element access */ DMNSN_INLINE void * dmnsn_array_at(const dmnsn_array *array, size_t i) { @@ -156,4 +170,10 @@ dmnsn_array_remove(dmnsn_array *array, size_t i) dmnsn_array_resize(array, size - 1); } +/* Macro to shorten array iteration */ +#define DMNSN_ARRAY_FOREACH(type, i, array) \ + for (type i = dmnsn_array_first(array); \ + i <= (type)dmnsn_array_last(array); \ + ++i) + #endif /* DIMENSION_ARRAY_H */ |