|
1.2.1
|
1#ifndef NAUGHTY_BUFFERS_ARRAY_GENERATOR_H
2#define NAUGHTY_BUFFERS_ARRAY_GENERATOR_H
76#include "naughty-buffers/buffer.h"
82#define NAUGHTY_BUFFERS_ARRAY_DECLARATION(__NB_ARRAY_TYPE__, __NB_ARRAY_BLOCK_TYPE__) \
83 struct __NB_ARRAY_TYPE__ { \
84 struct nb_buffer buffer; \
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 \
92 enum NB_ASSIGN_RESULT __NB_ARRAY_TYPE__##_assign( \
93 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ item \
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 \
98 enum NB_INSERT_RESULT __NB_ARRAY_TYPE__##_insert( \
99 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ item \
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 \
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);
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__)); \
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); \
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); \
131 enum NB_PUSH_RESULT __NB_ARRAY_TYPE__##_push_ptr( \
132 struct __NB_ARRAY_TYPE__ * array, const __NB_ARRAY_BLOCK_TYPE__ * item \
134 return nb_push(&array->buffer, (void *)item); \
136 enum NB_ASSIGN_RESULT __NB_ARRAY_TYPE__##_assign( \
137 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ item \
139 return nb_assign(&array->buffer, index, (void *)&item); \
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 \
144 return nb_assign(&array->buffer, index, (void *)item); \
147 enum NB_INSERT_RESULT __NB_ARRAY_TYPE__##_insert( \
148 struct __NB_ARRAY_TYPE__ * array, size_t index, const __NB_ARRAY_BLOCK_TYPE__ item \
150 return nb_insert(&array->buffer, index, (void *)&item); \
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 \
155 return nb_insert(&array->buffer, index, (void *)item); \
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); \
162 __NB_ARRAY_BLOCK_TYPE__ __NB_ARRAY_TYPE__##_front(struct __NB_ARRAY_TYPE__ * array) { \
163 return *__NB_ARRAY_TYPE__##_front_ptr(array); \
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); \
170 __NB_ARRAY_BLOCK_TYPE__ __NB_ARRAY_TYPE__##_back(struct __NB_ARRAY_TYPE__ * array) { \
171 return *__NB_ARRAY_TYPE__##_back_ptr(array); \
174 void __NB_ARRAY_TYPE__##_remove_at(struct __NB_ARRAY_TYPE__ * array, size_t index) { \
175 nb_remove_at(&array->buffer, index); \
178 void __NB_ARRAY_TYPE__##_remove_back(struct __NB_ARRAY_TYPE__ * array) { nb_remove_back(&array->buffer); } \
180 void __NB_ARRAY_TYPE__##_remove_front(struct __NB_ARRAY_TYPE__ * array) { nb_remove_front(&array->buffer); } \
182 size_t __NB_ARRAY_TYPE__##_count(struct __NB_ARRAY_TYPE__ * array) { return nb_block_count(&array->buffer); } \
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); \
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); \
192 void __NB_ARRAY_TYPE__##_sort(struct __NB_ARRAY_TYPE__ * array, nb_compare_fn compare_fn) { \
193 nb_sort(&array->buffer, compare_fn); \
196 void __NB_ARRAY_TYPE__##_release(struct __NB_ARRAY_TYPE__ * array) { nb_release(&array->buffer); }