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 *
nxt_vector_remove_last(nxt_vector_t * vector)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