From 2907db6eda8572cfad0054715a25bd65ca0d87d1 Mon Sep 17 00:00:00 2001
From: Adrian Burri <burriad@dune-project.org>
Date: Mon, 31 Oct 2005 13:33:52 +0000
Subject: [PATCH] Made local function work properly again

[[Imported from SVN: r3336]]
---
 fem/discretefunction/adaptivefunction.hh | 21 +++++++++++++--------
 fem/discretefunction/adaptiveimp.cc      |  3 +--
 fem/discretefunction/adaptiveimp.hh      |  7 +++----
 3 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/fem/discretefunction/adaptivefunction.hh b/fem/discretefunction/adaptivefunction.hh
index cba05fa48..0da5516c2 100644
--- a/fem/discretefunction/adaptivefunction.hh
+++ b/fem/discretefunction/adaptivefunction.hh
@@ -37,15 +37,16 @@ namespace Dune {
         DiscreteFunctionSpaceImp> LocalFunctionImp;
 
     // local function type
-    typedef LocalFunctionWrapper< DiscreteFunctionType > LocalFunctionType;
+    typedef LocalFunctionWrapper<
+        DiscreteFunctionType> LocalFunctionType;
 
-    typedef typename DiscreteFunctionSpaceType::RangeFieldType DofType;
-    typedef typename DiscreteFunctionSpaceType::RangeFieldType RangeFieldType;
-    typedef typename DiscreteFunctionSpaceType::RangeType RangeType;
-    typedef typename DiscreteFunctionSpaceType::DomainType DomainType;
-    typedef typename DiscreteFunctionSpaceType::JacobianRangeType JacobianRangeType;
-    typedef typename DiscreteFunctionSpaceType::MapperType MapperType;
-    typedef typename DiscreteFunctionSpaceType::GridType GridType;
+    typedef typename DiscreteFunctionSpaceType::Traits::RangeFieldType DofType;
+    typedef typename DiscreteFunctionSpaceType::Traits::RangeFieldType RangeFieldType;
+    typedef typename DiscreteFunctionSpaceType::Traits::RangeType RangeType;
+    typedef typename DiscreteFunctionSpaceType::Traits::DomainType DomainType;
+    typedef typename DiscreteFunctionSpaceType::Traits::JacobianRangeType JacobianRangeType;
+    typedef typename DiscreteFunctionSpaceType::Traits::MapperType MapperType;
+    typedef typename DiscreteFunctionSpaceType::Traits::GridType GridType;
 
     typedef DofArray<DofType> DofStorageType;
 
@@ -160,6 +161,8 @@ namespace Dune {
     using Imp::read_pgm;
   private:
     //- Forbidden members
+
+    const MyType& interface() const { return *this; }
   }; // end class AdaptiveDiscreteFunction
 
   // Note: could use Traits class for Barton-Nackman instead
@@ -387,6 +390,8 @@ namespace Dune {
 
   private:
     std::vector<SubSpaceType*> subSpaces_;
+
+    const MyType& interface() const { return *this; }
   }; // end class AdaptiveDiscreteFunction (specialised for CombinedSpace)
 
   //- class AdaptiveLocalFunction (specialised)
diff --git a/fem/discretefunction/adaptiveimp.cc b/fem/discretefunction/adaptiveimp.cc
index 0c1e6f7f1..03cff4913 100644
--- a/fem/discretefunction/adaptiveimp.cc
+++ b/fem/discretefunction/adaptiveimp.cc
@@ -116,8 +116,7 @@ namespace Dune {
   AdaptiveFunctionImplementation<DiscreteFunctionSpaceImp>::
   localFunction(const EntityType& en) const
   {
-    typedef AdaptiveDiscreteFunction<DiscreteFunctionSpaceImp> ImplType;
-    return LocalFunctionType(en, static_cast<ImplType&>(*this));
+    return LocalFunctionType(en, this->interface());
   }
 
   template <class DiscreteFunctionSpaceImp>
diff --git a/fem/discretefunction/adaptiveimp.hh b/fem/discretefunction/adaptiveimp.hh
index 9a05baa6e..2dc880ae9 100644
--- a/fem/discretefunction/adaptiveimp.hh
+++ b/fem/discretefunction/adaptiveimp.hh
@@ -45,6 +45,7 @@ namespace Dune {
     typedef typename Traits::GridType GridType;
     typedef DofManager<GridType> DofManagerType;
 
+    typedef typename Traits::DiscreteFunctionType LeafType;
   public:
     std::string name() const;
     int size() const;
@@ -56,8 +57,6 @@ namespace Dune {
 
     LocalFunctionType newLocalFunction() DUNE_DEPRECATED;
 
-
-
     //! update local function to given entity
     template <class EntityType>
     void localFunction(const EntityType& en, LocalFunctionType& lf) DUNE_DEPRECATED;
@@ -96,10 +95,10 @@ namespace Dune {
                                    const DiscreteFunctionSpaceType& spc,
                                    DofStorageType& dofVec);
     AdaptiveFunctionImplementation(const ThisType& other);
-    ~AdaptiveFunctionImplementation();
-
+    virtual ~AdaptiveFunctionImplementation();
 
   private:
+    virtual const LeafType& interface() const = 0;
     const DiscreteFunctionSpaceType& spc_;
     std::string name_;
     DofManagerType& dm_;
-- 
GitLab