1*0Sigor@sysoev.ru 2*0Sigor@sysoev.ru /* 3*0Sigor@sysoev.ru * Copyright (C) Igor Sysoev 4*0Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 5*0Sigor@sysoev.ru */ 6*0Sigor@sysoev.ru 7*0Sigor@sysoev.ru #ifndef _NXT_VECTOR_H_INCLUDED_ 8*0Sigor@sysoev.ru #define _NXT_VECTOR_H_INCLUDED_ 9*0Sigor@sysoev.ru 10*0Sigor@sysoev.ru 11*0Sigor@sysoev.ru typedef enum { 12*0Sigor@sysoev.ru NXT_VECTOR_INITED = 0, 13*0Sigor@sysoev.ru NXT_VECTOR_DESCRETE, 14*0Sigor@sysoev.ru NXT_VECTOR_EMBEDDED, 15*0Sigor@sysoev.ru } nxt_vector_type_t; 16*0Sigor@sysoev.ru 17*0Sigor@sysoev.ru 18*0Sigor@sysoev.ru typedef struct { 19*0Sigor@sysoev.ru void *start; 20*0Sigor@sysoev.ru /* 21*0Sigor@sysoev.ru * A vector can hold no more than 65536 items. 22*0Sigor@sysoev.ru * The item size is no more than 64K. 23*0Sigor@sysoev.ru */ 24*0Sigor@sysoev.ru uint16_t items; 25*0Sigor@sysoev.ru uint16_t avalaible; 26*0Sigor@sysoev.ru uint16_t item_size; 27*0Sigor@sysoev.ru nxt_vector_type_t type:8; 28*0Sigor@sysoev.ru } nxt_vector_t; 29*0Sigor@sysoev.ru 30*0Sigor@sysoev.ru 31*0Sigor@sysoev.ru NXT_EXPORT nxt_vector_t *nxt_vector_create(nxt_uint_t items, size_t item_size, 32*0Sigor@sysoev.ru const nxt_mem_proto_t *proto, void *pool); 33*0Sigor@sysoev.ru NXT_EXPORT void *nxt_vector_init(nxt_vector_t *vector, nxt_uint_t items, 34*0Sigor@sysoev.ru size_t item_size, const nxt_mem_proto_t *proto, void *pool); 35*0Sigor@sysoev.ru NXT_EXPORT void nxt_vector_destroy(nxt_vector_t *vector, 36*0Sigor@sysoev.ru const nxt_mem_proto_t *proto, void *pool); 37*0Sigor@sysoev.ru NXT_EXPORT void *nxt_vector_add(nxt_vector_t *vector, 38*0Sigor@sysoev.ru const nxt_mem_proto_t *proto, void *pool); 39*0Sigor@sysoev.ru NXT_EXPORT void *nxt_vector_zero_add(nxt_vector_t *vector, 40*0Sigor@sysoev.ru const nxt_mem_proto_t *proto, void *pool); 41*0Sigor@sysoev.ru NXT_EXPORT void nxt_vector_remove(nxt_vector_t *vector, void *item); 42*0Sigor@sysoev.ru 43*0Sigor@sysoev.ru 44*0Sigor@sysoev.ru #define \ 45*0Sigor@sysoev.ru nxt_vector_last(vector) \ 46*0Sigor@sysoev.ru ((void *) \ 47*0Sigor@sysoev.ru ((char *) (vector)->start \ 48*0Sigor@sysoev.ru + (vector)->item_size * ((vector)->items - 1))) 49*0Sigor@sysoev.ru 50*0Sigor@sysoev.ru 51*0Sigor@sysoev.ru #define \ 52*0Sigor@sysoev.ru nxt_vector_reset(vector) \ 53*0Sigor@sysoev.ru (vector)->items = 0; 54*0Sigor@sysoev.ru 55*0Sigor@sysoev.ru 56*0Sigor@sysoev.ru #define \ 57*0Sigor@sysoev.ru nxt_vector_is_empty(vector) \ 58*0Sigor@sysoev.ru ((vector)->items == 0) 59*0Sigor@sysoev.ru 60*0Sigor@sysoev.ru 61*0Sigor@sysoev.ru nxt_inline void * 62*0Sigor@sysoev.ru nxt_vector_remove_last(nxt_vector_t *vector) 63*0Sigor@sysoev.ru { 64*0Sigor@sysoev.ru vector->items--; 65*0Sigor@sysoev.ru return (char *) vector->start + vector->item_size * vector->items; 66*0Sigor@sysoev.ru } 67*0Sigor@sysoev.ru 68*0Sigor@sysoev.ru 69*0Sigor@sysoev.ru #endif /* _NXT_VECTOR_H_INCLUDED_ */ 70