1.2.1
array-generator.h
1#ifndef NAUGHTY_BUFFERS_ARRAY_GENERATOR_H
2#define NAUGHTY_BUFFERS_ARRAY_GENERATOR_H
3
76#include "naughty-buffers/buffer.h"
77
82#define NAUGHTY_BUFFERS_ARRAY_DECLARATION(__NB_ARRAY_TYPE__, __NB_ARRAY_BLOCK_TYPE__) \
83 struct __NB_ARRAY_TYPE__ { \
84 struct nb_buffer buffer; \
85 }; \
86 void __NB_ARRAY_TYPE__##_init(struct __NB_ARRAY_TYPE__ * array); \
87 void __NB_ARRAY_TYPE__##_init_advanced(struct __NB_ARRAY_TYPE__ * array, struct nb_buffer_memory_context * ctx); \
88 enum NB_PUSH_RESULT __NB_ARRAY_TYPE__##_push(struct __NB_ARRAY_TYPE__ * array, const __NB_ARRAY_BLOCK_TYPE__ item); \
89 enum NB_PUSH_RESULT __NB_ARRAY_TYPE__##_push_ptr( \
90 struct __NB_ARRAY_TYPE__ * array, const __NB_ARRAY_BLOCK_TYPE__ * item \
91 ); \
92 enum NB_ASSIGN_RESULT __NB_ARRAY_TYPE__##_assign( \
93 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ item \
94 ); \
95 enum NB_ASSIGN_RESULT __NB_ARRAY_TYPE__##_assign_ptr( \
96 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ * item \
97 ); \
98 enum NB_INSERT_RESULT __NB_ARRAY_TYPE__##_insert( \
99 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ item \
100 ); \
101 enum NB_INSERT_RESULT __NB_ARRAY_TYPE__##_insert_ptr( \
102 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ * item \
103 ); \
104 size_t __NB_ARRAY_TYPE__##_count(struct __NB_ARRAY_TYPE__ * array); \
105 __NB_ARRAY_BLOCK_TYPE__ __NB_ARRAY_TYPE__##_at(struct __NB_ARRAY_TYPE__ * buffer, size_t index); \
106 __NB_ARRAY_BLOCK_TYPE__ * __NB_ARRAY_TYPE__##_at_ptr(struct __NB_ARRAY_TYPE__ * buffer, size_t index); \
107 __NB_ARRAY_BLOCK_TYPE__ * __NB_ARRAY_TYPE__##_front_ptr(struct __NB_ARRAY_TYPE__ * buffer); \
108 __NB_ARRAY_BLOCK_TYPE__ * __NB_ARRAY_TYPE__##_back_ptr(struct __NB_ARRAY_TYPE__ * buffer); \
109 __NB_ARRAY_BLOCK_TYPE__ __NB_ARRAY_TYPE__##_front(struct __NB_ARRAY_TYPE__ * buffer); \
110 __NB_ARRAY_BLOCK_TYPE__ __NB_ARRAY_TYPE__##_back(struct __NB_ARRAY_TYPE__ * buffer); \
111 void __NB_ARRAY_TYPE__##_remove_at(struct __NB_ARRAY_TYPE__ * buffer, size_t index); \
112 void __NB_ARRAY_TYPE__##_remove_front(struct __NB_ARRAY_TYPE__ * buffer); \
113 void __NB_ARRAY_TYPE__##_remove_back(struct __NB_ARRAY_TYPE__ * buffer); \
114 void __NB_ARRAY_TYPE__##_sort(struct __NB_ARRAY_TYPE__ * buffer, nb_compare_fn compare_fn); \
115 void __NB_ARRAY__TYPE__##_release(struct __NB_ARRAY_TYPE__ * array);
116
121#define NAUGHTY_BUFFERS_ARRAY_DEFINITION(__NB_ARRAY_TYPE__, __NB_ARRAY_BLOCK_TYPE__) \
122 void __NB_ARRAY_TYPE__##_init(struct __NB_ARRAY_TYPE__ * array) { \
123 nb_init(&array->buffer, sizeof(__NB_ARRAY_BLOCK_TYPE__)); \
124 } \
125 void __NB_ARRAY_TYPE__##_init_advanced(struct __NB_ARRAY_TYPE__ * array, struct nb_buffer_memory_context * ctx) { \
126 nb_init_advanced(&array->buffer, sizeof(__NB_ARRAY_BLOCK_TYPE__), ctx); \
127 } \
128 enum NB_PUSH_RESULT __NB_ARRAY_TYPE__##_push(struct __NB_ARRAY_TYPE__ * array, const __NB_ARRAY_BLOCK_TYPE__ item) { \
129 return nb_push(&array->buffer, (void *)&item); \
130 } \
131 enum NB_PUSH_RESULT __NB_ARRAY_TYPE__##_push_ptr( \
132 struct __NB_ARRAY_TYPE__ * array, const __NB_ARRAY_BLOCK_TYPE__ * item \
133 ) { \
134 return nb_push(&array->buffer, (void *)item); \
135 } \
136 enum NB_ASSIGN_RESULT __NB_ARRAY_TYPE__##_assign( \
137 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ item \
138 ) { \
139 return nb_assign(&array->buffer, index, (void *)&item); \
140 } \
141 enum NB_ASSIGN_RESULT __NB_ARRAY_TYPE__##_assign_ptr( \
142 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ * item \
143 ) { \
144 return nb_assign(&array->buffer, index, (void *)item); \
145 } \
146 \
147 enum NB_INSERT_RESULT __NB_ARRAY_TYPE__##_insert( \
148 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ item \
149 ) { \
150 return nb_insert(&array->buffer, index, (void *)&item); \
151 } \
152 enum NB_INSERT_RESULT __NB_ARRAY_TYPE__##_insert_ptr( \
153 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ * item \
154 ) { \
155 return nb_insert(&array->buffer, index, (void *)item); \
156 } \
157 \
158 __NB_ARRAY_BLOCK_TYPE__ * __NB_ARRAY_TYPE__##_front_ptr(struct __NB_ARRAY_TYPE__ * array) { \
159 return (__NB_ARRAY_BLOCK_TYPE__ *)nb_front(&array->buffer); \
160 } \
161 \
162 __NB_ARRAY_BLOCK_TYPE__ __NB_ARRAY_TYPE__##_front(struct __NB_ARRAY_TYPE__ * array) { \
163 return *__NB_ARRAY_TYPE__##_front_ptr(array); \
164 } \
165 \
166 __NB_ARRAY_BLOCK_TYPE__ * __NB_ARRAY_TYPE__##_back_ptr(struct __NB_ARRAY_TYPE__ * array) { \
167 return (__NB_ARRAY_BLOCK_TYPE__ *)nb_back(&array->buffer); \
168 } \
169 \
170 __NB_ARRAY_BLOCK_TYPE__ __NB_ARRAY_TYPE__##_back(struct __NB_ARRAY_TYPE__ * array) { \
171 return *__NB_ARRAY_TYPE__##_back_ptr(array); \
172 } \
173 \
174 void __NB_ARRAY_TYPE__##_remove_at(struct __NB_ARRAY_TYPE__ * array, size_t index) { \
175 nb_remove_at(&array->buffer, index); \
176 } \
177 \
178 void __NB_ARRAY_TYPE__##_remove_back(struct __NB_ARRAY_TYPE__ * array) { nb_remove_back(&array->buffer); } \
179 \
180 void __NB_ARRAY_TYPE__##_remove_front(struct __NB_ARRAY_TYPE__ * array) { nb_remove_front(&array->buffer); } \
181 \
182 size_t __NB_ARRAY_TYPE__##_count(struct __NB_ARRAY_TYPE__ * array) { return nb_block_count(&array->buffer); } \
183 \
184 __NB_ARRAY_BLOCK_TYPE__ * __NB_ARRAY_TYPE__##_at_ptr(struct __NB_ARRAY_TYPE__ * array, size_t index) { \
185 return (__NB_ARRAY_BLOCK_TYPE__ *)nb_at(&array->buffer, index); \
186 } \
187 \
188 __NB_ARRAY_BLOCK_TYPE__ __NB_ARRAY_TYPE__##_at(struct __NB_ARRAY_TYPE__ * buffer, size_t index) { \
189 return *__NB_ARRAY_TYPE__##_at_ptr(buffer, index); \
190 } \
191 \
192 void __NB_ARRAY_TYPE__##_sort(struct __NB_ARRAY_TYPE__ * array, nb_compare_fn compare_fn) { \
193 nb_sort(&array->buffer, compare_fn); \
194 } \
195 \
196 void __NB_ARRAY_TYPE__##_release(struct __NB_ARRAY_TYPE__ * array) { nb_release(&array->buffer); }
197
198#endif // NAUGHTY_BUFFERS_ARRAY_GENERATOR_H