]> git.lyx.org Git - lyx.git/blobdiff - boost/boost/iterator/new_iterator_tests.hpp
Don't allow newline characters in document settings.
[lyx.git] / boost / boost / iterator / new_iterator_tests.hpp
index a6a95eb7866df12d759c46bbf3fbb95bcbfd28f4..caad700aef5747de329df17efe7a7722fcf74f44 100644 (file)
-#ifndef BOOST_NEW_ITERATOR_TESTS_HPP\r
-# define BOOST_NEW_ITERATOR_TESTS_HPP\r
-\r
-//\r
-// Copyright (c) David Abrahams 2001.\r
-// Copyright (c) Jeremy Siek 2001-2003.\r
-// Copyright (c) Thomas Witt 2002.\r
-//\r
-// Use, modification and distribution is subject to the\r
-// Boost Software License, Version 1.0.\r
-// (See accompanying file LICENSE_1_0.txt or copy at\r
-// http://www.boost.org/LICENSE_1_0.txt)\r
-//\r
-\r
-// This is meant to be the beginnings of a comprehensive, generic\r
-// test suite for STL concepts such as iterators and containers.\r
-//\r
-// Revision History:\r
-// 28 Oct 2002  Started update for new iterator categories\r
-//              (Jeremy Siek)\r
-// 28 Apr 2002  Fixed input iterator requirements.\r
-//              For a == b a++ == b++ is no longer required.\r
-//              See 24.1.1/3 for details.\r
-//              (Thomas Witt)\r
-// 08 Feb 2001  Fixed bidirectional iterator test so that\r
-//              --i is no longer a precondition.\r
-//              (Jeremy Siek)\r
-// 04 Feb 2001  Added lvalue test, corrected preconditions\r
-//              (David Abrahams)\r
-\r
-# include <iterator>\r
-# include <boost/type_traits.hpp>\r
-# include <boost/static_assert.hpp>\r
-# include <boost/concept_archetype.hpp> // for detail::dummy_constructor\r
-# include <boost/detail/iterator.hpp>\r
-# include <boost/pending/iterator_tests.hpp>\r
-# include <boost/iterator/is_readable_iterator.hpp>\r
-# include <boost/iterator/is_lvalue_iterator.hpp>\r
-\r
-# include <boost/iterator/detail/config_def.hpp>\r
-# include <boost/detail/is_incrementable.hpp>\r
-# include <boost/detail/lightweight_test.hpp>\r
-\r
-namespace boost {\r
-\r
-\r
-// Do separate tests for *i++ so we can treat, e.g., smart pointers,\r
-// as readable and/or writable iterators.\r
-template <class Iterator, class T>\r
-void readable_iterator_traversal_test(Iterator i1, T v, mpl::true_)\r
-{\r
-    T v2(*i1++);\r
-    BOOST_TEST(v == v2);\r
-}\r
-\r
-template <class Iterator, class T>\r
-void readable_iterator_traversal_test(const Iterator i1, T v, mpl::false_)\r
-{}\r
-\r
-template <class Iterator, class T>\r
-void writable_iterator_traversal_test(Iterator i1, T v, mpl::true_)\r
-{\r
-    ++i1;  // we just wrote into that position\r
-    *i1++ = v;\r
-    Iterator x(i1++);\r
-    (void)x;\r
-}\r
-\r
-template <class Iterator, class T>\r
-void writable_iterator_traversal_test(const Iterator i1, T v, mpl::false_)\r
-{}\r
-\r
-\r
-// Preconditions: *i == v\r
-template <class Iterator, class T>\r
-void readable_iterator_test(const Iterator i1, T v)\r
-{\r
-  Iterator i2(i1); // Copy Constructible\r
-  typedef typename detail::iterator_traits<Iterator>::reference ref_t;\r
-  ref_t r1 = *i1;\r
-  ref_t r2 = *i2;\r
-  T v1 = r1;\r
-  T v2 = r2;\r
-  BOOST_TEST(v1 == v);\r
-  BOOST_TEST(v2 == v);\r
-\r
-# if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407)\r
-  readable_iterator_traversal_test(i1, v, detail::is_postfix_incrementable<Iterator>());\r
-      \r
-  // I think we don't really need this as it checks the same things as\r
-  // the above code.\r
-  BOOST_STATIC_ASSERT(is_readable_iterator<Iterator>::value);\r
-# endif \r
-}\r
-\r
-template <class Iterator, class T>\r
-void writable_iterator_test(Iterator i, T v, T v2)\r
-{\r
-  Iterator i2(i); // Copy Constructible\r
-  *i2 = v;\r
-\r
-# if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407)\r
-  writable_iterator_traversal_test(\r
-      i, v2, mpl::and_<\r
-          detail::is_incrementable<Iterator>\r
-        , detail::is_postfix_incrementable<Iterator>\r
-      >());\r
-# endif \r
-}\r
-\r
-template <class Iterator>\r
-void swappable_iterator_test(Iterator i, Iterator j)\r
-{\r
-  Iterator i2(i), j2(j);\r
-  typename detail::iterator_traits<Iterator>::value_type bi = *i, bj = *j;\r
-  iter_swap(i2, j2);\r
-  typename detail::iterator_traits<Iterator>::value_type ai = *i, aj = *j;\r
-  BOOST_TEST(bi == aj && bj == ai);\r
-}\r
-\r
-template <class Iterator, class T>\r
-void constant_lvalue_iterator_test(Iterator i, T v1)\r
-{\r
-  Iterator i2(i);\r
-  typedef typename detail::iterator_traits<Iterator>::value_type value_type;\r
-  typedef typename detail::iterator_traits<Iterator>::reference reference;\r
-  BOOST_STATIC_ASSERT((is_same<const value_type&, reference>::value));\r
-  const T& v2 = *i2;\r
-  BOOST_TEST(v1 == v2);\r
-# ifndef BOOST_NO_LVALUE_RETURN_DETECTION\r
-  BOOST_STATIC_ASSERT(is_lvalue_iterator<Iterator>::value);\r
-  BOOST_STATIC_ASSERT(!is_non_const_lvalue_iterator<Iterator>::value);\r
-# endif \r
-}\r
-\r
-template <class Iterator, class T>\r
-void non_const_lvalue_iterator_test(Iterator i, T v1, T v2)\r
-{\r
-  Iterator i2(i);\r
-  typedef typename detail::iterator_traits<Iterator>::value_type value_type;\r
-  typedef typename detail::iterator_traits<Iterator>::reference reference;\r
-  BOOST_STATIC_ASSERT((is_same<value_type&, reference>::value));\r
-  T& v3 = *i2;\r
-  BOOST_TEST(v1 == v3);\r
-  \r
-  // A non-const lvalue iterator is not neccessarily writable, but we\r
-  // are assuming the value_type is assignable here\r
-  *i = v2;\r
-  \r
-  T& v4 = *i2;\r
-  BOOST_TEST(v2 == v4);\r
-# ifndef BOOST_NO_LVALUE_RETURN_DETECTION\r
-  BOOST_STATIC_ASSERT(is_lvalue_iterator<Iterator>::value);\r
-  BOOST_STATIC_ASSERT(is_non_const_lvalue_iterator<Iterator>::value);\r
-# endif \r
-}\r
-\r
-template <class Iterator, class T>\r
-void forward_readable_iterator_test(Iterator i, Iterator j, T val1, T val2)\r
-{\r
-  Iterator i2;\r
-  Iterator i3(i);\r
-  i2 = i;\r
-  BOOST_TEST(i2 == i3);\r
-  BOOST_TEST(i != j);\r
-  BOOST_TEST(i2 != j);\r
-  readable_iterator_test(i, val1);\r
-  readable_iterator_test(i2, val1);\r
-  readable_iterator_test(i3, val1);\r
-\r
-  BOOST_TEST(i == i2++);\r
-  BOOST_TEST(i != ++i3);\r
-\r
-  readable_iterator_test(i2, val2);\r
-  readable_iterator_test(i3, val2);\r
-\r
-  readable_iterator_test(i, val1);\r
-}\r
-\r
-template <class Iterator, class T>\r
-void forward_swappable_iterator_test(Iterator i, Iterator j, T val1, T val2)\r
-{\r
-  forward_readable_iterator_test(i, j, val1, val2);\r
-  Iterator i2 = i;\r
-  ++i2;\r
-  swappable_iterator_test(i, i2);\r
-}\r
-\r
-// bidirectional\r
-// Preconditions: *i == v1, *++i == v2\r
-template <class Iterator, class T>\r
-void bidirectional_readable_iterator_test(Iterator i, T v1, T v2)\r
-{\r
-  Iterator j(i);\r
-  ++j;\r
-  forward_readable_iterator_test(i, j, v1, v2);\r
-  ++i;\r
-\r
-  Iterator i1 = i, i2 = i;\r
-\r
-  BOOST_TEST(i == i1--);\r
-  BOOST_TEST(i != --i2);\r
-\r
-  readable_iterator_test(i, v2);\r
-  readable_iterator_test(i1, v1);\r
-  readable_iterator_test(i2, v1);\r
-\r
-  --i;\r
-  BOOST_TEST(i == i1);\r
-  BOOST_TEST(i == i2);\r
-  ++i1;\r
-  ++i2;\r
-\r
-  readable_iterator_test(i, v1);\r
-  readable_iterator_test(i1, v2);\r
-  readable_iterator_test(i2, v2);\r
-}\r
-\r
-// random access\r
-// Preconditions: [i,i+N) is a valid range\r
-template <class Iterator, class TrueVals>\r
-void random_access_readable_iterator_test(Iterator i, int N, TrueVals vals)\r
-{\r
-  bidirectional_readable_iterator_test(i, vals[0], vals[1]);\r
-  const Iterator j = i;\r
-  int c;\r
-\r
-  for (c = 0; c < N-1; ++c)\r
-  {\r
-    BOOST_TEST(i == j + c);\r
-    BOOST_TEST(*i == vals[c]);\r
-    typename detail::iterator_traits<Iterator>::value_type x = j[c];\r
-    BOOST_TEST(*i == x);\r
-    BOOST_TEST(*i == *(j + c));\r
-    BOOST_TEST(*i == *(c + j));\r
-    ++i;\r
-    BOOST_TEST(i > j);\r
-    BOOST_TEST(i >= j);\r
-    BOOST_TEST(j <= i);\r
-    BOOST_TEST(j < i);\r
-  }\r
-\r
-  Iterator k = j + N - 1;\r
-  for (c = 0; c < N-1; ++c)\r
-  {\r
-    BOOST_TEST(i == k - c);\r
-    BOOST_TEST(*i == vals[N - 1 - c]);\r
-    typename detail::iterator_traits<Iterator>::value_type x = j[N - 1 - c];\r
-    BOOST_TEST(*i == x);\r
-    Iterator q = k - c; \r
-    BOOST_TEST(*i == *q);\r
-    BOOST_TEST(i > j);\r
-    BOOST_TEST(i >= j);\r
-    BOOST_TEST(j <= i);\r
-    BOOST_TEST(j < i);\r
-    --i;\r
-  }\r
-}\r
-\r
-} // namespace boost\r
-\r
-# include <boost/iterator/detail/config_undef.hpp>\r
-\r
-#endif // BOOST_NEW_ITERATOR_TESTS_HPP\r
+#ifndef BOOST_NEW_ITERATOR_TESTS_HPP
+# define BOOST_NEW_ITERATOR_TESTS_HPP
+
+//
+// Copyright (c) David Abrahams 2001.
+// Copyright (c) Jeremy Siek 2001-2003.
+// Copyright (c) Thomas Witt 2002.
+//
+// Use, modification and distribution is subject to the
+// Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// This is meant to be the beginnings of a comprehensive, generic
+// test suite for STL concepts such as iterators and containers.
+//
+// Revision History:
+// 28 Oct 2002  Started update for new iterator categories
+//              (Jeremy Siek)
+// 28 Apr 2002  Fixed input iterator requirements.
+//              For a == b a++ == b++ is no longer required.
+//              See 24.1.1/3 for details.
+//              (Thomas Witt)
+// 08 Feb 2001  Fixed bidirectional iterator test so that
+//              --i is no longer a precondition.
+//              (Jeremy Siek)
+// 04 Feb 2001  Added lvalue test, corrected preconditions
+//              (David Abrahams)
+
+# include <iterator>
+# include <boost/type_traits.hpp>
+# include <boost/static_assert.hpp>
+# include <boost/concept_archetype.hpp> // for detail::dummy_constructor
+# include <boost/detail/iterator.hpp>
+# include <boost/pending/iterator_tests.hpp>
+# include <boost/iterator/is_readable_iterator.hpp>
+# include <boost/iterator/is_lvalue_iterator.hpp>
+
+# include <boost/iterator/detail/config_def.hpp>
+# include <boost/detail/is_incrementable.hpp>
+# include <boost/detail/lightweight_test.hpp>
+
+namespace boost {
+
+
+// Do separate tests for *i++ so we can treat, e.g., smart pointers,
+// as readable and/or writable iterators.
+template <class Iterator, class T>
+void readable_iterator_traversal_test(Iterator i1, T v, mpl::true_)
+{
+    T v2(*i1++);
+    BOOST_TEST(v == v2);
+}
+
+template <class Iterator, class T>
+void readable_iterator_traversal_test(const Iterator i1, T v, mpl::false_)
+{}
+
+template <class Iterator, class T>
+void writable_iterator_traversal_test(Iterator i1, T v, mpl::true_)
+{
+    ++i1;  // we just wrote into that position
+    *i1++ = v;
+    Iterator x(i1++);
+    (void)x;
+}
+
+template <class Iterator, class T>
+void writable_iterator_traversal_test(const Iterator i1, T v, mpl::false_)
+{}
+
+
+// Preconditions: *i == v
+template <class Iterator, class T>
+void readable_iterator_test(const Iterator i1, T v)
+{
+  Iterator i2(i1); // Copy Constructible
+  typedef typename detail::iterator_traits<Iterator>::reference ref_t;
+  ref_t r1 = *i1;
+  ref_t r2 = *i2;
+  T v1 = r1;
+  T v2 = r2;
+  BOOST_TEST(v1 == v);
+  BOOST_TEST(v2 == v);
+
+# if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407)
+  readable_iterator_traversal_test(i1, v, detail::is_postfix_incrementable<Iterator>());
+      
+  // I think we don't really need this as it checks the same things as
+  // the above code.
+  BOOST_STATIC_ASSERT(is_readable_iterator<Iterator>::value);
+# endif 
+}
+
+template <class Iterator, class T>
+void writable_iterator_test(Iterator i, T v, T v2)
+{
+  Iterator i2(i); // Copy Constructible
+  *i2 = v;
+
+# if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407)
+  writable_iterator_traversal_test(
+      i, v2, mpl::and_<
+          detail::is_incrementable<Iterator>
+        , detail::is_postfix_incrementable<Iterator>
+      >());
+# endif 
+}
+
+template <class Iterator>
+void swappable_iterator_test(Iterator i, Iterator j)
+{
+  Iterator i2(i), j2(j);
+  typename detail::iterator_traits<Iterator>::value_type bi = *i, bj = *j;
+  iter_swap(i2, j2);
+  typename detail::iterator_traits<Iterator>::value_type ai = *i, aj = *j;
+  BOOST_TEST(bi == aj && bj == ai);
+}
+
+template <class Iterator, class T>
+void constant_lvalue_iterator_test(Iterator i, T v1)
+{
+  Iterator i2(i);
+  typedef typename detail::iterator_traits<Iterator>::value_type value_type;
+  typedef typename detail::iterator_traits<Iterator>::reference reference;
+  BOOST_STATIC_ASSERT((is_same<const value_type&, reference>::value));
+  const T& v2 = *i2;
+  BOOST_TEST(v1 == v2);
+# ifndef BOOST_NO_LVALUE_RETURN_DETECTION
+  BOOST_STATIC_ASSERT(is_lvalue_iterator<Iterator>::value);
+  BOOST_STATIC_ASSERT(!is_non_const_lvalue_iterator<Iterator>::value);
+# endif 
+}
+
+template <class Iterator, class T>
+void non_const_lvalue_iterator_test(Iterator i, T v1, T v2)
+{
+  Iterator i2(i);
+  typedef typename detail::iterator_traits<Iterator>::value_type value_type;
+  typedef typename detail::iterator_traits<Iterator>::reference reference;
+  BOOST_STATIC_ASSERT((is_same<value_type&, reference>::value));
+  T& v3 = *i2;
+  BOOST_TEST(v1 == v3);
+  
+  // A non-const lvalue iterator is not neccessarily writable, but we
+  // are assuming the value_type is assignable here
+  *i = v2;
+  
+  T& v4 = *i2;
+  BOOST_TEST(v2 == v4);
+# ifndef BOOST_NO_LVALUE_RETURN_DETECTION
+  BOOST_STATIC_ASSERT(is_lvalue_iterator<Iterator>::value);
+  BOOST_STATIC_ASSERT(is_non_const_lvalue_iterator<Iterator>::value);
+# endif 
+}
+
+template <class Iterator, class T>
+void forward_readable_iterator_test(Iterator i, Iterator j, T val1, T val2)
+{
+  Iterator i2;
+  Iterator i3(i);
+  i2 = i;
+  BOOST_TEST(i2 == i3);
+  BOOST_TEST(i != j);
+  BOOST_TEST(i2 != j);
+  readable_iterator_test(i, val1);
+  readable_iterator_test(i2, val1);
+  readable_iterator_test(i3, val1);
+
+  BOOST_TEST(i == i2++);
+  BOOST_TEST(i != ++i3);
+
+  readable_iterator_test(i2, val2);
+  readable_iterator_test(i3, val2);
+
+  readable_iterator_test(i, val1);
+}
+
+template <class Iterator, class T>
+void forward_swappable_iterator_test(Iterator i, Iterator j, T val1, T val2)
+{
+  forward_readable_iterator_test(i, j, val1, val2);
+  Iterator i2 = i;
+  ++i2;
+  swappable_iterator_test(i, i2);
+}
+
+// bidirectional
+// Preconditions: *i == v1, *++i == v2
+template <class Iterator, class T>
+void bidirectional_readable_iterator_test(Iterator i, T v1, T v2)
+{
+  Iterator j(i);
+  ++j;
+  forward_readable_iterator_test(i, j, v1, v2);
+  ++i;
+
+  Iterator i1 = i, i2 = i;
+
+  BOOST_TEST(i == i1--);
+  BOOST_TEST(i != --i2);
+
+  readable_iterator_test(i, v2);
+  readable_iterator_test(i1, v1);
+  readable_iterator_test(i2, v1);
+
+  --i;
+  BOOST_TEST(i == i1);
+  BOOST_TEST(i == i2);
+  ++i1;
+  ++i2;
+
+  readable_iterator_test(i, v1);
+  readable_iterator_test(i1, v2);
+  readable_iterator_test(i2, v2);
+}
+
+// random access
+// Preconditions: [i,i+N) is a valid range
+template <class Iterator, class TrueVals>
+void random_access_readable_iterator_test(Iterator i, int N, TrueVals vals)
+{
+  bidirectional_readable_iterator_test(i, vals[0], vals[1]);
+  const Iterator j = i;
+  int c;
+
+  for (c = 0; c < N-1; ++c)
+  {
+    BOOST_TEST(i == j + c);
+    BOOST_TEST(*i == vals[c]);
+    typename detail::iterator_traits<Iterator>::value_type x = j[c];
+    BOOST_TEST(*i == x);
+    BOOST_TEST(*i == *(j + c));
+    BOOST_TEST(*i == *(c + j));
+    ++i;
+    BOOST_TEST(i > j);
+    BOOST_TEST(i >= j);
+    BOOST_TEST(j <= i);
+    BOOST_TEST(j < i);
+  }
+
+  Iterator k = j + N - 1;
+  for (c = 0; c < N-1; ++c)
+  {
+    BOOST_TEST(i == k - c);
+    BOOST_TEST(*i == vals[N - 1 - c]);
+    typename detail::iterator_traits<Iterator>::value_type x = j[N - 1 - c];
+    BOOST_TEST(*i == x);
+    Iterator q = k - c; 
+    BOOST_TEST(*i == *q);
+    BOOST_TEST(i > j);
+    BOOST_TEST(i >= j);
+    BOOST_TEST(j <= i);
+    BOOST_TEST(j < i);
+    --i;
+  }
+}
+
+} // namespace boost
+
+# include <boost/iterator/detail/config_undef.hpp>
+
+#endif // BOOST_NEW_ITERATOR_TESTS_HPP