indirect_iter_member_types.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // (C) Copyright Jeremy Siek 2004.
  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. // Revision History
  6. // 03 Jan 2004 Jeremy Siek
  7. // First draft.
  8. #include <boost/config.hpp>
  9. #include <iostream>
  10. #include <boost/iterator/indirect_iterator.hpp>
  11. #include <boost/static_assert.hpp>
  12. #include "static_assert_same.hpp"
  13. #include <boost/type_traits/same_traits.hpp>
  14. struct zow { };
  15. struct my_ptr {
  16. typedef zow const element_type;
  17. zow const& operator*() const;
  18. // typedef const zow& reference;
  19. // typedef const zow* pointer;
  20. // typedef void difference_type;
  21. // typedef boost::no_traversal_tag iterator_category;
  22. };
  23. // Borland 5.6.4 and earlier drop const all over the place, so this
  24. // test will fail in the lines marked with (**)
  25. int main()
  26. {
  27. {
  28. typedef boost::indirect_iterator<int**> Iter;
  29. STATIC_ASSERT_SAME(Iter::value_type, int);
  30. STATIC_ASSERT_SAME(Iter::reference, int&);
  31. STATIC_ASSERT_SAME(Iter::pointer, int*);
  32. STATIC_ASSERT_SAME(Iter::difference_type, std::ptrdiff_t);
  33. BOOST_STATIC_ASSERT((boost::is_convertible<Iter::iterator_category,
  34. std::random_access_iterator_tag>::value));
  35. BOOST_STATIC_ASSERT((boost::is_convertible<boost::iterator_traversal<Iter>::type,
  36. boost::random_access_traversal_tag>::value));
  37. }
  38. {
  39. typedef boost::indirect_iterator<int const**> Iter;
  40. STATIC_ASSERT_SAME(Iter::value_type, int);
  41. STATIC_ASSERT_SAME(Iter::reference, const int&);
  42. STATIC_ASSERT_SAME(Iter::pointer, const int*); // (**)
  43. }
  44. {
  45. typedef boost::indirect_iterator<int**, int> Iter;
  46. STATIC_ASSERT_SAME(Iter::value_type, int);
  47. STATIC_ASSERT_SAME(Iter::reference, int&);
  48. STATIC_ASSERT_SAME(Iter::pointer, int*);
  49. }
  50. {
  51. typedef boost::indirect_iterator<int**, const int> Iter;
  52. STATIC_ASSERT_SAME(Iter::value_type, int);
  53. STATIC_ASSERT_SAME(Iter::reference, const int&);
  54. STATIC_ASSERT_SAME(Iter::pointer, const int*); // (**)
  55. }
  56. {
  57. typedef boost::indirect_iterator<my_ptr*> Iter;
  58. STATIC_ASSERT_SAME(Iter::value_type, zow);
  59. STATIC_ASSERT_SAME(Iter::reference, const zow&); // (**)
  60. STATIC_ASSERT_SAME(Iter::pointer, const zow*); // (**)
  61. STATIC_ASSERT_SAME(Iter::difference_type, std::ptrdiff_t);
  62. BOOST_STATIC_ASSERT((boost::is_convertible<Iter::iterator_category,
  63. std::random_access_iterator_tag>::value));
  64. BOOST_STATIC_ASSERT((boost::is_convertible<boost::iterator_traversal<Iter>::type,
  65. boost::random_access_traversal_tag>::value));
  66. }
  67. {
  68. typedef boost::indirect_iterator<char**, int, std::random_access_iterator_tag, long&, short> Iter;
  69. STATIC_ASSERT_SAME(Iter::value_type, int);
  70. STATIC_ASSERT_SAME(Iter::reference, long&);
  71. STATIC_ASSERT_SAME(Iter::pointer, int*);
  72. STATIC_ASSERT_SAME(Iter::difference_type, short);
  73. }
  74. return 0;
  75. }