parallel.hpp exception vector src/include/serif/backend/mfem/model/deformation.hpp src/include/serif/backend/mfem/operators/element_preparation.hpp src/include/serif/backend/mfem/operators/geometry_derivatives.hpp src/include/serif/backend/mfem/operators/volume_application.hpp src/include/serif/backend/mfem/operators/volume_field_block.hpp src/include/serif/backend/mfem/operators/volume_stages.hpp src/lib/serif/backend/mfem/discretization/mass_diagonal.cpp src/lib/serif/backend/mfem/geometry/deformation/geometry_step.cpp src/lib/serif/backend/mfem/model/surface_potential.cpp src/lib/serif/backend/mfem/shared/parallel.cpp mfem serif serif::utils serif::utils::parallel serif::utils::parallel::detail #pragmaonce #include<exception> #include<vector> namespacemfem{ classIsoparametricTransformation; classMesh; } namespaceserif::utils::parallel{ [[nodiscard]]intworker_count()noexcept; namespacedetail{ usingBody=void(*)(void*context,intindex,intworker); voidrun(intcount,void*context,Bodybody); } template<typenameBodyT> voidfor_each_index(constintcount,BodyT&&body){ std::vector<std::exception_ptr>errors(static_cast<std::size_t>(count>0?count:0)); autoguarded=[&](constintindex,constintworker){ try{ body(index,worker); }catch(...){ errors[static_cast<std::size_t>(index)]=std::current_exception(); } }; detail::run(count,&guarded,[](void*context,constintindex,constintworker){ (*static_cast<decltype(guarded)*>(context))(index,worker); }); for(constauto&error:errors){ if(error){ std::rethrow_exception(error); } } } voidelement_transformation(const::mfem::Mesh&mesh,intelement,::mfem::IsoparametricTransformation&transformation); }