1
0
Fork 0
xcache/util/xc_vector.h

57 lines
1.3 KiB
C
Raw Normal View History

#ifndef XC_VECTOR_H_0957AC4E1A44E838C7B8DBECFF9C4B3B
#define XC_VECTOR_H_0957AC4E1A44E838C7B8DBECFF9C4B3B
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
typedef struct {
zend_uint size;
zend_uint cnt;
void *data;
} xc_vector_t;
#define xc_vector_init(type, vector) do { \
(vector)->cnt = 0; \
(vector)->size = 0; \
(vector)->data = NULL; \
} while (0)
#define xc_vector_add(type, vector, value) do { \
if ((vector)->cnt == (vector)->size) { \
if ((vector)->size) { \
(vector)->size <<= 1; \
(vector)->data = erealloc((vector)->data, sizeof(type) * (vector)->size); \
} \
else { \
(vector)->size = 8; \
(vector)->data = emalloc(sizeof(type) * (vector)->size); \
} \
} \
((type *) (vector)->data)[(vector)->cnt++] = value; \
} while (0)
static inline void *xc_vector_detach_impl(xc_vector_t *vector)
{
void *data = vector->data;
vector->data = NULL;
vector->size = 0;
vector->cnt = 0;
return data;
}
#define xc_vector_detach(type, vector) ((type *) xc_vector_detach_impl(vector))
static inline void xc_vector_free_impl(xc_vector_t *vector TSRMLS_DC)
{
if (vector->data) {
efree(vector->data);
}
vector->size = 0;
vector->cnt = 0;
}
#define xc_vector_free(type, vector) xc_vector_free_impl(vector TSRMLS_CC)
#endif /* XC_VECTOR_H_0957AC4E1A44E838C7B8DBECFF9C4B3B */