diff --git a/dune/solvers/iterationsteps/multigridstep.hh b/dune/solvers/iterationsteps/multigridstep.hh index b7939bad2a7232e3e7c872269523eafa2362dd8f..7b22bf088c10f1e9a58e4ba31c7cf5daeebb9719 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 */