39 const AttrDomain domain,
44 face_evaluator.
add(face_set_);
45 face_evaluator.evaluate();
46 const VArray<int> faces_group_id = face_evaluator.get_evaluated<
int>(0);
55 static constexpr int no_face_yet = -1;
56 static constexpr int is_boundary = -2;
59 for (std::atomic<int> &v : edge_states.as_mutable_span().slice(range)) {
60 v.store(no_face_yet, std::memory_order_relaxed);
66 for (const int face_i : range) {
67 const int group_id = faces_group_id[face_i];
68 for (const int edge_i : face_edges[face_i]) {
69 std::atomic<int> &edge_state = edge_states[edge_i];
71 int edge_state_value = edge_state.load(std::memory_order_relaxed);
72 switch (edge_state_value) {
76 if (edge_state.compare_exchange_weak(edge_state_value,
78 std::memory_order_relaxed,
79 std::memory_order_relaxed))
86 if (faces_group_id[edge_state_value] == group_id) {
89 if (edge_state.compare_exchange_weak(
90 edge_state_value, is_boundary, std::memory_order_release))
92 boundary[edge_i] = true;
103 return mesh.attributes().adapt_domain<
bool>(