From 45223263b4395e517ca138d46285e244d059b754 Mon Sep 17 00:00:00 2001
From: Jorrit Fahlke <joe@dune-project.org>
Date: Tue, 27 Oct 2009 22:47:33 +0000
Subject: [PATCH] Check that iterator<T> can be compared with iterator<const T>
 as soon as a conversion from iterator<T> to iterator<const T> exists
 (currently fails)

[[Imported from SVN: r5673]]
---
 dune/common/test/Makefile.am            |  6 +++-
 dune/common/test/dummyiterator.hh       | 44 +++++++++++++++++++++++++
 dune/common/test/iteratorfacadetest2.cc | 22 +++++++++++++
 3 files changed, 71 insertions(+), 1 deletion(-)
 create mode 100644 dune/common/test/dummyiterator.hh
 create mode 100644 dune/common/test/iteratorfacadetest2.cc

diff --git a/dune/common/test/Makefile.am b/dune/common/test/Makefile.am
index 97c138a57..5179a1c77 100644
--- a/dune/common/test/Makefile.am
+++ b/dune/common/test/Makefile.am
@@ -2,7 +2,7 @@
 # $Id$
 
 TESTPROGS = parsetest test-stack arraylisttest smartpointertest \
-	sllisttest iteratorfacadetest tuplestest fvectortest fmatrixtest \
+	sllisttest iteratorfacadetest iteratorfacadetest2 tuplestest fvectortest fmatrixtest \
 	poolallocatortest settest gcdlcmtest streamtest \
 	bigunsignedinttest mpihelpertest singletontest mpicollcomm \
 	utilitytest lrutest \
@@ -38,6 +38,8 @@ XFAIL_TESTS = testfassign_fail1 testfassign_fail2 testfassign_fail3 \
 # programs just to build when "make check" is used
 check_PROGRAMS = $(TESTPROGS)
 
+noinst_HEADERS = dummyiterator.hh
+
 AM_LDFLAGS = $(LOCAL_LIBS)
 
 # define the programs
@@ -75,6 +77,8 @@ streamtest_SOURCES = streamtest.cc
 iteratorfacadetest_SOURCES = iteratorfacadetest.cc iteratorfacadetest.hh \
    iteratortest.hh
 
+iteratorfacadetest2_SOURCES = iteratorfacadetest2.cc
+
 fvectortest_SOURCES = fvectortest.cc
 
 fmatrixtest_SOURCES = fmatrixtest.cc
diff --git a/dune/common/test/dummyiterator.hh b/dune/common/test/dummyiterator.hh
new file mode 100644
index 000000000..a06cb539a
--- /dev/null
+++ b/dune/common/test/dummyiterator.hh
@@ -0,0 +1,44 @@
+// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+// vi: set et ts=4 sw=2 sts=2:
+#ifndef DUNE_COMMON_DUMMYITERATOR_HH
+#define DUNE_COMMON_DUMMYITERATOR_HH
+
+#include <cstddef>
+
+#include <dune/common/iteratorfacades.hh>
+#include <dune/common/typetraits.hh>
+
+template<typename T>
+class dummyiterator
+  : public Dune::BidirectionalIteratorFacade<dummyiterator<T>, T, T&,
+        std::ptrdiff_t>
+{
+  friend class dummyiterator<const typename Dune::remove_const<T>::type>;
+
+  T *value;
+
+public:
+  dummyiterator(T& value_)
+    : value(&value_)
+  {}
+
+  template<typename T2>
+  dummyiterator
+    ( const dummyiterator<T2>& o,
+    typename Dune::enable_if<Dune::Conversion<T2&, T&>::exists>::type* = 0)
+    : value(o.value)
+  {}
+
+  T& derefence() const {
+    return *value;
+  }
+
+  bool equals(const dummyiterator& o) const {
+    return value == o.value;
+  }
+
+  void increment() {}
+  void decrement() {}
+};
+
+#endif // DUNE_COMMON_DUMMYITERATOR_HH
diff --git a/dune/common/test/iteratorfacadetest2.cc b/dune/common/test/iteratorfacadetest2.cc
new file mode 100644
index 000000000..cb96fc37e
--- /dev/null
+++ b/dune/common/test/iteratorfacadetest2.cc
@@ -0,0 +1,22 @@
+// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+// vi: set et ts=4 sw=2 sts=2:
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "dummyiterator.hh"
+
+int main(){
+  // Check that iterator<T> can be compared with iterator<const T> as soon as
+  // a conversion from iterator<T> to iterator<const T> exists
+
+  int value = 0;
+  dummyiterator<int> mit(value);
+  dummyiterator<const int> cit(value);
+
+  bool result = mit == cit;
+
+  if(result) return 0;
+  else return 1;
+}
-- 
GitLab