equilibrium_equations.hpp functional tuple type_traits utility src/include/serif/model/description.hpp src/include/serif/model/detail/surface_plan.hpp src/include/serif/model/equilibrium_plan.hpp src/include/serif/model/stellar_model.hpp serif::model::NoShapeForce serif::model::NoSurfaceCondition serif::model::EquilibriumEquations serif serif::model serif::model::detail #pragmaonce #include<functional> #include<tuple> #include<type_traits> #include<utility> namespaceserif::model { structNoShapeForce { }; structNoSurfaceCondition { }; template<typenameInterior,typenameShape=NoShapeForce,typenameSurface=NoSurfaceCondition> structEquilibriumEquations { usingInteriorEquations=std::remove_cvref_t<Interior>; usingShapeForce=std::remove_cvref_t<Shape>; usingSurfaceCondition=std::remove_cvref_t<Surface>; Interiorinterior_equations; Shapeshape_force{}; Surfacesurface_condition{}; }; template<typenameInterior,typenameShape=NoShapeForce,typenameSurface=NoSurfaceCondition> EquilibriumEquations(Interior,Shape={},Surface={})->EquilibriumEquations<Interior,Shape,Surface>; namespacedetail { template<typenameCandidate> inlineconstexprboolis_equilibrium_equations=false; template<typenameInterior,typenameShape,typenameSurface> inlineconstexprboolis_equilibrium_equations<EquilibriumEquations<Interior, Shape, Surface>>=true; template<typenameDefinition,typenameModel> [[nodiscard]]decltype(auto)resolve_equation_member(Definition&&definition,constModel&model) { ifconstexpr(std::invocable<Definition,constModel&>) { returnstd::invoke(std::forward<Definition>(definition),model); } elseifconstexpr(std::is_lvalue_reference_v<Definition&&>) { returnstd::forward<Definition>(definition); } else { returnstd::remove_cvref_t<Definition>{std::forward<Definition>(definition)}; } } template<typenameDefinition,typenameModel> [[nodiscard]]autoresolve_equation_members(Definition&&definition,constModel&model) { usingInterior=decltype(resolve_equation_member(std::forward<Definition>(definition).interior_equations,model)); usingShape=decltype(resolve_equation_member(std::forward<Definition>(definition).shape_force,model)); usingSurface=decltype(resolve_equation_member(std::forward<Definition>(definition).surface_condition,model)); returnEquilibriumEquations<Interior,Shape,Surface> { .interior_equations=resolve_equation_member(std::forward<Definition>(definition).interior_equations,model), .shape_force=resolve_equation_member(std::forward<Definition>(definition).shape_force,model), .surface_condition=resolve_equation_member(std::forward<Definition>(definition).surface_condition,model) }; } }//namespacedetail template<typenameCandidate> conceptEquilibriumEquationDescription=detail::is_equilibrium_equations<std::remove_cvref_t<Candidate>>; template<typenameModel> requiresrequires(constModel&model){model.equations();}&& EquilibriumEquationDescription<decltype(detail::resolve_equation_member(std::declval<const Model&>().equations(),std::declval<constModel&>()))> [[nodiscard]]autoresolve_equilibrium_equations(constModel&model) { returndetail::resolve_equation_members(detail::resolve_equation_member(model.equations(),model),model); } template<typenameModel> requires(!std::is_lvalue_reference_v<Model>) voidresolve_equilibrium_equations(Model&&)=delete; }//namespaceserif::model