1 #ifndef _LIBHX_DEQUE_H
2 #define _LIBHX_DEQUE_H 1
3 
4 #ifdef __cplusplus
5 #	include <cstdlib>
6 #else
7 #	include <stdlib.h>
8 #endif
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 struct HXdeque_node {
15 	struct HXdeque_node *next;
16 	union {
17 		void *ptr;
18 		char *sptr;
19 	};
20 	struct HXdeque *parent;
21 	struct HXdeque_node *prev;
22 };
23 
24 struct HXdeque {
25 	struct HXdeque_node *first;
26 	void *ptr;
27 	struct HXdeque_node *last;
28 	unsigned int items;
29 };
30 
31 extern struct HXdeque *HXdeque_init(void);
32 extern struct HXdeque_node *HXdeque_push(struct HXdeque *, const void *);
33 extern struct HXdeque_node *HXdeque_unshift(struct HXdeque *, const void *);
34 extern void *HXdeque_pop(struct HXdeque *);
35 extern void *HXdeque_shift(struct HXdeque *);
36 extern void HXdeque_move(struct HXdeque_node *, struct HXdeque_node *);
37 extern struct HXdeque_node *HXdeque_find(struct HXdeque *, const void *);
38 extern void *HXdeque_get(struct HXdeque *, const void *);
39 extern void *HXdeque_del(struct HXdeque_node *);
40 extern void HXdeque_free(struct HXdeque *);
41 extern void HXdeque_genocide2(struct HXdeque *, void (*)(void *));
42 extern void **HXdeque_to_vec(const struct HXdeque *, unsigned int *);
43 
HXdeque_genocide(struct HXdeque * dq)44 static __inline__ void HXdeque_genocide(struct HXdeque *dq)
45 {
46 	HXdeque_genocide2(dq, free);
47 }
48 
49 #ifdef __cplusplus
50 } /* extern "C" */
51 
52 extern "C++" {
53 
HXdeque_pop(struct HXdeque * dq)54 template<typename type> static __inline__ type HXdeque_pop(struct HXdeque *dq)
55 {
56 	return reinterpret_cast<type>(HXdeque_pop(dq));
57 }
58 
59 template<typename type> static __inline__ type
HXdeque_shift(struct HXdeque * dq)60 HXdeque_shift(struct HXdeque *dq)
61 {
62 	return reinterpret_cast<type>(HXdeque_shift(dq));
63 }
64 
65 template<typename type> static __inline__ type
HXdeque_get(struct HXdeque * dq,const void * ptr)66 HXdeque_get(struct HXdeque *dq, const void *ptr)
67 {
68 	return reinterpret_cast<type>(HXdeque_get(dq, ptr));
69 }
70 
71 template<typename type> static __inline__ type
HXdeque_del(struct HXdeque_node * nd)72 HXdeque_del(struct HXdeque_node *nd)
73 {
74 	return reinterpret_cast<type>(HXdeque_del(nd));
75 }
76 
77 template<typename type> static __inline__ type *
HXdeque_to_vec(struct HXdeque * dq,unsigned int * n)78 HXdeque_to_vec(struct HXdeque *dq, unsigned int *n)
79 {
80 	return reinterpret_cast<type *>(HXdeque_to_vec(dq, n));
81 }
82 
83 } /* extern "C++" */
84 #endif
85 
86 #endif /* _LIBHX_DEQUE_H */
87