Skip to content

Commit 2d6f5e6

Browse files
committed
Add insert_after and unshift
1 parent 085c689 commit 2d6f5e6

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

klist.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@
116116
kmp_free(name, kl->mp, p); \
117117
return 0; \
118118
} \
119+
static inline kltype_t *kl_unshiftp_##name(kl_##name##_t *kl) { \
120+
kl1_##name *q, *p = kmp_alloc(name, kl->mp); \
121+
q = kl->head; p->next = q; kl->head = p; \
122+
++kl->size; \
123+
return &p->data; \
124+
} \
119125
static inline int kl_delete_after_##name(kl_##name##_t *kl, \
120126
kl1_##name *c, \
121127
kltype_t *d) { \
@@ -127,6 +133,14 @@
127133
if (d) *d = p->data; \
128134
kmp_free(name, kl->mp, p); \
129135
return 0; \
136+
} \
137+
static inline kltype_t *kl_insertp_after_##name(kl_##name##_t *kl, \
138+
kl1_##name *c) { \
139+
if (c->next == 0) return 0; \
140+
kl1_##name *p = kmp_alloc(name, kl->mp); \
141+
p->next = c->next; c->next = p; \
142+
++kl->size; \
143+
return &p->data; \
130144
}
131145

132146
#define KLIST_INIT(name, kltype_t, kmpfree_t) \
@@ -143,6 +157,9 @@
143157
#define kl_destroy(name, kl) kl_destroy_##name(kl)
144158
#define kl_pushp(name, kl) kl_pushp_##name(kl)
145159
#define kl_shift(name, kl, d) kl_shift_##name(kl, d)
160+
#define kl_unshiftp(name, kl) kl_unshiftp_##name(kl)
161+
146162
#define kl_delete_after(name, kl, iter, d) kl_delete_after_##name(kl, iter, d)
163+
#define kl_insertp_after(name, kl, iter) kl_insertp_after_##name(kl, iter)
147164

148165
#endif

test/klist_test.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ int main()
1212
*kl_pushp(32, kl) = 1;
1313
*kl_pushp(32, kl) = 10;
1414
*kl_pushp(32, kl) = 19;
15+
*kl_pushp(32, kl) = 28;
1516
kl_shift(32, kl, 0);
1617
kl_delete_after(32, kl, kl_begin(kl), 0);
18+
*kl_unshiftp(32, kl) = 37;
19+
*kl_insertp_after(32, kl, kl_begin(kl)) = 46;
1720
for (p = kl_begin(kl); p != kl_end(kl); p = kl_next(p))
1821
printf("%d\n", kl_val(p));
1922
kl_destroy(32, kl);

0 commit comments

Comments
 (0)