Blender V5.0
bmesh_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#include "bmesh_class.hh"
17
18/* stuff for dealing with header flags */
19#define BM_elem_flag_test(ele, hflag) _bm_elem_flag_test(&(ele)->head, hflag)
20#define BM_elem_flag_test_bool(ele, hflag) _bm_elem_flag_test_bool(&(ele)->head, hflag)
21#define BM_elem_flag_enable(ele, hflag) _bm_elem_flag_enable(&(ele)->head, hflag)
22#define BM_elem_flag_disable(ele, hflag) _bm_elem_flag_disable(&(ele)->head, hflag)
23#define BM_elem_flag_set(ele, hflag, val) _bm_elem_flag_set(&(ele)->head, hflag, val)
24#define BM_elem_flag_toggle(ele, hflag) _bm_elem_flag_toggle(&(ele)->head, hflag)
25#define BM_elem_flag_merge(ele_a, ele_b) _bm_elem_flag_merge(&(ele_a)->head, &(ele_b)->head)
26#define BM_elem_flag_merge_ex(ele_a, ele_b, hflag_and) \
27 _bm_elem_flag_merge_ex(&(ele_a)->head, &(ele_b)->head, hflag_and)
28#define BM_elem_flag_merge_into(ele, ele_a, ele_b) \
29 _bm_elem_flag_merge_into(&(ele)->head, &(ele_a)->head, &(ele_b)->head)
30
32BLI_INLINE char _bm_elem_flag_test(const BMHeader *head, const char hflag)
33{
34 return head->hflag & hflag;
35}
36
38BLI_INLINE bool _bm_elem_flag_test_bool(const BMHeader *head, const char hflag)
39{
40 return (head->hflag & hflag) != 0;
41}
42
43BLI_INLINE void _bm_elem_flag_enable(BMHeader *head, const char hflag)
44{
45 head->hflag |= hflag;
46}
47
48BLI_INLINE void _bm_elem_flag_disable(BMHeader *head, const char hflag)
49{
50 head->hflag &= (char)~hflag;
51}
52
53BLI_INLINE void _bm_elem_flag_set(BMHeader *head, const char hflag, const int val)
54{
55 if (val) {
56 _bm_elem_flag_enable(head, hflag);
57 }
58 else {
59 _bm_elem_flag_disable(head, hflag);
60 }
61}
62
63BLI_INLINE void _bm_elem_flag_toggle(BMHeader *head, const char hflag)
64{
65 head->hflag ^= hflag;
66}
67
69{
70 head_a->hflag = head_b->hflag = head_a->hflag | head_b->hflag;
71}
72
73BLI_INLINE void _bm_elem_flag_merge_ex(BMHeader *head_a, BMHeader *head_b, const char hflag_and)
74{
75 if (((head_a->hflag & head_b->hflag) & hflag_and) == 0) {
76 head_a->hflag &= ~hflag_and;
77 head_b->hflag &= ~hflag_and;
78 }
79 _bm_elem_flag_merge(head_a, head_b);
80}
81
83 const BMHeader *head_a,
84 const BMHeader *head_b)
85{
86 head->hflag = head_a->hflag | head_b->hflag;
87}
88
116
117#define BM_elem_index_get(ele) _bm_elem_index_get(&(ele)->head)
118#define BM_elem_index_set(ele, index) _bm_elem_index_set(&(ele)->head, index)
119
120BLI_INLINE void _bm_elem_index_set(BMHeader *head, const int index)
121{
122 head->index = index;
123}
124
127{
128 return head->index;
129}
#define ATTR_WARN_UNUSED_RESULT
#define BLI_INLINE
BLI_INLINE void _bm_elem_flag_disable(BMHeader *head, const char hflag)
ATTR_WARN_UNUSED_RESULT BLI_INLINE bool _bm_elem_flag_test_bool(const BMHeader *head, const char hflag)
BLI_INLINE void _bm_elem_flag_set(BMHeader *head, const char hflag, const int val)
ATTR_WARN_UNUSED_RESULT BLI_INLINE int _bm_elem_index_get(const BMHeader *head)
BLI_INLINE void _bm_elem_flag_merge(BMHeader *head_a, BMHeader *head_b)
ATTR_WARN_UNUSED_RESULT BLI_INLINE char _bm_elem_flag_test(const BMHeader *head, const char hflag)
BLI_INLINE void _bm_elem_flag_toggle(BMHeader *head, const char hflag)
BLI_INLINE void _bm_elem_flag_merge_ex(BMHeader *head_a, BMHeader *head_b, const char hflag_and)
BLI_INLINE void _bm_elem_index_set(BMHeader *head, const int index)
BLI_INLINE void _bm_elem_flag_enable(BMHeader *head, const char hflag)
BLI_INLINE void _bm_elem_flag_merge_into(BMHeader *head, const BMHeader *head_a, const BMHeader *head_b)