aboutsummaryrefslogtreecommitdiff
path: root/array.h
diff options
context:
space:
mode:
Diffstat (limited to 'array.h')
-rw-r--r--array.h62
1 files changed, 42 insertions, 20 deletions
diff --git a/array.h b/array.h
index 3ea2057..5f2bff3 100644
--- a/array.h
+++ b/array.h
@@ -10,10 +10,10 @@ typedef struct {
} array_info;
array_info* array_new_(size_t item_size, size_t size);
-void array_resize(void* array, size_t size);
void array_print(void* array);
void array_pop(void* array);
void* array_add_(void* array, size_t item_size);
+void* array_resize_(void* array, size_t item_size, size_t size);
#define CONCAT_INNER(a, b) a ## b
#define CONCAT(a, b) CONCAT_INNER(a, b)
@@ -27,33 +27,55 @@ void* array_add_(void* array, size_t item_size);
(array) = NULL; \
} while (0)
-#define array_erase(array, index) do { \
- if ((index)) { \
- for (int __i = (index) - 1; __i < array_size((array)) - 1; __i++) \
- (array)[__i] = (array)[__i + 1]; \
- ((array_info*)(array))[-1].size--; \
- } \
+#define array_erase(array, index) do { \
+ if ((index)) { \
+ for (int __i = (index) - 1; __i < array_size((array)) - 1; __i++) \
+ (array)[__i] = (array)[__i + 1]; \
+ ((array_info*)(array))[-1].size--; \
+ } \
} while(0)
-#define array_insert(array, index, value) do { \
- void* __temp = array_add_((array), sizeof(*(array))); \
- (array) = __temp; \
- for (int __i = array_size((array)) - 1; __i > (index); __i--) \
- (array)[__i] = (array)[__i - 1]; \
- (array)[(index)] = value; \
-} while(0) \
+#define array_insert(array, index, value) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + 1); \
+ (array) = __temp; \
+ for (int __i = array_size((array)) - 1; __i > (index); __i--) \
+ (array)[__i] = (array)[__i - 1]; \
+ (array)[(index)] = value; \
+} while(0)
+
+#define array_insert_many(array, index, values, len) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + len); \
+ (array) = __temp; \
+ for (int __i = array_size((array)) - 1; __i > (index) + len; __i--) \
+ (array)[__i] = (array)[__i - len]; \
+ memcpy(&array[(index)], (values), len * sizeof(*(array))) \
+} while (0)
+
+#define array_insert_str(array, index, values) array_insert_many((array), (index), (values), strlen(values))
+#define array_add_many(array, index, values, len) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + len); \
+ (array) = __temp; \
+ memcpy(&array[array_size((array)) - 1], (values), len * sizeof(*(array))) \
+} while (0)
+
+#define array_add_str(array, index, values) array_add_many((array), (index), (values), strlen(values))
+
+#define array_resize(array, size) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), size); \
+ (array) = __temp; \
+} while (0)
-#define array_add(array, value) do { \
- void* __temp = array_add_((array), sizeof(*(array))); \
- (array) = __temp; \
- (array)[array_size((array)) - 1] = value; \
+#define array_add(array, value) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + 1); \
+ (array) = __temp; \
+ (array)[array_size((array)) - 1] = value; \
} while (0)
#define array_last(array) (array)[array_size(array) - 1]
-#define array_for_all(type__, name__, array__) \
-type__* CONCAT(it__, __LINE__) = array__; type__* CONCAT(end__, __LINE__) = array__ ? array__ + array_size(array__) : NULL; \
+#define array_for_all(type__, name__, array__) \
+type__* CONCAT(it__, __LINE__) = array__; type__* CONCAT(end__, __LINE__) = array__ ? array__ + array_size(array__) : NULL; \
for (type__* name__; (CONCAT(it__, __LINE__) < CONCAT(end__, __LINE__)) ? (name__ = CONCAT(it__, __LINE__), true) : false; CONCAT(it__, __LINE__)++)
#endif // ARRAY_H_