Blender V4.3
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
11#include "BLI_compiler_attrs.h"
12#include "BLI_utildefines.h"
13#include "DNA_listBase.h"
14// struct ListBase;
15// struct LinkData;
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
24int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT
25 ATTR_NONNULL(1);
30int BLI_findstringindex(const struct ListBase *listbase,
31 const char *id,
33
37ListBase BLI_listbase_from_link(struct Link *some_link);
38
39/* Find forwards. */
40
44void *BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT
45 ATTR_NONNULL(1);
46
51void *BLI_findlinkfrom(struct Link *start, int step) ATTR_WARN_UNUSED_RESULT;
52
57void *BLI_findstring(const struct ListBase *listbase,
58 const char *id,
64void *BLI_findstring_ptr(const struct ListBase *listbase,
65 const char *id,
71void *BLI_listbase_findafter_string_ptr(struct Link *link, const char *id, const int offset);
72
77void *BLI_findptr(const struct ListBase *listbase,
78 const void *ptr,
84void *BLI_listbase_bytes_find(const ListBase *listbase,
85 const void *bytes,
86 size_t bytes_size,
87 int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
95void *BLI_listbase_string_or_index_find(const struct ListBase *listbase,
96 const char *string,
97 size_t string_offset,
99
100/* Find backwards. */
101
105void *BLI_rfindlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT
106 ATTR_NONNULL(1);
111void *BLI_rfindstring(const struct ListBase *listbase,
112 const char *id,
118void *BLI_rfindstring_ptr(const struct ListBase *listbase,
119 const char *id,
125void *BLI_rfindptr(const struct ListBase *listbase,
126 const void *ptr,
132void *BLI_listbase_bytes_rfind(const ListBase *listbase,
133 const void *bytes,
134 size_t bytes_size,
135 int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
136
140void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1);
144void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1);
150void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1);
154bool BLI_remlink_safe(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1);
158void *BLI_pophead(ListBase *listbase) ATTR_NONNULL(1);
162void *BLI_poptail(ListBase *listbase) ATTR_NONNULL(1);
163
167void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1);
172void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink)
173 ATTR_NONNULL(1);
178void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink)
179 ATTR_NONNULL(1);
187void BLI_insertlinkreplace(ListBase *listbase, void *vreplacelink, void *vnewlink)
188 ATTR_NONNULL(1, 2, 3);
194void BLI_listbase_sort(struct ListBase *listbase, int (*cmp)(const void *, const void *))
195 ATTR_NONNULL(1, 2);
197 int (*cmp)(void *, const void *, const void *),
198 void *thunk) ATTR_NONNULL(1, 2);
207bool BLI_listbase_link_move(ListBase *listbase, void *vlink, int step) ATTR_NONNULL();
213bool BLI_listbase_move_index(ListBase *listbase, int from, int to) ATTR_NONNULL();
217void BLI_freelist(struct ListBase *listbase) ATTR_NONNULL(1);
223int BLI_listbase_count_at_most(const struct ListBase *listbase,
224 int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
231 const int count_cmp)
232{
233 return BLI_listbase_count_at_most(listbase, count_cmp + 1) == count_cmp;
234}
235
243void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1);
244
248void BLI_listbase_swaplinks(struct ListBase *listbase, void *vlinka, void *vlinkb)
249 ATTR_NONNULL(1, 2);
254void BLI_listbases_swaplinks(struct ListBase *listbasea,
255 struct ListBase *listbaseb,
256 void *vlinka,
257 void *vlinkb) ATTR_NONNULL(2, 3);
258
262void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1, 2);
266void BLI_movelisttolist_reverse(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1, 2);
274void BLI_listbase_split_after(struct ListBase *original_listbase,
275 struct ListBase *split_listbase,
276 void *vlink) ATTR_NONNULL(1, 2);
280void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1, 2);
281void BLI_listbase_reverse(struct ListBase *lb) ATTR_NONNULL(1);
285void BLI_listbase_rotate_first(struct ListBase *lb, void *vlink) ATTR_NONNULL(1, 2);
289void BLI_listbase_rotate_last(struct ListBase *lb, void *vlink) ATTR_NONNULL(1, 2);
290
295{
296 return (lb->first && lb->first == lb->last);
297}
299{
300 return (lb->first == (void *)0);
301}
303{
304 lb->first = lb->last = (void *)0;
305}
306
311bool BLI_listbase_validate(struct ListBase *lb);
312
319BLI_INLINE bool BLI_listbase_equal(const struct ListBase *a, const struct ListBase *b)
320{
321 if (a == NULL) {
322 return b == NULL;
323 }
324 if (b == NULL) {
325 return false;
326 }
327 return a->first == b->first && a->last == b->last;
328}
329
333struct LinkData *BLI_genericNodeN(void *data);
334
349#define LISTBASE_CIRCULAR_FORWARD_BEGIN(type, lb, lb_iter, lb_init) \
350 if ((lb)->first && (lb_init || (lb_init = (type)(lb)->first))) { \
351 lb_iter = (type)(lb_init); \
352 do {
353#define LISTBASE_CIRCULAR_FORWARD_END(type, lb, lb_iter, lb_init) \
354 } \
355 while ((lb_iter = (lb_iter)->next ? (type)(lb_iter)->next : (type)(lb)->first), \
356 (lb_iter != lb_init)) \
357 ; \
358 } \
359 ((void)0)
360
361#define LISTBASE_CIRCULAR_BACKWARD_BEGIN(type, lb, lb_iter, lb_init) \
362 if ((lb)->last && (lb_init || (lb_init = (type)(lb)->last))) { \
363 lb_iter = lb_init; \
364 do {
365#define LISTBASE_CIRCULAR_BACKWARD_END(type, lb, lb_iter, lb_init) \
366 } \
367 while ((lb_iter = (lb_iter)->prev ? (lb_iter)->prev : (type)(lb)->last), (lb_iter != lb_init)) \
368 ; \
369 } \
370 ((void)0)
371
372#define LISTBASE_FOREACH(type, var, list) \
373 for (type var = (type)((list)->first); var != NULL; var = (type)(((Link *)(var))->next))
374
380#define LISTBASE_FOREACH_INDEX(type, var, list, index_var) \
381 for (type var = (((void)(index_var = 0)), (type)((list)->first)); var != NULL; \
382 var = (type)(((Link *)(var))->next), index_var++)
383
384#define LISTBASE_FOREACH_BACKWARD(type, var, list) \
385 for (type var = (type)((list)->last); var != NULL; var = (type)(((Link *)(var))->prev))
386
390#define LISTBASE_FOREACH_MUTABLE(type, var, list) \
391 for (type var = (type)((list)->first), *var##_iter_next; \
392 ((var != NULL) ? ((void)(var##_iter_next = (type)(((Link *)(var))->next)), 1) : 0); \
393 var = var##_iter_next)
394
398#define LISTBASE_FOREACH_BACKWARD_MUTABLE(type, var, list) \
399 for (type var = (type)((list)->last), *var##_iter_prev; \
400 ((var != NULL) ? ((void)(var##_iter_prev = (type)(((Link *)(var))->prev)), 1) : 0); \
401 var = var##_iter_prev)
402
403#ifdef __cplusplus
404}
405#endif
406
407#ifdef __cplusplus
408BLI_INLINE bool operator==(const ListBase &a, const ListBase &b)
409{
410 return BLI_listbase_equal(&a, &b);
411}
412#endif
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_NONNULL(...)
#define BLI_INLINE
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
bool BLI_listbase_validate(struct ListBase *lb)
Definition listbase.cc:868
void * BLI_rfindlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:90
bool BLI_listbase_move_index(ListBase *listbase, int from, int to) ATTR_NONNULL()
Definition listbase.cc:466
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:269
void * BLI_poptail(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:260
void BLI_insertlinkreplace(ListBase *listbase, void *vreplacelink, void *vnewlink) ATTR_NONNULL(1
void void BLI_listbase_rotate_last(struct ListBase *lb, void *vlink) ATTR_NONNULL(1
void void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void * BLI_findlinkfrom(struct Link *start, int step) ATTR_WARN_UNUSED_RESULT
Definition listbase.cc:563
void BLI_listbase_rotate_first(struct ListBase *lb, void *vlink) ATTR_NONNULL(1
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:331
void * BLI_rfindstring_ptr(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void void void BLI_listbase_split_after(struct ListBase *original_listbase, struct ListBase *split_listbase, void *vlink) ATTR_NONNULL(1
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
bool BLI_remlink_safe(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:153
int BLI_listbase_count_at_most(const struct ListBase *listbase, int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
BLI_INLINE bool BLI_listbase_equal(const struct ListBase *a, const struct ListBase *b)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:496
BLI_INLINE bool BLI_listbase_count_is_equal_to(const struct ListBase *listbase, const int count_cmp)
void void BLI_INLINE bool BLI_listbase_is_single(const struct ListBase *lb)
void void BLI_listbase_sort(struct ListBase *listbase, int(*cmp)(const void *, const void *)) ATTR_NONNULL(1
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:130
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void bool BLI_listbase_link_move(ListBase *listbase, void *vlink, int step) ATTR_NONNULL()
Definition listbase.cc:435
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_listbases_swaplinks(struct ListBase *listbasea, struct ListBase *listbaseb, void *vlinka, void *vlinkb) ATTR_NONNULL(2
void * BLI_rfindptr(const struct ListBase *listbase, const void *ptr, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:370
void * BLI_rfindstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_listbase_findafter_string_ptr(struct Link *link, const char *id, const int offset)
Definition listbase.cc:671
void void void void BLI_movelisttolist_reverse(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
int BLI_findstringindex(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_listbase_bytes_find(const ListBase *listbase, const void *bytes, size_t bytes_size, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
void void void void void void void BLI_listbase_reverse(struct ListBase *lb) ATTR_NONNULL(1)
Definition listbase.cc:823
struct LinkData * BLI_genericNodeN(void *data)
Definition listbase.cc:909
ListBase BLI_listbase_from_link(struct Link *some_link)
Definition listbase.cc:787
void * BLI_findstring_ptr(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:251
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 BLI_freelist(struct ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:482
void void void BLI_listbase_sort_r(ListBase *listbase, int(*cmp)(void *, const void *, const void *), void *thunk) ATTR_NONNULL(1
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void * BLI_listbase_string_or_index_find(const struct ListBase *listbase, const char *string, size_t string_offset, int index) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_listbase_swaplinks(struct ListBase *listbase, void *vlinka, void *vlinkb) ATTR_NONNULL(1
These structs are the foundation for all linked lists in the library system.
bool operator==(const AssetWeakReference &a, const AssetWeakReference &b)
local_group_size(16, 16) .push_constant(Type b
#define NULL
void * last
void * first
PointerRNA * ptr
Definition wm_files.cc:4126