eos_reference.hpp memory stdexcept type_traits utility serif/utils/error/errors.hpp src/compile_time_checks/serif/eos/evaluation.cpp src/compile_time_checks/serif/model/barotropic_density.cpp src/compile_time_checks/serif/model/description.cpp src/include/serif/model/model.hpp src/include/serif/utils/serialize/physics.hpp serif::model::EosReference serif serif::model #pragmaonce #include<memory> #include<stdexcept> #include<type_traits> #include<utility> #include"serif/utils/error/errors.hpp" namespaceserif::model { template<typenameEOS> requiresrequires{typenameEOS::Relations;} classEosReferencefinal { public: usingRelations=typenameEOS::Relations; explicitEosReference(std::shared_ptr<constEOS>equation_of_state):m_owner(std::move(equation_of_state)),m_eos(m_owner.get()) { usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT,std::invalid_argument>(m_eos!=nullptr,"AnEOSreferencerequiresanequationofstate;supplyanon-nullsharedowner."); } explicitEosReference(constEOS&equation_of_state)noexcept:m_eos(&equation_of_state) { } EosReference(EOS&&)=delete; EosReference(constEOS&&)=delete; template<typenameRelation,typename...Values> requiresrequires(constEOS&eos,Relationrelation,Values...values){eos.evaluate(relation,values...);} [[nodiscard]]decltype(auto)evaluate(Relationrelation,Values...values)constnoexcept(noexcept(m_eos->evaluate(relation,values...))) { returnm_eos->evaluate(relation,values...); } template<typenameRelation,typenameInput,typename...Values> requiresrequires(constEOS&eos,Relationrelation,Inputinput,Values...values){eos.partial_derivative(relation,input,values...);} [[nodiscard]]decltype(auto)partial_derivative(Relationrelation,Inputinput,Values...values)constnoexcept(noexcept(m_eos->partial_derivative(relation,input,values...))) { returnm_eos->partial_derivative(relation,input,values...); } template<typenameRelation,typenameFirstInput,typenameSecondInput,typename...Values> requiresrequires(constEOS&eos,Relationrelation,FirstInputfirst,SecondInputsecond,Values...values){ eos.second_partial_derivative(relation,first,second,values...); } [[nodiscard]]decltype(auto)second_partial_derivative(Relationrelation,FirstInputfirst,SecondInputsecond,Values...values)const noexcept(noexcept(m_eos->second_partial_derivative(relation,first,second,values...))){ returnm_eos->second_partial_derivative(relation,first,second,values...); } [[nodiscard]]constEOS&get()constnoexcept { return*m_eos; } private: std::shared_ptr<constEOS>m_owner; constEOS*m_eos; }; template<typenameModel> [[nodiscard]]autoshare_equation_of_state(std::shared_ptr<constModel>model) { usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT,std::invalid_argument>(model!=nullptr,"Sharinganequationofstaterequiresanon-nullstellarmodelowner."); usingEOS=std::remove_cvref_t<decltype(model->equation_of_state())>; constEOS*eos=&model->equation_of_state(); returnEosReference<EOS>{std::shared_ptr<constEOS>{std::move(model),eos}}; } template<typenameEOS> [[nodiscard]]EosReference<EOS>borrow_eos(constEOS&eos)noexcept { returnEosReference<EOS>{eos}; } template<typenameEOS> requires(!std::is_lvalue_reference_v<EOS>) voidborrow_eos(EOS&&)=delete; }//namespaceserif::model