From f559cd15f923d573c97c90237f09756d4a940f70 Mon Sep 17 00:00:00 2001
From: Martin Nolte <nolte@mathematik.uni-freiburg.de>
Date: Fri, 10 Nov 2017 15:59:08 +0000
Subject: [PATCH] Merge branch 'feature/add-has-entity-iterator-capability'
 into 'master'

add capability hasEntityIterator

Closes #38

See merge request core/dune-grid!230

(cherry picked from commit e50f64ae11a610a80ca63d91b76aa1848c22cc1e)

8f3bb0d1 add capability hasEntityIterator
---
 dune/grid/albertagrid/capabilities.hh  | 11 +++++++++++
 dune/grid/common/capabilities.hh       | 22 ++++++++++++++++++++++
 dune/grid/geometrygrid/capabilities.hh |  7 +++++++
 dune/grid/identitygrid.hh              |  6 ++++++
 dune/grid/onedgrid.hh                  | 10 ++++++++++
 dune/grid/uggrid.hh                    | 20 ++++++++++++++++++++
 dune/grid/yaspgrid.hh                  | 10 ++++++++++
 7 files changed, 86 insertions(+)

diff --git a/dune/grid/albertagrid/capabilities.hh b/dune/grid/albertagrid/capabilities.hh
index c43b89915c..94d4c3cc4e 100644
--- a/dune/grid/albertagrid/capabilities.hh
+++ b/dune/grid/albertagrid/capabilities.hh
@@ -46,6 +46,17 @@ namespace Dune
       static const bool v = true;
     };
 
+    /**
+     * \brief AlbertaGrid can iterate over all codimensions
+     *
+     * \ingroup AlbertaGrid
+     **/
+    template< int dim, int dimworld, int codim >
+    struct hasEntityIterator< AlbertaGrid< dim, dimworld >, codim >
+    {
+      static const bool v = true;
+    };
+
     /** \brief   AlbertaGrid is not levelwise conforming
      *           (since it uses bisection)
      *  \ingroup AlbertaGrid
diff --git a/dune/grid/common/capabilities.hh b/dune/grid/common/capabilities.hh
index a35a895cb9..c41d3e320e 100644
--- a/dune/grid/common/capabilities.hh
+++ b/dune/grid/common/capabilities.hh
@@ -57,6 +57,22 @@ namespace Dune
       static const bool v = false;
     };
 
+    /**
+     * \brief specialize with 'true' for all codims that a grid provides an iterator for (default=false)
+     *
+     * \note Being able to iterate over a codimension implies that the grid
+     *       provides entities for that codimension.
+     * \note Any fully conforming DUNE grid implementation must be able to
+     *       iterate over all codim 0 entities (i.e., elements).
+     *
+     * \ingroup GICapabilities
+     **/
+    template< class Grid, int codim >
+    struct hasEntityIterator
+    {
+      static const bool v = false;
+    };
+
     /** \brief Specialize with 'false' for all codims that a grid does not
       implement geometries for. (default=true)
         \ingroup GICapabilities
@@ -179,6 +195,12 @@ namespace Dune
       static const bool v = Dune::Capabilities::hasEntity<Grid,codim>::v;
     };
 
+    template< class Grid, int codim >
+    struct hasEntityIterator< const Grid, codim >
+    {
+      static const bool v = Dune::Capabilities::hasEntityIterator< Grid, codim >::v;
+    };
+
     template< class Grid, int codim >
     struct canCommunicate< const Grid, codim >
     {
diff --git a/dune/grid/geometrygrid/capabilities.hh b/dune/grid/geometrygrid/capabilities.hh
index 558948f8e0..b1be6bec4c 100644
--- a/dune/grid/geometrygrid/capabilities.hh
+++ b/dune/grid/geometrygrid/capabilities.hh
@@ -38,6 +38,13 @@ namespace Dune
     };
 
 
+    template< class HostGrid, class CoordFunction, class Allocator, int codim >
+    struct hasEntityIterator< GeometryGrid< HostGrid, CoordFunction, Allocator >, codim >
+    {
+      static const bool v = true;
+    };
+
+
     template< class HostGrid, class CoordFunction, class Allocator, int codim >
     struct canCommunicate< GeometryGrid< HostGrid, CoordFunction, Allocator >, codim >
     {
diff --git a/dune/grid/identitygrid.hh b/dune/grid/identitygrid.hh
index 4c98a0f38e..c8bf0b64d6 100644
--- a/dune/grid/identitygrid.hh
+++ b/dune/grid/identitygrid.hh
@@ -491,6 +491,12 @@ namespace Dune
       static const bool v = hasEntity<HostGrid,codim>::v;
     };
 
+    template<class HostGrid, int codim>
+    struct hasEntityIterator<IdentityGrid<HostGrid>, codim>
+    {
+      static const bool v = hasEntityIterator<HostGrid, codim>::v;
+    };
+
     /** \brief has conforming level grids when host grid has
      * \ingroup IdentityGrid
      */
diff --git a/dune/grid/onedgrid.hh b/dune/grid/onedgrid.hh
index 716cb9d6c6..da6a064473 100644
--- a/dune/grid/onedgrid.hh
+++ b/dune/grid/onedgrid.hh
@@ -435,6 +435,16 @@ namespace Dune {
       static const bool v = true;
     };
 
+    /**
+     * \brief OneDGrid can iterate over all codimensions
+     * \ingroup OneDGrid
+     **/
+    template<int codim>
+    struct hasEntityIterator<OneDGrid, codim>
+    {
+      static const bool v = false;
+    };
+
     /** \brief OneDGrid is levelwise conforming
        \ingroup OneDGrid
      */
diff --git a/dune/grid/uggrid.hh b/dune/grid/uggrid.hh
index 06df2f68da..c71a5d3d60 100644
--- a/dune/grid/uggrid.hh
+++ b/dune/grid/uggrid.hh
@@ -985,6 +985,26 @@ namespace Dune {
       static const bool v = true;
     };
 
+    /**
+     * \brief UGGrid can iterate over codim=0 entities (elements)
+     * \ingroup UGGrid
+     **/
+    template<int dim>
+    struct hasEntityIterator<UGGrid<dim>, 0>
+    {
+      static const bool v = true;
+    };
+
+    /**
+     * \brief UGGrid can iterate over codim=dim entities (vertices)
+     * \ingroup UGGrid
+     **/
+    template<int dim>
+    struct hasEntityIterator<UGGrid<dim>, dim>
+    {
+      static const bool v = true;
+    };
+
     /** \brief UGGrid is levelwise conforming
        \ingroup UGGrid
      */
diff --git a/dune/grid/yaspgrid.hh b/dune/grid/yaspgrid.hh
index df297b8386..b6fac01896 100644
--- a/dune/grid/yaspgrid.hh
+++ b/dune/grid/yaspgrid.hh
@@ -1824,6 +1824,16 @@ namespace Dune {
       static const bool v = true;
     };
 
+    /**
+     * \brief YaspGrid can iterate over all codimensions
+     * \ingroup YaspGrid
+     **/
+    template<int dim, class Coordinates, int codim>
+    struct hasEntityIterator<YaspGrid<dim, Coordinates>, codim>
+    {
+      static const bool v = true;
+    };
+
     /** \brief YaspGrid can communicate on all codimensions
      *  \ingroup YaspGrid
      */
-- 
GitLab