Blender V5.0
BLI_listbase.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
10
11#include <cstddef>
12
13#include "BLI_compiler_attrs.h"
14#include "BLI_compiler_compat.h"
15
16#include "DNA_listBase.h"
17
21int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT
22 ATTR_NONNULL(1);
27int BLI_findstringindex(const ListBase *listbase,
28 const char *id,
30
35
36/* Find forwards. */
37
41void *BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
42
48
53void *BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT
54 ATTR_NONNULL(1);
59void *BLI_listbase_findafter_string(Link *link, const char *id, int offset) ATTR_WARN_UNUSED_RESULT
60 ATTR_NONNULL(1);
65void *BLI_findstring_ptr(const ListBase *listbase,
66 const char *id,
72void *BLI_listbase_findafter_string_ptr(Link *link, const char *id, int offset);
73
78void *BLI_findptr(const struct ListBase *listbase,
79 const void *ptr,
85void *BLI_listbase_bytes_find(const ListBase *listbase,
86 const void *bytes,
87 size_t bytes_size,
88 int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
97 const char *string,
98 size_t string_offset,
100
101/* Find backwards. */
102
106void *BLI_rfindlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
111void *BLI_rfindstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT
112 ATTR_NONNULL(1);
117void *BLI_rfindstring_ptr(const ListBase *listbase,
118 const char *id,
124void *BLI_rfindptr(const ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT
125 ATTR_NONNULL(1);
130void *BLI_listbase_bytes_rfind(const ListBase *listbase,
131 const void *bytes,
132 size_t bytes_size,
133 int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
134
138void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1);
142void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1);
148void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1);
152bool BLI_remlink_safe(ListBase *listbase, void *vlink) ATTR_NONNULL(1);
156void *BLI_pophead(ListBase *listbase) ATTR_NONNULL(1);
160void *BLI_poptail(ListBase *listbase) ATTR_NONNULL(1);
161
165void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1);
170void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1);
175void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1);
183void BLI_insertlinkreplace(ListBase *listbase, void *vreplacelink, void *vnewlink)
184 ATTR_NONNULL(1, 2, 3);
190void BLI_listbase_sort(ListBase *listbase, int (*cmp)(const void *, const void *))
191 ATTR_NONNULL(1, 2);
193 int (*cmp)(void *, const void *, const void *),
194 void *thunk) ATTR_NONNULL(1, 2);
203bool BLI_listbase_link_move(ListBase *listbase, void *vlink, int step) ATTR_NONNULL();
209bool BLI_listbase_move_index(ListBase *listbase, int from, int to) ATTR_NONNULL();
213void BLI_freelist(ListBase *listbase) ATTR_NONNULL(1);
219int BLI_listbase_count_at_most(const ListBase *listbase, int count_max) ATTR_WARN_UNUSED_RESULT
220 ATTR_NONNULL(1);
226BLI_INLINE bool BLI_listbase_count_is_equal_to(const ListBase *listbase, const int count_cmp)
227{
228 return BLI_listbase_count_at_most(listbase, count_cmp + 1) == count_cmp;
229}
230
238void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1);
239
243void BLI_listbase_swaplinks(ListBase *listbase, void *vlinka, void *vlinkb) ATTR_NONNULL(1, 2);
248void BLI_listbases_swaplinks(ListBase *listbasea, ListBase *listbaseb, void *vlinka, void *vlinkb)
249 ATTR_NONNULL(2, 3);
250
266void BLI_listbase_split_after(ListBase *original_listbase, ListBase *split_listbase, void *vlink)
267 ATTR_NONNULL(1, 2);
271void BLI_duplicatelist(ListBase *dst, const ListBase *src) ATTR_NONNULL(1, 2);
280void BLI_listbase_rotate_last(ListBase *lb, void *vlink) ATTR_NONNULL(1, 2);
281
286{
287 return (lb->first && lb->first == lb->last);
288}
290{
291 return (lb->first == (void *)nullptr);
292}
294{
295 lb->first = lb->last = (void *)nullptr;
296}
297
303
311{
312 if (a == nullptr) {
313 return b == nullptr;
314 }
315 if (b == nullptr) {
316 return false;
317 }
318 return a->first == b->first && a->last == b->last;
319}
320
325
340#define LISTBASE_CIRCULAR_FORWARD_BEGIN(type, lb, lb_iter, lb_init) \
341 if ((lb)->first && (lb_init || (lb_init = (type)(lb)->first))) { \
342 lb_iter = (type)(lb_init); \
343 do {
344#define LISTBASE_CIRCULAR_FORWARD_END(type, lb, lb_iter, lb_init) \
345 } \
346 while ((lb_iter = (lb_iter)->next ? (type)(lb_iter)->next : (type)(lb)->first), \
347 (lb_iter != lb_init)) \
348 ; \
349 } \
350 ((void)0)
351
352#define LISTBASE_CIRCULAR_BACKWARD_BEGIN(type, lb, lb_iter, lb_init) \
353 if ((lb)->last && (lb_init || (lb_init = (type)(lb)->last))) { \
354 lb_iter = lb_init; \
355 do {
356#define LISTBASE_CIRCULAR_BACKWARD_END(type, lb, lb_iter, lb_init) \
357 } \
358 while ((lb_iter = (lb_iter)->prev ? (lb_iter)->prev : (type)(lb)->last), (lb_iter != lb_init)) \
359 ; \
360 } \
361 ((void)0)
362
363#define LISTBASE_FOREACH(type, var, list) \
364 for (type var = (type)((list)->first); var != nullptr; var = (type)(((Link *)(var))->next))
365
371#define LISTBASE_FOREACH_INDEX(type, var, list, index_var) \
372 for (type var = (((void)(index_var = 0)), (type)((list)->first)); var != nullptr; \
373 var = (type)(((Link *)(var))->next), index_var++)
374
375#define LISTBASE_FOREACH_BACKWARD(type, var, list) \
376 for (type var = (type)((list)->last); var != nullptr; var = (type)(((Link *)(var))->prev))
377
381#define LISTBASE_FOREACH_MUTABLE(type, var, list) \
382 for (type var = (type)((list)->first), *var##_iter_next; \
383 ((var != nullptr) ? ((void)(var##_iter_next = (type)(((Link *)(var))->next)), 1) : 0); \
384 var = var##_iter_next)
385
389#define LISTBASE_FOREACH_BACKWARD_MUTABLE(type, var, list) \
390 for (type var = (type)((list)->last), *var##_iter_prev; \
391 ((var != nullptr) ? ((void)(var##_iter_prev = (type)(((Link *)(var))->prev)), 1) : 0); \
392 var = var##_iter_prev)
393
395{
396 return BLI_listbase_equal(&a, &b);
397}
399{
400 return !(a == b);
401}
402
403template<typename T, typename Fn> T *BLI_listbase_find(const ListBase &listbase, Fn &&predicate)
404{
405 LISTBASE_FOREACH (T *, link, &listbase) {
406 const T &value = *static_cast<const T *>(link);
407 if (predicate(value)) {
408 return link;
409 }
410 }
411 return nullptr;
412}
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_NONNULL(...)
#define BLI_INLINE
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:586
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:534
void void void BLI_movelisttolist(ListBase *dst, ListBase *src) ATTR_NONNULL(1
void * BLI_rfindptr(const ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:711
LinkData * BLI_genericNodeN(void *data)
Definition listbase.cc:922
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
bool BLI_listbase_move_index(ListBase *listbase, int from, int to) ATTR_NONNULL()
Definition listbase.cc:467
void void void void BLI_movelisttolist_reverse(ListBase *dst, ListBase *src) ATTR_NONNULL(1
void void * BLI_listbase_string_or_index_find(const ListBase *listbase, const char *string, size_t string_offset, int index) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:754
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:608
void * BLI_poptail(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:261
void * BLI_rfindlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:549
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void void BLI_listbases_swaplinks(ListBase *listbasea, ListBase *listbaseb, void *vlinka, void *vlinkb) ATTR_NONNULL(2
void BLI_insertlinkreplace(ListBase *listbase, void *vreplacelink, void *vnewlink) ATTR_NONNULL(1
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:270
BLI_INLINE bool operator==(const ListBase &a, const ListBase &b)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:497
void * BLI_listbase_findafter_string_ptr(Link *link, const char *id, int offset)
Definition listbase.cc:684
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:111
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:332
void BLI_listbase_rotate_first(ListBase *lb, void *vlink) ATTR_NONNULL(1
int BLI_listbase_count_at_most(const ListBase *listbase, int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:511
void * BLI_rfindstring_ptr(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:666
T * BLI_listbase_find(const ListBase &listbase, Fn &&predicate)
BLI_INLINE bool operator!=(const ListBase &a, const ListBase &b)
void void BLI_listbase_rotate_last(ListBase *lb, void *vlink) ATTR_NONNULL(1
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:131
void BLI_freelist(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:483
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:91
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_listbase_swaplinks(ListBase *listbase, void *vlinka, void *vlinkb) ATTR_NONNULL(1
void void void bool BLI_listbase_link_move(ListBase *listbase, void *vlink, int step) ATTR_NONNULL()
Definition listbase.cc:436
int BLI_findstringindex(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:780
ListBase BLI_listbase_from_link(Link *some_link)
Definition listbase.cc:800
void void BLI_listbase_sort(ListBase *listbase, int(*cmp)(const void *, const void *)) ATTR_NONNULL(1
void void void void void BLI_listbase_split_after(ListBase *original_listbase, ListBase *split_listbase, void *vlink) ATTR_NONNULL(1
void * BLI_rfindstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:626
void * BLI_listbase_bytes_find(const ListBase *listbase, const void *bytes, size_t bytes_size, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
bool BLI_remlink_safe(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:154
void void void void void void void BLI_listbase_reverse(ListBase *lb) ATTR_NONNULL(1)
Definition listbase.cc:836
BLI_INLINE bool BLI_listbase_count_is_equal_to(const ListBase *listbase, const int count_cmp)
void * BLI_findstring_ptr(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:651
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:524
void * BLI_findlinkfrom(Link *start, int step) ATTR_WARN_UNUSED_RESULT
Definition listbase.cc:564
void void void void void void BLI_duplicatelist(ListBase *dst, const ListBase *src) ATTR_NONNULL(1
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:252
void * BLI_listbase_bytes_rfind(const ListBase *listbase, const void *bytes, size_t bytes_size, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
void void void BLI_listbase_sort_r(ListBase *listbase, int(*cmp)(void *, const void *, const void *), void *thunk) ATTR_NONNULL(1
void * BLI_listbase_findafter_string(Link *link, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:638
bool BLI_listbase_validate(ListBase *lb)
Definition listbase.cc:881
void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:371
BLI_INLINE bool BLI_listbase_equal(const ListBase *a, const ListBase *b)
void void BLI_INLINE bool BLI_listbase_is_single(const ListBase *lb)
These structs are the foundation for all linked lists in the library system.
BMesh const char void * data
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
#define T
void * last
void * first
PointerRNA * ptr
Definition wm_files.cc:4238