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_LIST_H_INCLUDED_
80Sigor@sysoev.ru #define _NXT_LIST_H_INCLUDED_
90Sigor@sysoev.ru
100Sigor@sysoev.ru
110Sigor@sysoev.ru typedef struct nxt_list_part_s nxt_list_part_t;
120Sigor@sysoev.ru
130Sigor@sysoev.ru struct nxt_list_part_s {
140Sigor@sysoev.ru nxt_list_part_t *next;
150Sigor@sysoev.ru uintptr_t nelts;
16382Smax.romanov@nginx.com char data[];
170Sigor@sysoev.ru };
180Sigor@sysoev.ru
190Sigor@sysoev.ru
200Sigor@sysoev.ru typedef struct {
210Sigor@sysoev.ru nxt_list_part_t *last;
220Sigor@sysoev.ru #if (NXT_64BIT)
230Sigor@sysoev.ru uint32_t size;
240Sigor@sysoev.ru uint32_t nalloc;
250Sigor@sysoev.ru #else
260Sigor@sysoev.ru uint16_t size;
270Sigor@sysoev.ru uint16_t nalloc;
280Sigor@sysoev.ru #endif
2965Sigor@sysoev.ru nxt_mp_t *mem_pool;
300Sigor@sysoev.ru nxt_list_part_t part;
310Sigor@sysoev.ru } nxt_list_t;
320Sigor@sysoev.ru
330Sigor@sysoev.ru
340Sigor@sysoev.ru typedef struct {
350Sigor@sysoev.ru nxt_list_part_t *part;
360Sigor@sysoev.ru uintptr_t elt;
370Sigor@sysoev.ru } nxt_list_next_t;
380Sigor@sysoev.ru
390Sigor@sysoev.ru
40*2084Salx.manpages@gmail.com #define nxt_list_part(list) \
410Sigor@sysoev.ru (&(list)->part)
420Sigor@sysoev.ru
430Sigor@sysoev.ru
44*2084Salx.manpages@gmail.com #define nxt_list_data(part) \
45382Smax.romanov@nginx.com ((void *) part->data)
460Sigor@sysoev.ru
470Sigor@sysoev.ru
48*2084Salx.manpages@gmail.com #define nxt_list_first(list) \
49382Smax.romanov@nginx.com nxt_list_data(nxt_list_part(list))
500Sigor@sysoev.ru
510Sigor@sysoev.ru
520Sigor@sysoev.ru nxt_inline void *
nxt_list_elt(nxt_list_t * list,nxt_uint_t n)530Sigor@sysoev.ru nxt_list_elt(nxt_list_t *list, nxt_uint_t n)
540Sigor@sysoev.ru {
550Sigor@sysoev.ru nxt_list_part_t *part;
560Sigor@sysoev.ru
570Sigor@sysoev.ru if (nxt_fast_path((list) != NULL)) {
580Sigor@sysoev.ru part = nxt_list_part(list);
590Sigor@sysoev.ru
600Sigor@sysoev.ru while (part != NULL) {
610Sigor@sysoev.ru if (n < (nxt_uint_t) part->nelts) {
62108Sigor@sysoev.ru return nxt_pointer_to(nxt_list_data(part), n * (list)->size);
630Sigor@sysoev.ru }
640Sigor@sysoev.ru
650Sigor@sysoev.ru n -= (nxt_uint_t) part->nelts;
660Sigor@sysoev.ru part = part->next;
670Sigor@sysoev.ru }
680Sigor@sysoev.ru }
690Sigor@sysoev.ru
700Sigor@sysoev.ru return NULL;
710Sigor@sysoev.ru }
720Sigor@sysoev.ru
730Sigor@sysoev.ru
740Sigor@sysoev.ru #define nxt_list_each(elt, list) \
750Sigor@sysoev.ru do { \
7620Sigor@sysoev.ru if (nxt_fast_path((list) != NULL)) { \
770Sigor@sysoev.ru void *_end; \
780Sigor@sysoev.ru nxt_list_part_t *_part = nxt_list_part(list); \
790Sigor@sysoev.ru \
800Sigor@sysoev.ru do { \
81382Smax.romanov@nginx.com elt = nxt_list_data(_part); \
820Sigor@sysoev.ru \
830Sigor@sysoev.ru for (_end = (elt + _part->nelts); elt != _end; elt++) { \
840Sigor@sysoev.ru
850Sigor@sysoev.ru #define nxt_list_loop \
860Sigor@sysoev.ru } \
870Sigor@sysoev.ru \
880Sigor@sysoev.ru _part = _part->next; \
890Sigor@sysoev.ru \
900Sigor@sysoev.ru } while (_part != NULL); \
910Sigor@sysoev.ru } \
920Sigor@sysoev.ru } while (0)
930Sigor@sysoev.ru
940Sigor@sysoev.ru
9565Sigor@sysoev.ru NXT_EXPORT nxt_list_t *nxt_list_create(nxt_mp_t *mp, nxt_uint_t n, size_t size);
960Sigor@sysoev.ru NXT_EXPORT void *nxt_list_add(nxt_list_t *list);
970Sigor@sysoev.ru NXT_EXPORT void *nxt_list_zero_add(nxt_list_t *list);
980Sigor@sysoev.ru
990Sigor@sysoev.ru NXT_EXPORT void *nxt_list_next(nxt_list_t *list, nxt_list_next_t *next);
1000Sigor@sysoev.ru
1010Sigor@sysoev.ru
102*2084Salx.manpages@gmail.com #define nxt_list_next_value(list, next) \
103108Sigor@sysoev.ru (nxt_pointer_to(nxt_list_data((next)->part), (next)->elt * (list)->size))
1040Sigor@sysoev.ru
1050Sigor@sysoev.ru
1060Sigor@sysoev.ru nxt_inline nxt_uint_t
nxt_list_nelts(nxt_list_t * list)1070Sigor@sysoev.ru nxt_list_nelts(nxt_list_t *list)
1080Sigor@sysoev.ru {
1090Sigor@sysoev.ru nxt_uint_t n;
1100Sigor@sysoev.ru nxt_list_part_t *part;
1110Sigor@sysoev.ru
1120Sigor@sysoev.ru n = 0;
1130Sigor@sysoev.ru
1140Sigor@sysoev.ru if (nxt_fast_path((list) != NULL)) {
1150Sigor@sysoev.ru part = nxt_list_part(list);
1160Sigor@sysoev.ru
1170Sigor@sysoev.ru do {
1180Sigor@sysoev.ru n += (nxt_uint_t) part->nelts;
1190Sigor@sysoev.ru part = part->next;
1200Sigor@sysoev.ru } while (part != NULL);
1210Sigor@sysoev.ru }
1220Sigor@sysoev.ru
1230Sigor@sysoev.ru return n;
1240Sigor@sysoev.ru }
1250Sigor@sysoev.ru
1260Sigor@sysoev.ru
1270Sigor@sysoev.ru #endif /* _NXT_LIST_H_INCLUDED_ */
128