Blender  V3.3
bmesh_iterators_inline.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
9 #pragma once
10 
11 /* inline here optimizes out the switch statement when called with
12  * constant values (which is very common), nicer for loop-in-loop situations */
13 
20 {
21  return iter->step(iter);
22 }
23 
31 ATTR_NONNULL(1)
32 BLI_INLINE bool BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *data)
33 {
34  /* int argtype; */
35  iter->itype = itype;
36 
37  /* inlining optimizes out this switch when called with the defined type */
38  switch ((BMIterType)itype) {
39  case BM_VERTS_OF_MESH:
40  BLI_assert(bm != NULL);
41  BLI_assert(data == NULL);
44  iter->data.elem_of_mesh.pooliter.pool = bm->vpool;
45  break;
46  case BM_EDGES_OF_MESH:
47  BLI_assert(bm != NULL);
48  BLI_assert(data == NULL);
51  iter->data.elem_of_mesh.pooliter.pool = bm->epool;
52  break;
53  case BM_FACES_OF_MESH:
54  BLI_assert(bm != NULL);
55  BLI_assert(data == NULL);
58  iter->data.elem_of_mesh.pooliter.pool = bm->fpool;
59  break;
60  case BM_EDGES_OF_VERT:
61  BLI_assert(data != NULL);
62  BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
65  iter->data.edge_of_vert.vdata = (BMVert *)data;
66  break;
67  case BM_FACES_OF_VERT:
68  BLI_assert(data != NULL);
69  BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
72  iter->data.face_of_vert.vdata = (BMVert *)data;
73  break;
74  case BM_LOOPS_OF_VERT:
75  BLI_assert(data != NULL);
76  BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
79  iter->data.loop_of_vert.vdata = (BMVert *)data;
80  break;
81  case BM_VERTS_OF_EDGE:
82  BLI_assert(data != NULL);
83  BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
86  iter->data.vert_of_edge.edata = (BMEdge *)data;
87  break;
88  case BM_FACES_OF_EDGE:
89  BLI_assert(data != NULL);
90  BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
93  iter->data.face_of_edge.edata = (BMEdge *)data;
94  break;
95  case BM_VERTS_OF_FACE:
96  BLI_assert(data != NULL);
97  BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
100  iter->data.vert_of_face.pdata = (BMFace *)data;
101  break;
102  case BM_EDGES_OF_FACE:
103  BLI_assert(data != NULL);
104  BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
107  iter->data.edge_of_face.pdata = (BMFace *)data;
108  break;
109  case BM_LOOPS_OF_FACE:
110  BLI_assert(data != NULL);
111  BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
114  iter->data.loop_of_face.pdata = (BMFace *)data;
115  break;
116  case BM_LOOPS_OF_LOOP:
117  BLI_assert(data != NULL);
118  BLI_assert(((BMElem *)data)->head.htype == BM_LOOP);
121  iter->data.loop_of_loop.ldata = (BMLoop *)data;
122  break;
123  case BM_LOOPS_OF_EDGE:
124  BLI_assert(data != NULL);
125  BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
128  iter->data.loop_of_edge.edata = (BMEdge *)data;
129  break;
130  default:
131  /* should never happen */
132  BLI_assert(0);
133  return false;
134  break;
135  }
136 
137  iter->begin(iter);
138 
139  return true;
140 }
141 
151  void *BM_iter_new(BMIter *iter, BMesh *bm, const char itype, void *data)
152 {
153  if (LIKELY(BM_iter_init(iter, bm, itype, data))) {
154  return BM_iter_step(iter);
155  }
156  else {
157  return NULL;
158  }
159 }
160 
170 #ifdef __BLI_TASK_H__
171 
172 ATTR_NONNULL(1)
173 BLI_INLINE void BM_iter_parallel(BMesh *bm,
174  const char itype,
176  void *userdata,
177  const TaskParallelSettings *settings)
178 {
179  /* inlining optimizes out this switch when called with the defined type */
180  switch ((BMIterType)itype) {
181  case BM_VERTS_OF_MESH:
182  BLI_task_parallel_mempool(bm->vpool, userdata, func, settings);
183  break;
184  case BM_EDGES_OF_MESH:
185  BLI_task_parallel_mempool(bm->epool, userdata, func, settings);
186  break;
187  case BM_FACES_OF_MESH:
188  BLI_task_parallel_mempool(bm->fpool, userdata, func, settings);
189  break;
190  default:
191  /* should never happen */
192  BLI_assert(0);
193  break;
194  }
195 }
196 
197 #endif /* __BLI_TASK_H__ */
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define ATTR_WARN_UNUSED_RESULT
#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:274
#define LIKELY(x)
@ BM_LOOP
Definition: bmesh_class.h:385
@ BM_FACE
Definition: bmesh_class.h:386
@ BM_VERT
Definition: bmesh_class.h:383
@ BM_EDGE
Definition: bmesh_class.h:384
void * bmiter__loop_of_face_step(struct BMIter__loop_of_face *iter)
void bmiter__loop_of_loop_begin(struct BMIter__loop_of_loop *iter)
void * bmiter__vert_of_edge_step(struct BMIter__vert_of_edge *iter)
void * bmiter__edge_of_face_step(struct BMIter__edge_of_face *iter)
void * bmiter__elem_of_mesh_step(struct BMIter__elem_of_mesh *iter)
void bmiter__edge_of_face_begin(struct BMIter__edge_of_face *iter)
void bmiter__loop_of_vert_begin(struct BMIter__loop_of_vert *iter)
void bmiter__face_of_edge_begin(struct BMIter__face_of_edge *iter)
void bmiter__loop_of_face_begin(struct BMIter__loop_of_face *iter)
void * bmiter__loop_of_loop_step(struct BMIter__loop_of_loop *iter)
void bmiter__vert_of_face_begin(struct BMIter__vert_of_face *iter)
void * bmiter__loop_of_edge_step(struct BMIter__loop_of_edge *iter)
void bmiter__face_of_vert_begin(struct BMIter__face_of_vert *iter)
void bmiter__elem_of_mesh_begin(struct BMIter__elem_of_mesh *iter)
void bmiter__edge_of_vert_begin(struct BMIter__edge_of_vert *iter)
void bmiter__loop_of_edge_begin(struct BMIter__loop_of_edge *iter)
void * bmiter__face_of_edge_step(struct BMIter__face_of_edge *iter)
void bmiter__vert_of_edge_begin(struct BMIter__vert_of_edge *iter)
void * bmiter__vert_of_face_step(struct BMIter__vert_of_face *iter)
void * bmiter__face_of_vert_step(struct BMIter__face_of_vert *iter)
void * bmiter__loop_of_vert_step(struct BMIter__loop_of_vert *iter)
void * bmiter__edge_of_vert_step(struct BMIter__edge_of_vert *iter)
void *(* BMIter__step_cb)(void *)
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
#define BM_iter_new(iter, bm, itype, data)
void(* BMIter__begin_cb)(void *)
BLI_INLINE bool BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *data)
Iterator Init.
ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) BLI_INLINE void *BM_iter_step(BMIter *iter)
Iterator Step.
ATTR_WARN_UNUSED_RESULT BMesh const char itype
ATTR_WARN_UNUSED_RESULT BMesh * bm
struct BLI_mempool * epool
Definition: bmesh_class.h:314
struct BLI_mempool * fpool
Definition: bmesh_class.h:314
struct BLI_mempool * vpool
Definition: bmesh_class.h:314