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