From 0870e6495aee63ee94463c1ac92c09581c60ab35 Mon Sep 17 00:00:00 2001
From: Andreas Dedner <dedner@dune-project.org>
Date: Sun, 22 Feb 2009 10:02:03 +0000
Subject: [PATCH] is used in dune-grid (alberta,alu, and
 grid/dcommon/defaultindexsets.hh

[[Imported from SVN: r5444]]
---
 common/interfaces.hh | 64 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 64 insertions(+)
 create mode 100644 common/interfaces.hh

diff --git a/common/interfaces.hh b/common/interfaces.hh
new file mode 100644
index 000000000..26710cbe7
--- /dev/null
+++ b/common/interfaces.hh
@@ -0,0 +1,64 @@
+// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+// vi: set et ts=4 sw=2 sts=2:
+#ifndef DUNE_INTERFACES_HH
+#define DUNE_INTERFACES_HH
+
+#include "typetraits.hh"
+
+/** @file
+   @author Robert Kloefkorn
+   @brief Provides a Interfaces for detection of specific behavior
+ */
+
+namespace Dune {
+
+  //! An interface class for cloneable objects
+  struct Cloneable {
+
+    /** \brief Clones the object
+       clone needs to be redefined by an implementation class, with the
+       return type covariantly adapted. Remember to
+       delete the resulting pointer.
+     */
+    virtual Cloneable* clone() const = 0;
+
+    /** \brief Destructor */
+    virtual ~Cloneable()
+    {}
+
+  };
+
+  //! Tagging interface to indicate that Grid provides typedef ObjectStreamType
+  struct HasObjectStream {};
+
+  //! Helper template (implicit specialisation if GridImp exports an object
+  //! stream
+  template <bool hasStream, class GridImp, class DefaultImp>
+  struct GridObjectStreamOrDefaultHelper {
+    typedef typename GridImp::ObjectStreamType ObjectStreamType;
+  };
+
+  //! Helper template (explicit specialisation if GridImp doesn't export an
+  //! object stream -> DefaultImplementation is exported)
+  template <class GridImp, class DefaultImp>
+  struct GridObjectStreamOrDefaultHelper<false, GridImp, DefaultImp> {
+    typedef DefaultImp ObjectStreamType;
+  };
+
+  //! Template to choose right Object stream type for a given class
+  template <class GridImp, class DefaultImp>
+  struct GridObjectStreamOrDefault {
+    typedef typename GridObjectStreamOrDefaultHelper<
+        Conversion<GridImp, HasObjectStream>::exists,
+        GridImp,
+        DefaultImp>::ObjectStreamType ObjectStreamType;
+  };
+
+  //! Tagging interface to indicate that class is of Type DofManager
+  struct IsDofManager {};
+
+  //! Tagging interface to indicate that Grid has HierarchicIndexSet
+  struct HasHierarchicIndexSet {};
+
+} // end namespace Dune
+#endif
-- 
GitLab