10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru #ifndef _NXT_VECTOR_H_INCLUDED_ 80Sigor@sysoev.ru #define _NXT_VECTOR_H_INCLUDED_ 90Sigor@sysoev.ru 100Sigor@sysoev.ru 110Sigor@sysoev.ru typedef enum { 120Sigor@sysoev.ru NXT_VECTOR_INITED = 0, 130Sigor@sysoev.ru NXT_VECTOR_DESCRETE, 140Sigor@sysoev.ru NXT_VECTOR_EMBEDDED, 150Sigor@sysoev.ru } nxt_vector_type_t; 160Sigor@sysoev.ru 170Sigor@sysoev.ru 180Sigor@sysoev.ru typedef struct { 190Sigor@sysoev.ru void *start; 200Sigor@sysoev.ru /* 210Sigor@sysoev.ru * A vector can hold no more than 65536 items. 220Sigor@sysoev.ru * The item size is no more than 64K. 230Sigor@sysoev.ru */ 240Sigor@sysoev.ru uint16_t items; 250Sigor@sysoev.ru uint16_t avalaible; 260Sigor@sysoev.ru uint16_t item_size; 270Sigor@sysoev.ru nxt_vector_type_t type:8; 280Sigor@sysoev.ru } nxt_vector_t; 290Sigor@sysoev.ru 300Sigor@sysoev.ru 310Sigor@sysoev.ru NXT_EXPORT nxt_vector_t *nxt_vector_create(nxt_uint_t items, size_t item_size, 320Sigor@sysoev.ru const nxt_mem_proto_t *proto, void *pool); 330Sigor@sysoev.ru NXT_EXPORT void *nxt_vector_init(nxt_vector_t *vector, nxt_uint_t items, 340Sigor@sysoev.ru size_t item_size, const nxt_mem_proto_t *proto, void *pool); 350Sigor@sysoev.ru NXT_EXPORT void nxt_vector_destroy(nxt_vector_t *vector, 360Sigor@sysoev.ru const nxt_mem_proto_t *proto, void *pool); 370Sigor@sysoev.ru NXT_EXPORT void *nxt_vector_add(nxt_vector_t *vector, 380Sigor@sysoev.ru const nxt_mem_proto_t *proto, void *pool); 390Sigor@sysoev.ru NXT_EXPORT void *nxt_vector_zero_add(nxt_vector_t *vector, 400Sigor@sysoev.ru const nxt_mem_proto_t *proto, void *pool); 410Sigor@sysoev.ru NXT_EXPORT void nxt_vector_remove(nxt_vector_t *vector, void *item); 420Sigor@sysoev.ru 430Sigor@sysoev.ru 44*2084Salx.manpages@gmail.com #define nxt_vector_last(vector) \ 4598Svbart@nginx.com nxt_pointer_to((vector)->start, \ 4698Svbart@nginx.com (vector)->item_size * ((vector)->items - 1)) 470Sigor@sysoev.ru 480Sigor@sysoev.ru 49*2084Salx.manpages@gmail.com #define nxt_vector_reset(vector) \ 500Sigor@sysoev.ru (vector)->items = 0; 510Sigor@sysoev.ru 520Sigor@sysoev.ru 53*2084Salx.manpages@gmail.com #define nxt_vector_is_empty(vector) \ 540Sigor@sysoev.ru ((vector)->items == 0) 550Sigor@sysoev.ru 560Sigor@sysoev.ru 570Sigor@sysoev.ru nxt_inline void * 580Sigor@sysoev.ru nxt_vector_remove_last(nxt_vector_t *vector) 590Sigor@sysoev.ru { 600Sigor@sysoev.ru vector->items--; 6198Svbart@nginx.com return nxt_pointer_to(vector->start, vector->item_size * vector->items); 620Sigor@sysoev.ru } 630Sigor@sysoev.ru 640Sigor@sysoev.ru 650Sigor@sysoev.ru #endif /* _NXT_VECTOR_H_INCLUDED_ */ 66