unit_tests.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright David Abrahams 2003.
  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_adaptor.hpp>
  6. #include <boost/static_assert.hpp>
  7. #include "static_assert_same.hpp"
  8. #include <boost/iterator/minimum_category.hpp>
  9. struct X { int a; };
  10. struct Xiter : boost::iterator_adaptor<Xiter,X*>
  11. {
  12. Xiter();
  13. Xiter(X* p) : boost::iterator_adaptor<Xiter, X*>(p) {}
  14. };
  15. void take_xptr(X*) {}
  16. void operator_arrow_test()
  17. {
  18. // check that the operator-> result is a pointer for lvalue iterators
  19. X x;
  20. take_xptr(Xiter(&x).operator->());
  21. }
  22. template <class T, class U, class Min>
  23. struct static_assert_min_cat
  24. : static_assert_same<
  25. typename boost::iterators::minimum_category<T,U>::type, Min
  26. >
  27. {};
  28. void category_test()
  29. {
  30. using namespace boost::iterators;
  31. using namespace boost::iterators::detail;
  32. BOOST_STATIC_ASSERT((
  33. !boost::is_convertible<
  34. std::input_iterator_tag
  35. , input_output_iterator_tag>::value));
  36. BOOST_STATIC_ASSERT((
  37. !boost::is_convertible<
  38. std::output_iterator_tag
  39. , input_output_iterator_tag>::value));
  40. BOOST_STATIC_ASSERT((
  41. boost::is_convertible<
  42. input_output_iterator_tag
  43. , std::input_iterator_tag>::value));
  44. BOOST_STATIC_ASSERT((
  45. boost::is_convertible<
  46. input_output_iterator_tag
  47. , std::output_iterator_tag>::value));
  48. #if 0 // This seems wrong; we're not advertising
  49. // input_output_iterator_tag are we?
  50. BOOST_STATIC_ASSERT((
  51. boost::is_convertible<
  52. std::forward_iterator_tag
  53. , input_output_iterator_tag>::value));
  54. #endif
  55. int test = static_assert_min_cat<
  56. std::input_iterator_tag,input_output_iterator_tag, std::input_iterator_tag
  57. >::value;
  58. test = static_assert_min_cat<
  59. input_output_iterator_tag,std::input_iterator_tag, std::input_iterator_tag
  60. >::value;
  61. #if 0
  62. test = static_assert_min_cat<
  63. input_output_iterator_tag,std::forward_iterator_tag, input_output_iterator_tag
  64. >::value;
  65. #endif
  66. test = static_assert_min_cat<
  67. std::input_iterator_tag,std::forward_iterator_tag, std::input_iterator_tag
  68. >::value;
  69. test = static_assert_min_cat<
  70. std::input_iterator_tag,std::random_access_iterator_tag, std::input_iterator_tag
  71. >::value;
  72. #if 0 // This would be wrong: a random access iterator is not
  73. // neccessarily writable, as is an output iterator.
  74. test = static_assert_min_cat<
  75. std::output_iterator_tag,std::random_access_iterator_tag, std::output_iterator_tag
  76. >::value;
  77. #endif
  78. (void)test;
  79. }
  80. int main()
  81. {
  82. category_test();
  83. operator_arrow_test();
  84. return 0;
  85. }