blob: 128df3ba38c00662ea822bb6383fcf5c4f6510b4 [file] [log] [blame]
#ifndef __WDONG_ARRAY__
#define __WDONG_ARRAY__
#define ARRAY_DEFAULT_INC 256
#define ARRAY_TYPE(type) \
struct { \
cass_size_t inc; \
cass_size_t size; \
cass_size_t len; \
type *data; \
}
#define ARRAY_WRAPPER(data, len) {0, len, len, data}
#define ARRAY_SET_INC(array,_inc) \
do { \
/* assert(((_inc) & (_inc - 1)) == 0); */\
(array).inc = _inc; \
} while (0)
#define ARRAY_INIT(array) \
do { \
(array).inc = ARRAY_DEFAULT_INC;\
(array).size = 0; \
(array).len = 0; \
(array).data = NULL; \
} while (0)
#define ARRAY_INIT_SIZE(array,_size) \
do { \
(array).inc = ARRAY_DEFAULT_INC;\
(array).size = _size; \
(array).len = 0; \
(array).data = NULL; \
if (_size > 0){ \
(array).data = malloc(_size * sizeof(*(array).data));\
assert((array).data != NULL); \
} \
} while(0)
#define ARRAY_INIT_SIZE_PP(array, type, _size) \
do { \
(array).inc = ARRAY_DEFAULT_INC;\
(array).size = _size; \
(array).len = 0; \
(array).data = NULL; \
if (_size > 0){ \
(array).data = (type *)malloc(_size * sizeof(*(array).data));\
assert((array).data != NULL); \
} \
} while(0)
#define ARRAY_SIZE(array) \
((array).size)
#define ARRAY_INC(array) \
((array).inc)
#define ARRAY_RAW_SIZE(array) \
((cass_size_t)((array).len * sizeof(*(array).data)))
#define ARRAY_BEGIN_READ_RAW(array, _data, _len) \
do { _data = (array).data; _len = (array).len; } while(0)
#define ARRAY_END_READ_RAW(array)
#define ARRAY_BEGIN_WRITE_RAW(array, _data, _len) \
do { _data = (array).data; _len = (array).len; } while(0)
#define ARRAY_END_WRITE_RAW(array, _len) \
do {(array).len = _len; assert(_len <= (array).size); } while (0)
#define ARRAY_CLEANUP(array) \
do { if ((array).data != NULL) free((array).data); (array).data = NULL; (array).size = (array).len = 0; } while (0)
#define ARRAY_LEN(array) \
((array).len)
/*
#define ARRAY_GET(array,n) \
({ assert(n < (array).len); (array).data[n];})
*/
#define ARRAY_GET(array,n) \
((array).data[n])
#define ARRAY_SET(array,n,d) \
do { assert(n < (array).len); (array).data[n] = d; } while (0)
#define ARRAY_EXPAND(array,_size) \
do { \
if ((array).size >= _size) break;\
(array).size = _size; \
(array).size += (array).inc - 1;\
(array).size &= ~((array).inc - 1);\
if ((array).data != NULL) \
(array).data = realloc((array).data, (array).size * sizeof(*(array).data)); \
else \
(array).data = malloc((array).size * sizeof(*(array).data)); \
assert((array).data != NULL); \
} while(0)
#define ARRAY_APPEND(array,d) \
do { \
int len = (array).len; \
(array).len++; \
ARRAY_EXPAND(array,(array).len);\
(array).data[len] = d; \
} while(0)
#define ARRAY_APPEND_UNSAFE(array,d) \
do { \
(array).data[(array).len++] = d;\
} while (0)
#define ARRAY_TRUNC(array) \
do { \
(array).len = 0; \
} while(0)
#define ARRAY_MERGE(array1,array2) \
do { \
int len = (array1).len; \
assert(sizeof(*(array1).data) == sizeof(*(array2).data)); \
(array1).len += (array2).len; \
ARRAY_EXPAND(array1, ((array1).len)); \
memcpy((array1).data + len, (array2).data, ARRAY_RAW_SIZE(array2));\
} while (0)
#define ARRAY_MERGE_RAW(array1,data,_len) \
do { \
int len = (array1).len; \
assert(sizeof(*(array1).data) == sizeof(*data));\
(array1).len += _len / sizeof(*(array1).data); \
ARRAY_EXPAND(array1, ((array1).len)); \
memcpy((array1).data + len, data, _len * sizeof(*data));\
} while (0)
#define ARRAY_BEGIN_FOREACH(array, cursor) \
do { \
cass_size_t __array_foreach_index; \
for (__array_foreach_index = 0; __array_foreach_index < (array).len; __array_foreach_index++) { \
cursor = (array).data[__array_foreach_index];
#define ARRAY_END_FOREACH \
} \
} while (0);
#define ARRAY_BEGIN_FOREACH_P(array,cursor) \
do { \
cass_size_t __array_foreach_index; \
for (__array_foreach_index = 0; __array_foreach_index < (array).len; __array_foreach_index++) { \
cursor = (array).data + __array_foreach_index;
#define ARRAY_END_FOREACH_P \
} \
} while (0);
#endif