Annotation of embedaddon/lighttpd/src/vector.h, revision 1.1

1.1     ! misho       1: #ifndef LI_VECTOR_H
        !             2: #define LI_VECTOR_H
        !             3: #include "first.h"
        !             4: 
        !             5: #ifndef SIZE_MAX
        !             6: # ifdef SIZE_T_MAX
        !             7: #  define SIZE_MAX SIZE_T_MAX
        !             8: # else
        !             9: #  define SIZE_MAX ((size_t)~0)
        !            10: # endif
        !            11: #endif
        !            12: 
        !            13: #include <stdlib.h>
        !            14: #include <string.h>
        !            15: 
        !            16: static inline size_t vector_align_size(size_t s) {
        !            17:        size_t a = (s + 16) & ((size_t)~15);
        !            18:        return (a < s) ? s : a;
        !            19: }
        !            20: 
        !            21: void *vector_realloc(void *data, size_t elem_size, size_t size, size_t used);
        !            22: 
        !            23: #define DEFINE_TYPED_VECTOR(name, entry, release) \
        !            24:        typedef struct vector_ ## name { \
        !            25:                entry* data; \
        !            26:                size_t used; \
        !            27:                size_t size; \
        !            28:        } vector_ ## name; \
        !            29:        static inline void vector_ ## name ## _init(vector_ ## name *v) { \
        !            30:                v->data = NULL; \
        !            31:                v->used = v->size = 0; \
        !            32:        } \
        !            33:        static inline vector_ ## name *vector_ ## name ## _alloc() { \
        !            34:                vector_ ## name *v = malloc(sizeof(*v)); \
        !            35:                force_assert(NULL != v); \
        !            36:                vector_ ## name ## _init(v); \
        !            37:                return v; \
        !            38:        } \
        !            39:        static inline void vector_ ## name ## _clear(vector_ ## name *v) { \
        !            40:                size_t ndx; \
        !            41:                vector_ ## name vcopy = *v; \
        !            42:                vector_ ## name ## _init(v); \
        !            43:                if (release) for (ndx = 0; ndx < vcopy.used; ++ndx) release(vcopy.data[ndx]); \
        !            44:                free(vcopy.data); \
        !            45:        } \
        !            46:        static inline void vector_ ## name ## _free(vector_ ## name *v) { \
        !            47:                if (NULL != v) { \
        !            48:                        vector_ ## name ## _clear(v); \
        !            49:                        free(v); \
        !            50:                } \
        !            51:        } \
        !            52:        static inline void vector_ ## name ## _reserve(vector_ ## name *v, size_t p) { \
        !            53:                force_assert(v->used < SIZE_MAX - p); \
        !            54:                if (v->size < v->used + p) { \
        !            55:                        v->size = vector_align_size(v->used + p); \
        !            56:                        v->data = vector_realloc(v->data, sizeof(entry), v->size, v->used); \
        !            57:                } \
        !            58:        } \
        !            59:        static inline void vector_ ## name ## _push(vector_ ## name *v, entry e) { \
        !            60:                vector_ ## name ## _reserve(v, 1); \
        !            61:                v->data[v->used++] = e; \
        !            62:        } \
        !            63:        static inline entry vector_ ## name ## _pop(vector_ ## name *v) { \
        !            64:                force_assert(v->used > 0); \
        !            65:                return v->data[--v->used]; \
        !            66:        } \
        !            67:        struct vector_ ## name /* expect trailing semicolon */ \
        !            68:        /* end of DEFINE_TYPED_VECTOR */
        !            69: 
        !            70: #define DEFINE_TYPED_VECTOR_NO_RELEASE(name, entry) \
        !            71:        DEFINE_TYPED_VECTOR(name, entry, ((void(*)(entry)) NULL)) \
        !            72:        /* end of DEFINE_TYPED_VECTOR_NO_RELEASE */
        !            73: 
        !            74: 
        !            75: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>