Blender V5.0
bmesh_iterators_inline.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#pragma once
12
13#include "BLI_compiler_attrs.h"
14#include "BLI_compiler_compat.h"
15
16/* inline here optimizes out the switch statement when called with
17 * constant values (which is very common), nicer for loop-in-loop situations */
18
25{
26 return iter->step(iter);
27}
28
36ATTR_NONNULL(1) BLI_INLINE bool BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *data)
37{
38 // int argtype;
39 iter->itype = itype;
40
41 /* inlining optimizes out this switch when called with the defined type */
42 switch ((BMIterType)itype) {
44 BLI_assert(bm != nullptr);
45 BLI_assert(data == nullptr);
48 iter->data.elem_of_mesh.pooliter.pool = bm->vpool;
49 break;
51 BLI_assert(bm != nullptr);
52 BLI_assert(data == nullptr);
55 iter->data.elem_of_mesh.pooliter.pool = bm->epool;
56 break;
58 BLI_assert(bm != nullptr);
59 BLI_assert(data == nullptr);
62 iter->data.elem_of_mesh.pooliter.pool = bm->fpool;
63 break;
65 BLI_assert(data != nullptr);
66 BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
69 iter->data.edge_of_vert.vdata = (BMVert *)data;
70 break;
72 BLI_assert(data != nullptr);
73 BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
76 iter->data.face_of_vert.vdata = (BMVert *)data;
77 break;
79 BLI_assert(data != nullptr);
80 BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
83 iter->data.loop_of_vert.vdata = (BMVert *)data;
84 break;
86 BLI_assert(data != nullptr);
87 BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
90 iter->data.vert_of_edge.edata = (BMEdge *)data;
91 break;
93 BLI_assert(data != nullptr);
94 BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
97 iter->data.face_of_edge.edata = (BMEdge *)data;
98 break;
100 BLI_assert(data != nullptr);
101 BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
104 iter->data.vert_of_face.pdata = (BMFace *)data;
105 break;
106 case BM_EDGES_OF_FACE:
107 BLI_assert(data != nullptr);
108 BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
111 iter->data.edge_of_face.pdata = (BMFace *)data;
112 break;
113 case BM_LOOPS_OF_FACE:
114 BLI_assert(data != nullptr);
115 BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
118 iter->data.loop_of_face.pdata = (BMFace *)data;
119 break;
120 case BM_LOOPS_OF_LOOP:
121 BLI_assert(data != nullptr);
122 BLI_assert(((BMElem *)data)->head.htype == BM_LOOP);
125 iter->data.loop_of_loop.ldata = (BMLoop *)data;
126 break;
127 case BM_LOOPS_OF_EDGE:
128 BLI_assert(data != nullptr);
129 BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
132 iter->data.loop_of_edge.edata = (BMEdge *)data;
133 break;
134 default:
135 /* should never happen */
136 BLI_assert(0);
137 return false;
138 break;
139 }
140
141 iter->begin(iter);
142
143 return true;
144}
145
155 void *BM_iter_new(BMIter *iter, BMesh *bm, const char itype, void *data)
156{
157 if (LIKELY(BM_iter_init(iter, bm, itype, data))) {
158 return BM_iter_step(iter);
159 }
160 else {
161 return nullptr;
162 }
163}
164
173
174#ifdef __BLI_TASK_H__
175
177BLI_INLINE void BM_iter_parallel(BMesh *bm,
178 const char itype,
180 void *userdata,
181 const TaskParallelSettings *settings)
182{
183 /* inlining optimizes out this switch when called with the defined type */
184 switch ((BMIterType)itype) {
185 case BM_VERTS_OF_MESH:
186 BLI_task_parallel_mempool(bm->vpool, userdata, func, settings);
187 break;
188 case BM_EDGES_OF_MESH:
189 BLI_task_parallel_mempool(bm->epool, userdata, func, settings);
190 break;
191 case BM_FACES_OF_MESH:
192 BLI_task_parallel_mempool(bm->fpool, userdata, func, settings);
193 break;
194 default:
195 /* should never happen */
196 BLI_assert(0);
197 break;
198 }
199}
200
201#endif /* __BLI_TASK_H__ */
#define BLI_assert(a)
Definition BLI_assert.h:46
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_NONNULL(...)
#define BLI_INLINE
void BLI_task_parallel_mempool(struct BLI_mempool *mempool, void *userdata, TaskParallelMempoolFunc func, const TaskParallelSettings *settings)
void(* TaskParallelMempoolFunc)(void *userdata, MempoolIterData *iter, const TaskParallelTLS *__restrict tls)
Definition BLI_task.h:202
#define LIKELY(x)
@ BM_LOOP
void * bmiter__elem_of_mesh_step(BMIter__elem_of_mesh *iter)
void * bmiter__vert_of_edge_step(BMIter__vert_of_edge *iter)
void bmiter__edge_of_face_begin(BMIter__edge_of_face *iter)
void * bmiter__face_of_vert_step(BMIter__face_of_vert *iter)
void bmiter__face_of_vert_begin(BMIter__face_of_vert *iter)
void * bmiter__loop_of_face_step(BMIter__loop_of_face *iter)
void bmiter__loop_of_edge_begin(BMIter__loop_of_edge *iter)
void bmiter__face_of_edge_begin(BMIter__face_of_edge *iter)
void bmiter__loop_of_face_begin(BMIter__loop_of_face *iter)
void * bmiter__edge_of_face_step(BMIter__edge_of_face *iter)
void bmiter__edge_of_vert_begin(BMIter__edge_of_vert *iter)
void bmiter__elem_of_mesh_begin(BMIter__elem_of_mesh *iter)
void * bmiter__face_of_edge_step(BMIter__face_of_edge *iter)
void * bmiter__loop_of_edge_step(BMIter__loop_of_edge *iter)
void bmiter__vert_of_face_begin(BMIter__vert_of_face *iter)
void * bmiter__loop_of_vert_step(BMIter__loop_of_vert *iter)
void * bmiter__loop_of_loop_step(BMIter__loop_of_loop *iter)
void bmiter__loop_of_loop_begin(BMIter__loop_of_loop *iter)
void * bmiter__vert_of_face_step(BMIter__vert_of_face *iter)
void * bmiter__edge_of_vert_step(BMIter__edge_of_vert *iter)
void bmiter__loop_of_vert_begin(BMIter__loop_of_vert *iter)
void bmiter__vert_of_edge_begin(BMIter__vert_of_edge *iter)
void(*)(void *) BMIter__begin_cb
#define BM_iter_init(iter, bm, itype, data)
BMIterType
BMesh Iterators.
@ BM_LOOPS_OF_LOOP
@ BM_FACES_OF_EDGE
@ BM_FACES_OF_VERT
@ BM_EDGES_OF_MESH
@ BM_VERTS_OF_MESH
@ BM_VERTS_OF_EDGE
@ BM_VERTS_OF_FACE
@ BM_FACES_OF_MESH
@ BM_LOOPS_OF_VERT
@ BM_LOOPS_OF_EDGE
@ BM_EDGES_OF_VERT
@ BM_EDGES_OF_FACE
@ BM_LOOPS_OF_FACE
void *(*)(void *) BMIter__step_cb
#define BM_iter_new(iter, bm, itype, data)
BMesh const char void * data
BMesh * bm
BMesh const char itype
#define BM_FACE
#define BM_EDGE
#define BM_VERT