Adaptive Framework  0.9.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
afw_array_template.h
Go to the documentation of this file.
1 // See the 'COPYING' file in the project root for licensing information.
2 /*
3  * Adaptive Framework Array Template Header
4  *
5  * Copyright (c) 2010-2023 Clemson University
6  *
7  */
8 
9 #ifndef __AFW_ARRAY_TEMPLATE_H__
10 #define __AFW_ARRAY_TEMPLATE_H__
11 
12 #include "afw_common.h"
13 
33 
99 #define AFW_ARRAY_TEMPLATE(_NAME, _ELEMENT_TYPE)\
100 \
101 typedef struct {\
102  apr_pool_t *pool;\
103  int elt_size;\
104  int nelts;\
105  int nalloc;\
106  _ELEMENT_TYPE *elts;\
107  } _NAME##_t;\
108 \
109 typedef struct {\
110  const _NAME##_t *list;\
111  int next_index;\
112  } _NAME##_iterator_t;\
113 \
114  AFW_STATIC_INLINE _NAME##_t * make_##_NAME(apr_pool_t *p, int nelts)\
115  {\
116  return (_NAME##_t(*))apr_array_make(p, nelts, sizeof(_ELEMENT_TYPE)); \
117  }\
118 \
119  AFW_STATIC_INLINE _ELEMENT_TYPE * push_##_NAME(_NAME##_t *array)\
120  {\
121  return (_ELEMENT_TYPE *)apr_array_push((apr_array_header_t *)array);\
122  }\
123 \
124  AFW_STATIC_INLINE _ELEMENT_TYPE * pop_##_NAME(_NAME##_t *array)\
125  {\
126  return (_ELEMENT_TYPE *)apr_array_pop((apr_array_header_t *)array);\
127  }\
128 \
129  AFW_STATIC_INLINE void clear_##_NAME(_NAME##_t *array)\
130  {\
131  apr_array_clear((apr_array_header_t *)array);\
132  }\
133  \
134  \
135 \
136  AFW_STATIC_INLINE _NAME##_iterator_t * make##_NAME##_iterator(apr_pool_t *p, const _NAME##_t *list)\
137  {\
138  _NAME##_iterator_t *iterator = (_NAME##_iterator_t (*))apr_pcalloc(p, sizeof(_NAME##_iterator_t));\
139  iterator->list = list;\
140  iterator->next_index = 0;\
141  return iterator;\
142  }\
143 \
144  AFW_STATIC_INLINE void initialize##_NAME##_iterator(_NAME##_iterator_t *iterator, const _NAME##_t *list)\
145  {\
146  iterator->list = list;\
147  iterator->next_index = 0;\
148  }\
149 \
150 AFW_STATIC_INLINE _ELEMENT_TYPE * first##_NAME##_iterator(_NAME##_iterator_t *iterator)\
151  {\
152  iterator->next_index = 1;\
153  return (iterator->list->elts);\
154  }\
155 \
156 AFW_STATIC_INLINE _ELEMENT_TYPE * next##_NAME##_iterator(_NAME##_iterator_t *iterator)\
157  {\
158  return (\
159  (iterator->next_index < iterator->list->nelts)\
160  ?iterator->list->elts+((iterator->next_index)++)\
161  :NULL\
162  );\
163  }\
164 \
165 AFW_STATIC_INLINE int isDone##_NAME##_iterator(_NAME##_iterator_t *iterator)\
166  {\
167  return (iterator->next_index >= iterator->list->nelts);\
168  }\
169 \
170 AFW_STATIC_INLINE _ELEMENT_TYPE * current##_NAME##_iterator(_NAME##_iterator_t *iterator)\
171  {\
172  return (\
173  (iterator->next_index < iterator->list->nelts)\
174  ?iterator->list->elts+(iterator->next_index)\
175  :NULL\
176  );\
177 }
178 
179 AFW_ARRAY_TEMPLATE(afw_u8z_array,
180  afw_utf8_z_t *)
181 
182 AFW_ARRAY_TEMPLATE(const_afw_u8z_array,
183  const afw_utf8_z_t *)
184 
185 AFW_ARRAY_TEMPLATE(afw_char_ptr_array,
186  char *)
187 
188 AFW_ARRAY_TEMPLATE(const_afw_char_ptr_array,
189  const char *)
190 
191 AFW_END_DECLARES
192 
195 #endif /* __AFW_ARRAY_TEMPLATE_H__ */
Adaptive Framework Common Header.
#define AFW_BEGIN_DECLARES
#define AFW_ARRAY_TEMPLATE(_NAME, _ELEMENT_TYPE)
Array template.
afw_utf8_octet_t afw_utf8_z_t
NFC normalized UTF-8 null terminated string.
Definition: afw_common.h:523