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 #ifndef UCX_LINKED_LIST_H
37 #define UCX_LINKED_LIST_H
38
39 #include "common.h"
40 #include "list.h"
41
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45
46
47
48
49 typedef struct cx_linked_list_s {
50
51 struct cx_list_s base;
52
53
54
55 off_t loc_prev;
56
57
58
59 off_t loc_next;
60
61
62
63 off_t loc_data;
64
65
66
67
68
69 off_t loc_extra;
70
71
72
73
74 size_t extra_data_len;
75
76
77
78 void *begin;
79
80
81
82 void *end;
83 } cx_linked_list;
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 cx_attr_nodiscard cx_attr_malloc cx_attr_dealloc(cxListFree,
1)
101 CX_EXPORT CxList *cxLinkedListCreate(
const CxAllocator *allocator,
102 cx_compare_func comparator,
size_t elem_size);
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 #define cxLinkedListCreateSimple(elem_size) \
119 cxLinkedListCreate(
NULL,
NULL, elem_size)
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 cx_attr_nonnull
136 CX_EXPORT void cx_linked_list_extra_data(cx_linked_list *list,
size_t len);
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 cx_attr_nonnull cx_attr_nodiscard
156 CX_EXPORT void *cx_linked_list_at(
const void *start,
size_t start_index,
157 ptrdiff_t loc_advance,
size_t index);
158
159
160
161
162
163
164
165
166
167
168
169
170
171 cx_attr_nonnull_arg(
1,
4,
5)
172 CX_EXPORT void *cx_linked_list_find(
const void *start,
ptrdiff_t loc_advance,
173 ptrdiff_t loc_data, cx_compare_func cmp_func,
const void *elem,
174 size_t *found_index);
175
176
177
178
179
180
181
182
183
184
185
186
187 cx_attr_nonnull cx_attr_returns_nonnull
188 CX_EXPORT void *cx_linked_list_first(
const void *node,
ptrdiff_t loc_prev);
189
190
191
192
193
194
195
196
197
198
199
200
201 cx_attr_nonnull cx_attr_returns_nonnull
202 CX_EXPORT void *cx_linked_list_last(
const void *node,
ptrdiff_t loc_next);
203
204
205
206
207
208
209
210
211
212
213
214 cx_attr_nonnull
215 CX_EXPORT void *cx_linked_list_prev(
const void *begin,
ptrdiff_t loc_next,
const void *node);
216
217
218
219
220
221
222
223
224
225
226
227
228
229 cx_attr_nonnull_arg(
5)
230 CX_EXPORT void cx_linked_list_add(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node);
231
232
233
234
235
236
237
238
239
240
241
242
243
244 cx_attr_nonnull_arg(
5)
245 CX_EXPORT void cx_linked_list_prepend(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node);
246
247
248
249
250
251
252
253
254
255 cx_attr_nonnull
256 CX_EXPORT void cx_linked_list_link(
void *left,
void *right,
ptrdiff_t loc_prev,
ptrdiff_t loc_next);
257
258
259
260
261
262
263
264
265
266
267
268 cx_attr_nonnull
269 CX_EXPORT void cx_linked_list_unlink(
void *left,
void *right,
ptrdiff_t loc_prev,
ptrdiff_t loc_next);
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285 cx_attr_nonnull_arg(
6)
286 CX_EXPORT void cx_linked_list_insert(
void **begin,
void **end,
287 ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node,
void *new_node);
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309 cx_attr_nonnull_arg(
6)
310 CX_EXPORT void cx_linked_list_insert_chain(
void **begin,
void **end,
311 ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node,
void *insert_begin,
void *insert_end);
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327 cx_attr_nonnull_arg(
1,
5,
6)
328 CX_EXPORT void cx_linked_list_insert_sorted(
void **begin,
void **end,
329 ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node, cx_compare_func cmp_func);
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350 cx_attr_nonnull_arg(
1,
5,
6)
351 CX_EXPORT void cx_linked_list_insert_sorted_chain(
void **begin,
void **end,
352 ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *insert_begin, cx_compare_func cmp_func);
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370 cx_attr_nonnull_arg(
1,
5,
6)
371 CX_EXPORT int cx_linked_list_insert_unique(
void **begin,
void **end,
372 ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *new_node, cx_compare_func cmp_func);
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392 cx_attr_nonnull_arg(
1,
5,
6) cx_attr_nodiscard
393 CX_EXPORT void *cx_linked_list_insert_unique_chain(
void **begin,
void **end,
394 ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *insert_begin, cx_compare_func cmp_func);
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417 cx_attr_nonnull_arg(
5)
418 CX_EXPORT size_t cx_linked_list_remove_chain(
void **begin,
void **end,
419 ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node,
size_t num);
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440 cx_attr_nonnull_arg(
5)
441 CX_EXPORT void cx_linked_list_remove(
void **begin,
void **end,
442 ptrdiff_t loc_prev,
ptrdiff_t loc_next,
void *node);
443
444
445
446
447
448
449
450
451 cx_attr_nodiscard
452 CX_EXPORT size_t cx_linked_list_size(
const void *node,
ptrdiff_t loc_next);
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476 cx_attr_nonnull_arg(
1,
6)
477 CX_EXPORT void cx_linked_list_sort(
void **begin,
void **end,
478 ptrdiff_t loc_prev,
ptrdiff_t loc_next,
ptrdiff_t loc_data, cx_compare_func cmp_func);
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494 cx_attr_nonnull_arg(
5)
495 CX_EXPORT int cx_linked_list_compare(
const void *begin_left,
const void *begin_right,
496 ptrdiff_t loc_advance,
ptrdiff_t loc_data, cx_compare_func cmp_func);
497
498
499
500
501
502
503
504
505
506 cx_attr_nonnull_arg(
1)
507 CX_EXPORT void cx_linked_list_reverse(
void **begin,
void **end,
ptrdiff_t loc_prev,
ptrdiff_t loc_next);
508
509 #ifdef __cplusplus
510 }
511 #endif
512
513 #endif
514