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