From 429ed84d821242bf23fdc3d2c81417deb1f48170 Mon Sep 17 00:00:00 2001 From: Jonathan Youett <youett@math.fu-berlin.de> Date: Tue, 9 Oct 2018 11:11:51 +0200 Subject: [PATCH] Make setSmoother non-virtual and work for l-value, r-values and shared_ptr --- dune/solvers/iterationsteps/multigridstep.hh | 21 ++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/dune/solvers/iterationsteps/multigridstep.hh b/dune/solvers/iterationsteps/multigridstep.hh index b7939bad..7b22bf08 100644 --- a/dune/solvers/iterationsteps/multigridstep.hh +++ b/dune/solvers/iterationsteps/multigridstep.hh @@ -160,10 +160,11 @@ namespace Dune { levelWiseSmoothers_.clear(); } - /** \brief Set the smoother iteration step from a smart pointer*/ - virtual void setSmoother(std::shared_ptr<LinearStepType> smoother) + /** \brief Set the smoother iteration step from a smart pointer, reference or temporary*/ + template <class Smoother, class = std::enable_if_t<not std::is_pointer<Smoother>::value> > + void setSmoother(Smoother&& smoother) { - presmootherDefault_ = postsmootherDefault_ = smoother; + presmootherDefault_ = postsmootherDefault_ = wrap_own_share<LinearStepType>(std::forward<Smoother>(smoother)); levelWiseSmoothers_.clear(); } @@ -178,11 +179,10 @@ namespace Dune { levelWiseSmoothers_.clear(); } - virtual void setSmoother(std::shared_ptr<LinearStepType> preSmoother, - std::shared_ptr<LinearStepType> postSmoother) - { - presmootherDefault_ = std::move(preSmoother); - postsmootherDefault_ = std::move(postSmoother); + template <class Smoother, class = std::enable_if_t<not std::is_pointer<Smoother>::value> > + void setSmoother(Smoother&& preSmoother, Smoother&& postSmoother) { + presmootherDefault_ = wrap_own_share<LinearStepType>(std::forward<Smoother>(preSmoother)); + postsmootherDefault_ = wrap_own_share<LinearStepType>(std::forward<Smoother>(postSmoother)); levelWiseSmoothers_.clear(); } @@ -194,9 +194,10 @@ namespace Dune { } /** \brief Set the smoother iteration step for a particular level, from a smart pointer */ - virtual void setSmoother(std::shared_ptr<LinearStepType> smoother, std::size_t level) + template <class Smoother, class = std::enable_if_t<not std::is_pointer<Smoother>::value> > + void setSmoother(Smoother&& smoother, std::size_t level) { - levelWiseSmoothers_[level] = smoother; + levelWiseSmoothers_[level] = wrap_own_share<LinearStepType>(std::forward<Smoother>(smoother)); } /** \brief Set base solver */ -- GitLab