/* Macrodefinitions to prepare custom GSA arrays with */
/**
- * struct gsa_array_field_t - Structure Representing Anchor of ustom GSA Array
+ * struct gsa_array_field_t - Structure Representing Anchor of custom GSA Array
* @items: pointer to array of pointers to individual items
* @count: number of items in the sorted array
* @alloc_count: allocated pointer array capacity
unsigned alloc_count;
} gsa_array_field_t;
+typedef struct gsa_static_array_field_t{
+ void * const *items;
+ unsigned count;
+} gsa_static_array_field_t;
+
void gsa_cust_init_array_field(gsa_array_field_t *array);
int gsa_cust_insert_at(gsa_array_field_t *array, void *item, unsigned where);
int gsa_cust_delete_at(gsa_array_field_t *array, unsigned indx);
+void gsa_cust_delete_all(gsa_array_field_t *array);
/* User must provide his/her own compare routine with
int cust_cmp_fnc(cust_key_t *a, cust_key_t *b) */
-/* Declaration of new custom array */
-#define GSA_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+/*** Base declaration of custom GSA array ***/
+#define GSA_BASE_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
cust_array_field, cust_item_key, cust_cmp_fnc) \
\
static inline cust_item_t * \
cust_prefix##_indx2key(const cust_array_t *array, unsigned indx)\
{ return &(cust_prefix##_indx2item(array, indx)->cust_item_key);}\
\
-int cust_prefix##_bsearch_indx(const cust_array_t *array, const cust_key_t *key, int mode, unsigned *indxp);\
-int cust_prefix##_insert(cust_array_t *array, cust_item_t *item);\
-int cust_prefix##_delete(cust_array_t *array, const cust_item_t *item);\
-\
-static inline void \
-cust_prefix##_init_array_field(cust_array_t *array)\
-{\
- gsa_cust_init_array_field(&array->cust_array_field);\
-}\
-\
-static inline int \
-cust_prefix##_insert_at(cust_array_t *array, cust_item_t *item, unsigned indx)\
-{\
- return gsa_cust_insert_at(&array->cust_array_field, item, indx);\
-}\
-\
-static inline int \
-cust_prefix##_delete_at(cust_array_t *array, unsigned indx)\
-{\
- return gsa_cust_delete_at(&array->cust_array_field, indx);\
-}\
+int cust_prefix##_bsearch_indx(const cust_array_t *array, cust_key_t const *key, int mode, unsigned *indxp);\
\
static inline cust_item_t *\
-cust_prefix##_at(cust_array_t *array, unsigned indx)\
+cust_prefix##_at(const cust_array_t *array, unsigned indx)\
{\
return cust_prefix##_indx2item(array, indx);\
}\
\
static inline cust_item_t *\
-cust_prefix##_find(const cust_array_t *array, cust_key_t *key)\
+cust_prefix##_find(const cust_array_t *array, cust_key_t const *key)\
{\
unsigned indx;\
if(!cust_prefix##_bsearch_indx(array, key, 0, &indx)) return NULL;\
}\
\
static inline cust_item_t *\
-cust_prefix##_find_first(const cust_array_t *array, cust_key_t *key)\
+cust_prefix##_find_first(const cust_array_t *array, cust_key_t const *key)\
{\
unsigned indx;\
if(!cust_prefix##_bsearch_indx(array, key, GSA_FFIRST, &indx)) return NULL;\
}\
\
static inline unsigned \
-cust_prefix##_find_first_indx(const cust_array_t *array, cust_key_t *key)\
+cust_prefix##_find_first_indx(const cust_array_t *array, cust_key_t const *key)\
{\
unsigned indx;\
if(!cust_prefix##_bsearch_indx(array, key, GSA_FFIRST, &indx)) return -1;\
}\
\
static inline cust_item_t *\
-cust_prefix##_find_after(const cust_array_t *array, cust_key_t *key)\
+cust_prefix##_find_after(const cust_array_t *array, cust_key_t const *key)\
{\
unsigned indx;\
if(!cust_prefix##_bsearch_indx(array, key, GSA_FAFTER, &indx)) return NULL;\
}\
\
static inline unsigned \
-cust_prefix##_find_after_indx(const cust_array_t *array, cust_key_t *key)\
+cust_prefix##_find_after_indx(const cust_array_t *array, cust_key_t const *key)\
{\
unsigned indx;\
cust_prefix##_bsearch_indx(array, key, GSA_FAFTER, &indx);\
}\
\
static inline cust_item_t *\
-cust_prefix##_cut_last(cust_array_t *array)\
-{\
- if(cust_prefix##_is_empty(array)) return NULL;\
- return (cust_item_t *)array->cust_array_field.items\
- [--array->cust_array_field.count];\
-}\
-\
-static inline cust_item_t *\
cust_prefix##_first(const cust_array_t *array)\
{\
return cust_prefix##_indx2item(array, 0);\
cust_prefix##_last_indx(const cust_array_t *array)\
{\
return array->cust_array_field.count-1;\
-}\
-/*** Iterators ***/\
+}
+
+/*** Iterators for GSA arrays ***/
+#define GSA_IT_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t) \
+\
typedef struct {\
cust_array_t *container;\
unsigned indx;\
return it->indx>cust_prefix##_last_indx(it->container);\
}\
\
-static inline void \
-cust_prefix##_delete_it(cust_prefix##_it_t *it)\
-{\
- cust_prefix##_delete_at(it->container,it->indx);\
-}\
-\
static inline int \
-cust_prefix##_find_it(cust_array_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
+cust_prefix##_find_it(cust_array_t *container, cust_key_t const *key, cust_prefix##_it_t *it)\
{\
it->container=container;\
return (it->indx=cust_prefix##_find_first_indx(container, key))!=(unsigned)-1;\
}\
\
static inline int \
-cust_prefix##_find_first_it(cust_array_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
+cust_prefix##_find_first_it(cust_array_t *container, cust_key_t const *key, cust_prefix##_it_t *it)\
{\
it->container=container;\
return (it->indx=cust_prefix##_find_first_indx(container, key))!=(unsigned)-1;\
}\
\
static inline int \
-cust_prefix##_find_after_it(cust_array_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
+cust_prefix##_find_after_it(cust_array_t *container, cust_key_t const *key, cust_prefix##_it_t *it)\
{\
it->container=container;\
return (it->indx=cust_prefix##_find_after_indx(container, key))!=(unsigned)-1;\
}
+/* Declaration of new const custom array without support of runtime modifications */
+#define GSA_CONST_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+ cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+GSA_BASE_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+ cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+GSA_IT_CUST_DEC(cust_prefix, const cust_array_t, cust_item_t, cust_key_t)
+
+/*** Declaration of dynamic custom array with full functions ***/
+#define GSA_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+ cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+GSA_BASE_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+ cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+int cust_prefix##_insert(cust_array_t *array, cust_item_t *item);\
+int cust_prefix##_delete(cust_array_t *array, const cust_item_t *item);\
+\
+static inline void \
+cust_prefix##_init_array_field(cust_array_t *array)\
+{\
+ gsa_cust_init_array_field(&array->cust_array_field);\
+}\
+\
+static inline int \
+cust_prefix##_insert_at(cust_array_t *array, cust_item_t *item, unsigned indx)\
+{\
+ return gsa_cust_insert_at(&array->cust_array_field, item, indx);\
+}\
+\
+static inline int \
+cust_prefix##_delete_at(cust_array_t *array, unsigned indx)\
+{\
+ return gsa_cust_delete_at(&array->cust_array_field, indx);\
+}\
+\
+static inline void \
+cust_prefix##_delete_all(cust_array_t *array)\
+{\
+ gsa_cust_delete_all(&array->cust_array_field);\
+}\
+\
+static inline cust_item_t *\
+cust_prefix##_cut_last(cust_array_t *array)\
+{\
+ if(cust_prefix##_is_empty(array)) return NULL;\
+ return (cust_item_t *)array->cust_array_field.items\
+ [--array->cust_array_field.count];\
+}\
+/*** Iterators ***/\
+GSA_IT_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t) \
+\
+static inline void \
+cust_prefix##_delete_it(cust_prefix##_it_t *it)\
+{\
+ cust_prefix##_delete_at(it->container,it->indx);\
+}\
+
+/*** Declaration of static custom array with limited functions ***/
+#define GSA_STATIC_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+ cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+GSA_BASE_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+ cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+int cust_prefix##_insert(cust_array_t *array, cust_item_t *item);\
+int cust_prefix##_delete(cust_array_t *array, const cust_item_t *item);\
+void cust_prefix##_init_array_field(cust_array_t *array);\
+int cust_prefix##_insert_at(cust_array_t *array, cust_item_t *item, unsigned indx);\
+int cust_prefix##_delete_at(cust_array_t *array, unsigned indx); \
+\
+static inline void \
+cust_prefix##_delete_all(cust_array_t *array)\
+{\
+ cust_prefix##_init_array_field(array);\
+}\
+\
+static inline cust_item_t *\
+cust_prefix##_cut_last(cust_array_t *array)\
+{\
+ if(cust_prefix##_is_empty(array)) return NULL;\
+ return (cust_item_t *)array->cust_array_field.items\
+ [--array->cust_array_field.count];\
+}\
+/*** Iterators ***/\
+GSA_IT_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t) \
+\
+static inline void \
+cust_prefix##_delete_it(cust_prefix##_it_t *it)\
+{\
+ cust_prefix##_delete_at(it->container,it->indx);\
+}\
+
+
/* The next implementation of foreaach is elegant, but can not
be used in C99 non-conformant C compiler */
#ifdef WITH_C99