forked from bangoc/cgen
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgsl.h
84 lines (73 loc) · 1.87 KB
/
gsl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#ifndef GSL_H_
#define GSL_H_
/*
(C) Nguyen Ba Ngoc 2021
gtype single linked list
*/
#include "base/gtype.h"
typedef enum {
GSN_VALUE,
GSN_NEXT,
GSN_ELEMENTS
} gsn_elements;
typedef struct gsl_s {
gtype *front, *back;
gtype_free_t free_value;
} *gsl_t;
#define gsn_value(n) (*(n))
#define gsn_next(n) (((gtype*)(n) + GSN_NEXT)->g)
#define gsl_front(list) (list->front)
#define gsl_back(list) (list->back)
#define gsl_push_back(list, value) \
do { \
gtype *_node = malloc(GSN_ELEMENTS * sizeof(gtype)); \
gsn_value(_node) = (value); \
gsn_next(_node) = NULL; \
if (gsl_back(list)) { \
gsn_next(gsl_back(list)) = _node; \
gsl_back(list) = _node; \
} else { \
gsl_back(list) = gsl_front(list) = _node; \
} \
} while (0)
#define gsl_push_front(list, value) \
do { \
gtype *_node = malloc(GSN_ELEMENTS * sizeof(gtype)); \
gsn_value(_node) = (value); \
gsn_next(_node) = gsl_front(list); \
if (gsl_front(list)) { \
gsl_front(list) = _node; \
} else { \
gsl_front(list) = gsl_back(list) = _node; \
} \
} while (0)
#define gsl_pop_front(list) \
do { \
gtype *_front = gsl_front(list); \
gtype *_tmp = gsn_next(_front); \
if (list->free_value) { \
list->free_value(_front[GSN_VALUE]); \
} \
free(_front); \
gsl_front(list) = _tmp; \
if (!_tmp) { \
gsl_back(list) = NULL; \
} \
} while (0)
#define gsl_is_empty(list) (gsl_front(list) == NULL && gsl_back(list) == NULL)
#define gsl_clear(list) \
do {\
while (!gsl_is_empty(list)) { \
gsl_pop_front(list); \
} \
} while (0)
#define gsl_free(list) \
do {\
gsl_clear(list); \
free(list); \
} while (0)
#define gsl_traverse(cur, list) \
for (gtype *cur = gsl_front(list); cur; cur = gsn_next(cur))
gsl_t gsl_create(gtype_free_t free_value);
long gsl_size(gsl_t);
#endif // GSL_H_