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