diff --git a/dune/solvers/iterationsteps/multigridstep.hh b/dune/solvers/iterationsteps/multigridstep.hh index b7939bad2a7232e3e7c872269523eafa2362dd8f..a1dce7d69107da85a98459cd02dcfe5d486cbfb9 100644 --- a/dune/solvers/iterationsteps/multigridstep.hh +++ b/dune/solvers/iterationsteps/multigridstep.hh @@ -153,24 +153,27 @@ namespace Dune { virtual void setMGType(int mu, int nu1, int nu2); /** \brief Set the smoother iteration step */ - virtual void setSmoother(LinearStepType* smoother) + DUNE_DEPRECATED_MSG("Consider setting the smoother via smart pointer, reference or temporaries instead.") + void setSmoother(LinearStepType* smoother) { presmootherDefault_ = postsmootherDefault_ = Dune::stackobject_to_shared_ptr(*smoother); 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(); } /** \brief Set pre- and post smoothers individually */ - virtual void setSmoother(LinearStepType* preSmoother, - LinearStepType* postSmoother) + DUNE_DEPRECATED_MSG("Consider setting the smoother via smart pointer, reference or temporaries instead.") + void setSmoother(LinearStepType* preSmoother, + LinearStepType* postSmoother) { presmootherDefault_ = Dune::stackobject_to_shared_ptr(*preSmoother); postsmootherDefault_ = Dune::stackobject_to_shared_ptr(*postSmoother); @@ -178,25 +181,26 @@ 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(); } /** \brief Set the smoother iteration step for a particular level */ - virtual void setSmoother(LinearStepType* smoother, std::size_t level) + DUNE_DEPRECATED_MSG("Consider setting the smoother via smart pointer, reference or temporaries instead.") + void setSmoother(LinearStepType* smoother, std::size_t level) { levelWiseSmoothers_[level] = Dune::stackobject_to_shared_ptr(*smoother); } /** \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 */