1538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
2538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *	Copyright (c) 2004-2010 Alex Pankratov. All rights reserved.
3538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *
4538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *	Hierarchical memory allocator, 1.2.1
5538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *	http://swapped.cc/halloc
6538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
7538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
8538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
9538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *	The program is distributed under terms of BSD license.
10538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *	You can obtain the copy of the license by visiting:
11538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *
12538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *	http://www.opensource.org/licenses/bsd-license.php
13538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
14538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
15538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#ifndef _LIBP_HLIST_H_
16538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define _LIBP_HLIST_H_
17538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
18538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <assert.h>
19538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "macros.h"  /* static_inline */
20538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
21538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
22538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *	weak double-linked list w/ tail sentinel
23538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct hlist_head  hlist_head_t;
25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubertypedef struct hlist_item  hlist_item_t;
26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
27538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *
29538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstruct hlist_head
31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
32538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	hlist_item_t * next;
33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstruct hlist_item
36538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
37538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	hlist_item_t * next;
38538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	hlist_item_t ** prev;
39538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
40538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
41538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *	shared tail sentinel
43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstruct hlist_item hlist_null;
45538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
46538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
47538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *
48538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
49538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define __hlist_init(h)      { &hlist_null }
50538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define __hlist_init_item(i) { &hlist_null, &(i).next }
51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_init(hlist_head_t * h);
53538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_init_item(hlist_item_t * i);
54538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
55538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline void hlist_purge(hlist_head_t * h); */
56538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
57538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline bool_t hlist_empty(const hlist_head_t * h); */
58538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline hlist_item_t * hlist_head(const hlist_head_t * h); */
60538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
61538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline hlist_item_t * hlist_next(const hlist_item_t * i); */
62538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline hlist_item_t * hlist_prev(const hlist_item_t * i,
63538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                                           const hlist_head_t * h); */
64538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_add(hlist_head_t * h, hlist_item_t * i);
66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
67538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline void hlist_add_prev(hlist_item_t * l, hlist_item_t * i); */
68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* static_inline void hlist_add_next(hlist_item_t * l, hlist_item_t * i); */
69538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
70538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_del(hlist_item_t * i);
71538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
72538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_relink(hlist_item_t * i);
73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_relink_head(hlist_head_t * h);
74538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
75538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define hlist_for_each(i, h) \
76538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	for (i = (h)->next; i != &hlist_null; i = i->next)
77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
78538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define hlist_for_each_safe(i, tmp, h) \
79538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	for (i = (h)->next, tmp = i->next; \
80538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	     i!= &hlist_null; \
81538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	     i = tmp, tmp = i->next)
82538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
83538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
84538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *	static
85538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
86538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_init(hlist_head_t * h)
87538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
88538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	assert(h);
89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	h->next = &hlist_null;
90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_init_item(hlist_item_t * i)
93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	assert(i);
95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	i->prev = &i->next;
96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	i->next = &hlist_null;
97538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_add(hlist_head_t * h, hlist_item_t * i)
100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
101538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	hlist_item_t * next;
102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	assert(h && i);
103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
104538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	next = i->next = h->next;
105538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	next->prev = &i->next;
106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	h->next = i;
107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	i->prev = &h->next;
108538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
110538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_del(hlist_item_t * i)
111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
112538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	hlist_item_t * next;
113538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	assert(i);
114538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	next = i->next;
116538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	next->prev = i->prev;
117538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	*i->prev = next;
118538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
119538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	hlist_init_item(i);
120538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
121538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
122538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_relink(hlist_item_t * i)
123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
124538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	assert(i);
125538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	*i->prev = i;
126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	i->next->prev = &i->next;
127538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
128538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
129538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic_inline void hlist_relink_head(hlist_head_t * h)
130538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
131538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	assert(h);
132538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber	h->next->prev = &h->next;
133538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
134538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
135538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif
136538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
137