concept_tests.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. #include <iterator>
  9. #include <cstddef>
  10. struct new_random_access
  11. : std::random_access_iterator_tag
  12. , boost::random_access_traversal_tag
  13. {};
  14. struct new_iterator
  15. {
  16. typedef new_random_access iterator_category;
  17. typedef int value_type;
  18. typedef std::ptrdiff_t difference_type;
  19. typedef int* pointer;
  20. typedef int& reference;
  21. int& operator*() const { return *m_x; }
  22. new_iterator& operator++() { return *this; }
  23. new_iterator operator++(int) { return *this; }
  24. new_iterator& operator--() { return *this; }
  25. new_iterator operator--(int) { return *this; }
  26. new_iterator& operator+=(std::ptrdiff_t) { return *this; }
  27. new_iterator operator+(std::ptrdiff_t) { return *this; }
  28. new_iterator& operator-=(std::ptrdiff_t) { return *this; }
  29. std::ptrdiff_t operator-(const new_iterator&) const { return 0; }
  30. new_iterator operator-(std::ptrdiff_t) const { return *this; }
  31. bool operator==(const new_iterator&) const { return false; }
  32. bool operator!=(const new_iterator&) const { return false; }
  33. bool operator<(const new_iterator&) const { return false; }
  34. int* m_x;
  35. };
  36. new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; }
  37. struct old_iterator
  38. {
  39. typedef std::random_access_iterator_tag iterator_category;
  40. typedef int value_type;
  41. typedef std::ptrdiff_t difference_type;
  42. typedef int* pointer;
  43. typedef int& reference;
  44. int& operator*() const { return *m_x; }
  45. old_iterator& operator++() { return *this; }
  46. old_iterator operator++(int) { return *this; }
  47. old_iterator& operator--() { return *this; }
  48. old_iterator operator--(int) { return *this; }
  49. old_iterator& operator+=(std::ptrdiff_t) { return *this; }
  50. old_iterator operator+(std::ptrdiff_t) { return *this; }
  51. old_iterator& operator-=(std::ptrdiff_t) { return *this; }
  52. old_iterator operator-(std::ptrdiff_t) const { return *this; }
  53. std::ptrdiff_t operator-(const old_iterator&) const { return 0; }
  54. bool operator==(const old_iterator&) const { return false; }
  55. bool operator!=(const old_iterator&) const { return false; }
  56. bool operator<(const old_iterator&) const { return false; }
  57. int* m_x;
  58. };
  59. old_iterator operator+(std::ptrdiff_t, old_iterator x) { return x; }
  60. int
  61. main()
  62. {
  63. boost::iterator_traversal<new_iterator>::type tc;
  64. boost::random_access_traversal_tag derived = tc;
  65. (void)derived;
  66. boost::function_requires<
  67. boost_concepts::WritableIteratorConcept<int*> >();
  68. boost::function_requires<
  69. boost_concepts::LvalueIteratorConcept<int*> >();
  70. boost::function_requires<
  71. boost_concepts::RandomAccessTraversalConcept<int*> >();
  72. boost::function_requires<
  73. boost_concepts::ReadableIteratorConcept<const int*> >();
  74. boost::function_requires<
  75. boost_concepts::LvalueIteratorConcept<const int*> >();
  76. boost::function_requires<
  77. boost_concepts::RandomAccessTraversalConcept<const int*> >();
  78. boost::function_requires<
  79. boost_concepts::WritableIteratorConcept<new_iterator> >();
  80. boost::function_requires<
  81. boost_concepts::LvalueIteratorConcept<new_iterator> >();
  82. boost::function_requires<
  83. boost_concepts::RandomAccessTraversalConcept<new_iterator> >();
  84. boost::function_requires<
  85. boost_concepts::WritableIteratorConcept<old_iterator> >();
  86. boost::function_requires<
  87. boost_concepts::LvalueIteratorConcept<old_iterator> >();
  88. boost::function_requires<
  89. boost_concepts::RandomAccessTraversalConcept<old_iterator> >();
  90. boost::function_requires<
  91. boost_concepts::InteroperableIteratorConcept<int*, int const*> >();
  92. return 0;
  93. }