14#include <lagrange/Attribute.h>
15#include <lagrange/AttributeTypes.h>
16#include <lagrange/IndexedAttribute.h>
17#include <lagrange/SurfaceMesh.h>
18#include <lagrange/utils/BitField.h>
58enum class Ordering { Sequential, Parallel };
59enum class Access { Write, Read };
61LA_CORE_API
void par_foreach_attribute_id(
66 std::underlying_type_t<AttributeElement> mask,
71void internal_foreach_named_attribute(
76 auto cb = [&](std::string_view name,
AttributeId id) {
77 constexpr auto filter = BitField<AttributeElement>(mask);
78#define LA_X_match_attribute(_, T) \
79 if (mesh.template is_attribute_type<T>(id)) { \
80 if constexpr (filter.test(AttributeElement::Indexed)) { \
81 if (mesh.is_attribute_indexed(id)) { \
82 auto& attr = mesh.template get_indexed_attribute<T>(id); \
83 if (filter.test(attr.get_element_type())) { \
84 if constexpr (access == Access::Write) { \
85 vis(name, mesh.template ref_indexed_attribute<T>(id)); \
92 if constexpr (filter.test_any(~AttributeElement::Indexed)) { \
93 if (!mesh.is_attribute_indexed(id)) { \
94 auto& attr = mesh.template get_attribute<T>(id); \
95 if (filter.test(attr.get_element_type())) { \
96 if constexpr (access == Access::Write) { \
97 vis(name, mesh.template ref_attribute<T>(id)); \
106#undef LA_X_match_attribute
108 if constexpr (ordering == Ordering::Sequential) {
112 std::for_each(ids.begin(), ids.end(), [&](
AttributeId id) {
113 cb(mesh.get_attribute_name(id), id);
120 par_foreach_attribute_id(ids, [&](
AttributeId id) {
128 std::underlying_type_t<AttributeElement> mask,
136 constexpr auto filter = BitField<AttributeElement>(mask);
137#define LA_X_match_attribute(_, T) \
138 if (mesh.template is_attribute_type<T>(id)) { \
139 if constexpr (filter.test(AttributeElement::Indexed)) { \
140 if (mesh.is_attribute_indexed(id)) { \
141 auto& attr = mesh.template get_indexed_attribute<T>(id); \
142 if (filter.test(attr.get_element_type())) { \
143 if constexpr (access == Access::Write) { \
144 vis(mesh.template ref_indexed_attribute<T>(id)); \
151 if constexpr (filter.test_any(~AttributeElement::Indexed)) { \
152 if (!mesh.is_attribute_indexed(id)) { \
153 auto& attr = mesh.template get_attribute<T>(id); \
154 if (filter.test(attr.get_element_type())) { \
155 if constexpr (access == Access::Write) { \
156 vis(mesh.template ref_attribute<T>(id)); \
165#undef LA_X_match_attribute
167 if constexpr (ordering == Ordering::Sequential) {
171 std::for_each(ids.begin(), ids.end(), cb);
177 par_foreach_attribute_id(ids, cb);
210 using namespace details;
211 internal_foreach_named_attribute<mask, Ordering::Sequential, Access::Read>(
213 std::forward<Visitor>(vis));
235 using namespace details;
236 internal_foreach_attribute<mask, Ordering::Sequential, Access::Read>(
238 std::forward<Visitor>(vis));
268 using namespace details;
269 internal_foreach_named_attribute<mask, Ordering::Sequential, Access::Write>(
271 std::forward<Visitor>(vis));
294 using namespace details;
295 internal_foreach_attribute<mask, Ordering::Sequential, Access::Write>(
297 std::forward<Visitor>(vis));
326 using namespace details;
327 internal_foreach_named_attribute<mask, Ordering::Parallel, Access::Read>(
329 std::forward<Visitor>(vis));
351 using namespace details;
352 internal_foreach_attribute<mask, Ordering::Parallel, Access::Read>(
354 std::forward<Visitor>(vis));
384 using namespace details;
385 internal_foreach_named_attribute<mask, Ordering::Parallel, Access::Write>(
387 std::forward<Visitor>(vis));
410 using namespace details;
411 internal_foreach_attribute<mask, Ordering::Parallel, Access::Write>(
413 std::forward<Visitor>(vis));
static constexpr BitField all()
Named constructor returning a bitfield set to 1.
Definition BitField.h:76
A general purpose polygonal mesh class.
Definition SurfaceMesh.h:66
void par_foreach_attribute_id(function_ref< void(AttributeId)> func) const
Iterates over all attribute ids in parallel.
Definition SurfaceMesh.cpp:1262
std::string_view get_attribute_name(AttributeId id) const
Retrieve attribute name from its id.
Definition SurfaceMesh.cpp:355
void seq_foreach_attribute_id(function_ref< void(AttributeId)> func) const
Iterates over all attribute ids sequentially.
Definition SurfaceMesh.cpp:1248
uint32_t AttributeId
Identified to be used to access an attribute.
Definition AttributeFwd.h:73
#define LA_ATTRIBUTE_X(mode, data)
X Macro arguments for the Attribute<> class.
Definition AttributeTypes.h:48
@ Scalar
Mesh attribute must have exactly 1 channel.
Definition AttributeFwd.h:56
void par_foreach_named_attribute_write(SurfaceMesh< Scalar, Index > &mesh, Visitor &&vis)
Applies a function in parallel to each attribute of a mesh.
Definition foreach_attribute.h:382
void par_foreach_attribute_read(const SurfaceMesh< Scalar, Index > &mesh, Visitor &&vis)
Applies a function in parallel to each attribute of a mesh.
Definition foreach_attribute.h:349
void par_foreach_attribute_write(SurfaceMesh< Scalar, Index > &mesh, Visitor &&vis)
Applies a function in parallel to each attribute of a mesh.
Definition foreach_attribute.h:408
void seq_foreach_attribute_read(const SurfaceMesh< Scalar, Index > &mesh, Visitor &&vis)
Applies a function to each attribute of a mesh.
Definition foreach_attribute.h:233
void seq_foreach_named_attribute_write(SurfaceMesh< Scalar, Index > &mesh, Visitor &&vis)
Applies a function to each attribute of a mesh.
Definition foreach_attribute.h:266
void seq_foreach_named_attribute_read(const SurfaceMesh< Scalar, Index > &mesh, Visitor &&vis)
Applies a function to each attribute of a mesh.
Definition foreach_attribute.h:208
void par_foreach_named_attribute_read(const SurfaceMesh< Scalar, Index > &mesh, Visitor &&vis)
Applies a function in parallel to each attribute of a mesh.
Definition foreach_attribute.h:324
void seq_foreach_attribute_write(SurfaceMesh< Scalar, Index > &mesh, Visitor &&vis)
Applies a function to each attribute of a mesh.
Definition foreach_attribute.h:292
function_ref(R(*)(Args...)) -> function_ref< R(Args...)>
Deduce function_ref type from a function pointer.
::nonstd::span< T, Extent > span
A bounds-safe view for sequences of objects.
Definition span.h:27
Main namespace for Lagrange.