From 9a07ac65f85da7b2fa046c545ca2b6eb9519653c Mon Sep 17 00:00:00 2001 From: Simon Praetorius <simon.praetorius@tu-dresden.de> Date: Sat, 8 Jun 2019 12:38:03 +0200 Subject: [PATCH] make StandardProblemIteration copyable --- src/amdis/ProblemStat.hpp | 5 ++-- src/amdis/StandardProblemIteration.hpp | 40 ++++++++++++++++++++++++++ test/ProblemStatTest.cpp | 14 +++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/amdis/ProblemStat.hpp b/src/amdis/ProblemStat.hpp index 005cf68e..a1eb58b4 100644 --- a/src/amdis/ProblemStat.hpp +++ b/src/amdis/ProblemStat.hpp @@ -49,7 +49,7 @@ namespace AMDiS template <class Traits> class ProblemStat : public ProblemStatBase - , public StandardProblemIteration + , public StandardProblemIterationAdaptor<ProblemStat<Traits>> { using Self = ProblemStat; @@ -81,8 +81,7 @@ namespace AMDiS * access values corresponding to this problem in the parameter file. **/ explicit ProblemStat(std::string const& name) - : StandardProblemIteration(dynamic_cast<ProblemStatBase&>(*this)) - , name_(name) + : name_(name) {} /// Constructor taking additionally a reference to a grid that is used diff --git a/src/amdis/StandardProblemIteration.hpp b/src/amdis/StandardProblemIteration.hpp index 9d719759..4ec7983c 100644 --- a/src/amdis/StandardProblemIteration.hpp +++ b/src/amdis/StandardProblemIteration.hpp @@ -53,4 +53,44 @@ namespace AMDiS ProblemStatBase& problem_; }; + + /// \brief StandardProblemIteration when derived from ProblemStat + /** + * Use this adaptor when multiple inheritance is used: + * ``` + * class Problem + * : public ProblemStatBase + * : StandardProblemIterationAdaptor<Problem> + * {}; + * ``` + * + * **Requirements:** + * - Model must be derived from ProblemStatBase and from StandardProblemIterationAdaptor + **/ + template <class Model> + class StandardProblemIterationAdaptor + : public StandardProblemIteration + { + template <class Self> + static ProblemStatBase& asProblemStatBase(Self& self) + { + Model& model = static_cast<Model&>(self); + return dynamic_cast<ProblemStatBase&>(model); + } + + public: + StandardProblemIterationAdaptor() + : StandardProblemIteration(asProblemStatBase(*this)) + {} + + StandardProblemIterationAdaptor(StandardProblemIterationAdaptor const&) + : StandardProblemIteration(asProblemStatBase(*this)) + {} + + StandardProblemIterationAdaptor(StandardProblemIterationAdaptor&&) + : StandardProblemIteration(asProblemStatBase(*this)) + {} + }; + + } // end namespace AMDiS diff --git a/test/ProblemStatTest.cpp b/test/ProblemStatTest.cpp index d4fa6a49..8c6b36db 100644 --- a/test/ProblemStatTest.cpp +++ b/test/ProblemStatTest.cpp @@ -1,4 +1,5 @@ #include <amdis/AMDiS.hpp> +#include <amdis/AdaptStationary.hpp> #include <amdis/LocalOperators.hpp> #include <amdis/ProblemStat.hpp> @@ -21,6 +22,19 @@ void test() prob.addMatrixOperator(sot(T(1)), 0, 0); prob.addVectorOperator(zot(T(1)), 0); prob.addDirichletBC(BoundaryType{1}, 0,0, T(0)); + + + AdaptInfo adaptInfo("adapt"); + + // test copy constructor of problem + auto prob2(prob); + AdaptStationary adaptStat2("adapt", prob2, adaptInfo); + adaptStat2.adapt(); + + // test move constructor of problem + auto prob3(std::move(prob2)); + AdaptStationary adaptStat3("adapt", prob3, adaptInfo); + adaptStat3.adapt(); } int main(int argc, char** argv) -- GitLab