00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00037 #ifndef __NUSMV_CORE_UTILS_ARRAY_H__
00038
00044 #define __NUSMV_CORE_UTILS_ARRAY_H__
00045
00046 #if HAVE_CONFIG_H
00047 # include "nusmv-config.h"
00048 #endif
00049
00050
00051
00057 #define ARRAY_OUT_OF_MEM -10000
00058
00059
00060 typedef struct array_t {
00061 char *space;
00062 int num;
00063 int n_size;
00064 int obj_size;
00065 int index;
00066 unsigned int e_index;
00067 int e_insert;
00068 } array_t;
00069
00075 array_t *array_do_alloc(int, int);
00076
00082 array_t *array_dup(array_t *);
00083
00089 array_t *array_join(array_t *, array_t *);
00090
00096 void array_free(array_t *);
00097
00103 int array_append(array_t *, array_t *);
00104
00113 void array_sort(array_t *, int (*)(const void*, const void*));
00114
00115
00121 void array_uniq(array_t* array,
00122 int (*compare)(char**, char**),
00123 void (*free_func)(char*));
00124
00130 int array_abort(const array_t *, int);
00131
00137 int array_resize(array_t *, int);
00138
00144 char *array_do_data(array_t *);
00145
00146
00147
00153 #define array_alloc(type, number) \
00154 array_do_alloc(sizeof(type), number)
00155
00161 #define array_insert(type, a, i, datum) \
00162 ( -(a)->index != sizeof(type) ? array_abort((a),4) : 0, \
00163 (a)->index = (i), \
00164 (a)->index < 0 ? array_abort((a),0) : 0, \
00165 (a)->index >= (a)->n_size ? \
00166 ((array_t*)a)->e_insert = array_resize(a, (a)->index + 1) : 0, \
00167 (a)->e_insert != ARRAY_OUT_OF_MEM ? \
00168 *((type *) ((a)->space + (a)->index * (a)->obj_size)) = datum : datum, \
00169 (a)->e_insert != ARRAY_OUT_OF_MEM ? \
00170 ((a)->index >= (a)->num ? (a)->num = (a)->index + 1 : 0) : 0, \
00171 (a)->e_insert != ARRAY_OUT_OF_MEM ? \
00172 ((a)->index = -(int)sizeof(type)) : ARRAY_OUT_OF_MEM )
00173
00179 #define array_insert_last(type, array, datum) \
00180 array_insert(type, array, (array)->num, datum)
00181
00182
00183
00184
00190 #define array_fetch(type, a, i) \
00191 (((array_t*)a)->e_index = (i), \
00192 nusmv_assert((a)->num >= 0), \
00193 (((a)->e_index) >= (a)->num) ? array_abort((a),1) : 0, \
00194 *((type *) ((a)->space + (a)->e_index * (a)->obj_size)))
00195
00201 #define array_fetch_p(type, a, i) \
00202 (((array_t*)a)->e_index = (i), \
00203 ((a)->e_index >= (a)->num) ? array_abort((a),1) : 0, \
00204 ((type *) ((a)->space + (a)->e_index * (a)->obj_size)))
00205
00211 #define array_fetch_last(type, array) \
00212 array_fetch(type, array, ((array)->num)-1)
00213
00219 #define array_fetch_last_p(type, array) \
00220 array_fetch_p(type, array, ((array)->num)-1)
00221
00227 #define array_n(array) \
00228 (array)->num
00229
00235 #define array_data(type, array) \
00236 (type *) array_do_data(array)
00237
00243 #define arrayForEachItem( \
00244 type, \
00245 array, \
00246 i, \
00247 data \
00248 ) \
00249 for((i) = 0; \
00250 (((i) < array_n((array))) \
00251 && (((data) = array_fetch(type, (array), (i))), 1)); \
00252 (i)++)
00253
00259 #define arrayForEachItemP( \
00260 type, \
00261 array, \
00262 i, \
00263 pdata \
00264 ) \
00265 for((i) = 0; \
00266 (((i) < array_n((array))) \
00267 && (((pdata) = array_fetch_p(type, (array), (i))), 1)); \
00268 (i)++)
00269
00270 #endif