xref: /unit/src/nxt_vector.h (revision 2084:7d479274f334)
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