202 assert(current_mesh.is_valid(simplex.
tuple()));
203 using MeshType = std::decay_t<MeshType_>;
207 constexpr static int64_t MeshDim = wmtk::utils::metaprogramming::cell_dimension_v<MeshType>;
211#if defined(WMTK_MESH_VISITOR_ONLY_SUPPORTS_NONCONST_REFERENCE)
214 constexpr static bool CurIsConst = std::is_const_v<MeshType>;
218 constexpr static bool CurHasReturn = !std::is_void_v<CurReturnType>;
222 auto& child_datas = current_mesh.m_multi_mesh_manager.children();
223 std::vector<std::vector<simplex::NavigatableSimplex>> mapped_child_simplices;
224 mapped_child_simplices.reserve(child_datas.size());
233 std::back_inserter(mapped_child_simplices),
234 [&](
const auto& child_data) {
235 Mesh& child_mesh = *child_data.mesh;
237 const std::vector<simplex::Simplex> _r =
238 current_mesh.map_to_child(child_mesh, simplex);
239 std::vector<simplex::NavigatableSimplex> r;
243 std::back_inserter(r),
244 [&](const simplex::Simplex& s) {
245 return simplex::NavigatableSimplex(child_mesh, s);
248 for (
const auto& s : r) {
249 assert(child_mesh.is_valid(s.tuple()));
259 for (
size_t child_index = 0; child_index < child_datas.size(); ++child_index) {
260 auto&& child_data = child_datas[child_index];
261 auto&& simplices = mapped_child_simplices[child_index];
262 Mesh& child_mesh_base = *child_data.mesh;
265 for (
const auto& s : simplices) {
266 assert(child_mesh_base.
is_valid(s.tuple()));
270 auto child_mesh_variant =
273 [&](
auto&& child_mesh_)
noexcept {
274 auto&& child_mesh = child_mesh_.get();
275 using ChildType = std::decay_t<
decltype(child_mesh)>;
276#if defined(WMTK_MESH_VISITOR_ONLY_SUPPORTS_NONCONST_REFERENCE)
277 using ChildReturnType = GetReturnType_t<ChildType>;
279 constexpr static bool ChildIsConst = std::is_const_v<ChildType>;
280 using ChildReturnType = GetReturnType_t<ChildIsConst, ChildType>;
283 constexpr static bool ChildHasReturn = !std::is_void_v<ChildReturnType>;
284 constexpr static int64_t ChildDim =
285 wmtk::utils::metaprogramming::cell_dimension_v<ChildType>;
293 assert(MeshDim >= ChildDim);
295 if constexpr (MeshDim >= ChildDim) {
297 assert(child_mesh.is_valid(child_simplex.tuple()));
299 run(child_mesh, child_simplex);
302 auto parent_id =
m_return_data.get_id(current_mesh, simplex);
303 auto child_id =
m_return_data.get_id(child_mesh, child_simplex);
313 if constexpr (CurHasReturn) {
314 auto current_return =
visitor.m_node_functor(current_mesh, simplex);
316 m_return_data.add(std::move(current_return), current_mesh, simplex);
318 visitor.m_node_functor(current_mesh, simplex);