/Src/Dependencies/Boost/libs/iterator/test/concept_tests.cpp

http://hadesmem.googlecode.com/ · C++ · 94 lines · 79 code · 11 blank · 4 comment · 0 complexity · 7a873c509e54743a537ef6a86a107cd3 MD5 · raw file

  1. // (C) Copyright Jeremy Siek 2002.
  2. // Distributed under the Boost Software License, Version 1.0. (See
  3. // accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #include <boost/iterator/iterator_concepts.hpp>
  6. #include <boost/iterator/iterator_categories.hpp>
  7. #include <boost/operators.hpp>
  8. struct new_random_access
  9. : std::random_access_iterator_tag
  10. , boost::random_access_traversal_tag
  11. {};
  12. struct new_iterator
  13. : public boost::iterator< new_random_access, int >
  14. {
  15. int& operator*() const { return *m_x; }
  16. new_iterator& operator++() { return *this; }
  17. new_iterator operator++(int) { return *this; }
  18. new_iterator& operator--() { return *this; }
  19. new_iterator operator--(int) { return *this; }
  20. new_iterator& operator+=(std::ptrdiff_t) { return *this; }
  21. new_iterator operator+(std::ptrdiff_t) { return *this; }
  22. new_iterator& operator-=(std::ptrdiff_t) { return *this; }
  23. std::ptrdiff_t operator-(const new_iterator&) const { return 0; }
  24. new_iterator operator-(std::ptrdiff_t) const { return *this; }
  25. bool operator==(const new_iterator&) const { return false; }
  26. bool operator!=(const new_iterator&) const { return false; }
  27. bool operator<(const new_iterator&) const { return false; }
  28. int* m_x;
  29. };
  30. new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; }
  31. struct old_iterator
  32. : public boost::iterator<std::random_access_iterator_tag, int>
  33. {
  34. int& operator*() const { return *m_x; }
  35. old_iterator& operator++() { return *this; }
  36. old_iterator operator++(int) { return *this; }
  37. old_iterator& operator--() { return *this; }
  38. old_iterator operator--(int) { return *this; }
  39. old_iterator& operator+=(std::ptrdiff_t) { return *this; }
  40. old_iterator operator+(std::ptrdiff_t) { return *this; }
  41. old_iterator& operator-=(std::ptrdiff_t) { return *this; }
  42. old_iterator operator-(std::ptrdiff_t) const { return *this; }
  43. std::ptrdiff_t operator-(const old_iterator&) const { return 0; }
  44. bool operator==(const old_iterator&) const { return false; }
  45. bool operator!=(const old_iterator&) const { return false; }
  46. bool operator<(const old_iterator&) const { return false; }
  47. int* m_x;
  48. };
  49. old_iterator operator+(std::ptrdiff_t, old_iterator x) { return x; }
  50. int
  51. main()
  52. {
  53. boost::iterator_traversal<new_iterator>::type tc;
  54. boost::random_access_traversal_tag derived = tc;
  55. (void)derived;
  56. boost::function_requires<
  57. boost_concepts::WritableIteratorConcept<int*> >();
  58. boost::function_requires<
  59. boost_concepts::LvalueIteratorConcept<int*> >();
  60. boost::function_requires<
  61. boost_concepts::RandomAccessTraversalConcept<int*> >();
  62. boost::function_requires<
  63. boost_concepts::ReadableIteratorConcept<const int*> >();
  64. boost::function_requires<
  65. boost_concepts::LvalueIteratorConcept<const int*> >();
  66. boost::function_requires<
  67. boost_concepts::RandomAccessTraversalConcept<const int*> >();
  68. boost::function_requires<
  69. boost_concepts::WritableIteratorConcept<new_iterator> >();
  70. boost::function_requires<
  71. boost_concepts::LvalueIteratorConcept<new_iterator> >();
  72. boost::function_requires<
  73. boost_concepts::RandomAccessTraversalConcept<new_iterator> >();
  74. boost::function_requires<
  75. boost_concepts::WritableIteratorConcept<old_iterator> >();
  76. boost::function_requires<
  77. boost_concepts::LvalueIteratorConcept<old_iterator> >();
  78. boost::function_requires<
  79. boost_concepts::RandomAccessTraversalConcept<old_iterator> >();
  80. boost::function_requires<
  81. boost_concepts::InteroperableIteratorConcept<int*, int const*> >();
  82. return 0;
  83. }