errors.hpp string_view format cstdio string cstdint algorithm version serif/utils/misc/terminal/colors.hpp serif/utils/misc/concepts/exceptions.hpp serif/utils/error/codes.hpp serif/utils/types/strings.hpp src/compile_time_checks/serif/backend/mfem/discretization/quadrature/mfem_resolver.cpp src/include/serif/backend/mfem/discretization/boundary_faces.hpp src/include/serif/backend/mfem/discretization/dof_map.hpp src/include/serif/backend/mfem/discretization/quadrature/order.hpp src/include/serif/backend/mfem/discretization/tensor_basis.hpp src/include/serif/backend/mfem/discretization/term_binding.hpp src/include/serif/backend/mfem/model/deformation.hpp src/include/serif/backend/mfem/model/discretization.hpp src/include/serif/backend/mfem/model/normalized_system.hpp src/include/serif/backend/mfem/operators/operand_evaluation.hpp src/include/serif/backend/mfem/operators/volume_stages.hpp src/include/serif/backend/mfem/solver/preconditioner/computations/inverse.hpp src/include/serif/backend/mfem/solver/preconditioner/inverse/validation.hpp src/include/serif/discretization/blocks/vector_view.hpp src/include/serif/discretization/domain/schema/validation/boundary.hpp src/include/serif/discretization/reconstruction/surface_power.hpp src/include/serif/equations/barotropic_density.hpp src/include/serif/equations/barycenter.hpp src/include/serif/equations/companion.hpp src/include/serif/equations/mass_normalization.hpp src/include/serif/equations/primal_gravity.hpp src/include/serif/equations/rigid_rotation.hpp src/include/serif/model/eos_reference.hpp src/include/serif/solver/continuation/controller.hpp src/include/serif/solver/continuation/family.hpp src/include/serif/solver/nonlinear/qualification.hpp src/include/serif/solver/nonlinear/result.hpp src/include/serif/utils/dependencies/computation_cache.hpp src/include/serif/utils/laneemden/solution.hpp src/include/serif/utils/misc/finite.hpp src/lib/serif/backend/mfem/discretization/basis_evaluation.cpp src/lib/serif/backend/mfem/discretization/mass_diagonal.cpp src/lib/serif/backend/mfem/mapping/compactification/kelvin.cpp src/lib/serif/backend/mfem/mapping/data.cpp src/lib/serif/backend/mfem/mapping/domain_mapper.cpp src/lib/serif/backend/mfem/mapping/evaluator.cpp src/lib/serif/backend/mfem/mapping/transformations.cpp src/lib/serif/backend/mfem/mapping/volume_cache.cpp src/lib/serif/backend/mfem/model/scalar_row.cpp src/lib/serif/backend/mfem/model/system.cpp src/lib/serif/backend/mfem/model/system_selection.cpp src/lib/serif/backend/mfem/operators/actions.cpp src/lib/serif/backend/mfem/operators/linearized_block.cpp src/lib/serif/backend/mfem/operators/replaced_rows.cpp src/lib/serif/backend/mfem/projection/radial.cpp src/lib/serif/backend/mfem/runtime.cpp src/lib/serif/backend/mfem/solver/linear/solve.cpp src/lib/serif/backend/mfem/solver/normalization/operators.cpp src/lib/serif/backend/mfem/solver/preconditioner/border.cpp src/lib/serif/backend/mfem/solver/preconditioner/coupling.cpp src/lib/serif/backend/mfem/solver/preconditioner/coupling_selection.cpp src/lib/serif/backend/mfem/solver/preconditioner/solver.cpp src/lib/serif/discretization/blocks/system_layout.cpp src/lib/serif/discretization/domain/mesh/topology.cpp src/lib/serif/discretization/quadrature/policy.cpp src/lib/serif/geometry/surface/isobaric.cpp src/lib/serif/model/specifications.cpp src/lib/serif/solver/linear/linear.cpp src/lib/serif/solver/nonlinear/options.cpp src/lib/serif/solver/normalization/diagonal.cpp src/lib/serif/solver/normalization/dimensionless.cpp src/lib/serif/solver/normalization/packing.cpp src/lib/serif/solver/normalization/riesz_factors.cpp src/lib/serif/solver/normalization/scales.cpp src/lib/serif/solver/normalization/validation.cpp serif serif::utils serif::utils::errors #pragmaonce #include<string_view> #include<format> #include<cstdio> #include<string> #include<cstdint> #include<algorithm> #include<version> #include"serif/utils/misc/terminal/colors.hpp" #include"serif/utils/misc/concepts/exceptions.hpp" #include"serif/utils/error/codes.hpp" #include"serif/utils/types/strings.hpp" //The*ONLY*placeinSERiFthatthrowshould //becalledishere.Allothererrorthrowinglocationsshould //callserif_errortoensurewehaveconsistenthandlingoferrors //Ifyouwanttothrowawarningthenlookattheparallelwarningsmoduleandcallserif_warning //Noteerrorscannotbedisabledatcompiletime,warningscanbedisabledtoanoopatcompiletime. namespaceserif::utils::errors{ template<SERiFErrorCodecode> std::stringformat_error_message(conststd::string_viewmessage,auto...args){ std::stringerror_msg; std::stringcode_name{SERiFErrorCodeTypeToNameMap.at(code)}; std::ranges::transform(code_name,code_name.begin(),[](constunsignedcharc){returnstd::toupper(c);}); if(misc::terminal::supports_ansi(stderr)){ error_msg=std::format("{}{}{}:{}",misc::terminal::a_red,"Error",misc::terminal::a_reset,std::vformat(message,std::make_format_args(args...))); //formaterrorcodewithcolorifterminalsupportsANSI error_msg=std::format("{}(codeNo.:{}[{}{}{}])",error_msg,static_cast<std::underlying_type_t<SERiFErrorCode>>(code),misc::terminal::a_red,code_name,misc::terminal::a_reset); }else{ error_msg=std::format("Error:{}",std::vformat(message,std::make_format_args(args...))); //AdderrorcodewithoutcolorifterminaldoesnotsupportANSI error_msg=std::format("{}(codeNo.:{}[{}])",error_msg,static_cast<std::underlying_type_t<SERiFErrorCode>>(code),code_name); } returnerror_msg; } template<misc::concepts::IsExceptionExceptionT,SERiFErrorCodecode> voidserif_error(conststd::string_viewmessage,auto...args){ std::stringerror_msg=format_error_message<code>(message,args...); throwExceptionT(error_msg); } template<autoMessage,autoCode> structserif_error_printer; template<SERiFErrorCodecode,boolcondition,types::FixedStringmessage> constexprvoidserif_assert(){ #ifndefNDEBUG ifconstexpr(!condition){ #ifdefined(__cpp_static_assert)&&__cpp_static_assert>=202306L static_assert(condition,message); #else [[maybe_unused]]constexprstd::size_terrorKick=sizeof(serif_error_printer<message, code>); #endif } #endif } template<SERiFErrorCodecode,misc::concepts::IsExceptionExceptionT=std::logic_error> voidserif_assert(constboolcondition,conststd::string_viewmessage,auto&&...args){ #ifndefNDEBUG if(!condition){ serif_error<ExceptionT, code>(message,std::forward<decltype(args)>(args)...); } #endif } //Thedifferencebetweenserif_assertandserif_ensureisthatserif_assertisanoopinreleasebuilds,whileserif_ensureisalwaysactive. //Useanensurewhenyouwanttoalwayscheckthings.Useanassertwhenyouwanttocheckthingsthataretruebugs //andshouldnotmanifestinreleasebuilds. template<SERiFErrorCodecode,misc::concepts::IsExceptionExceptionT=std::logic_error> voidserif_ensure(constboolcondition,conststd::string_viewmessage,auto...args){ if(!condition){ serif_error<ExceptionT, code>(message,args...); } } template<SERiFErrorCodecode,boolcondition,types::CTStringmessage> constexprvoidserif_ensure(){ ifconstexpr(!condition){ #ifdefined(__cpp_static_assert)&&__cpp_static_assert>=202306L static_assert(condition,message); #else [[maybe_unused]]constexprstd::size_terrorKick=sizeof(serif_error_printer<message, code>); #endif } } }