is_readable_iterator.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright David Abrahams 2003. Use, modification and distribution is
  2. // subject to the Boost Software License, Version 1.0. (See accompanying
  3. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #include <deque>
  5. #include <iterator>
  6. #include <iostream>
  7. #include <cstddef> // std::ptrdiff_t
  8. #include <boost/static_assert.hpp>
  9. #include <boost/noncopyable.hpp>
  10. #include <boost/iterator/is_readable_iterator.hpp>
  11. // Last, for BOOST_NO_LVALUE_RETURN_DETECTION
  12. #include <boost/iterator/detail/config_def.hpp>
  13. struct v
  14. {
  15. v();
  16. ~v();
  17. };
  18. struct value_iterator
  19. {
  20. typedef std::input_iterator_tag iterator_category;
  21. typedef v value_type;
  22. typedef std::ptrdiff_t difference_type;
  23. typedef v* pointer;
  24. typedef v& reference;
  25. v operator*() const;
  26. };
  27. struct noncopyable_iterator
  28. {
  29. typedef std::forward_iterator_tag iterator_category;
  30. typedef boost::noncopyable value_type;
  31. typedef std::ptrdiff_t difference_type;
  32. typedef boost::noncopyable* pointer;
  33. typedef boost::noncopyable& reference;
  34. boost::noncopyable const& operator*() const;
  35. };
  36. struct proxy_iterator
  37. {
  38. typedef std::output_iterator_tag iterator_category;
  39. typedef v value_type;
  40. typedef std::ptrdiff_t difference_type;
  41. typedef v* pointer;
  42. typedef v& reference;
  43. struct proxy
  44. {
  45. operator v&();
  46. proxy& operator=(v) const;
  47. };
  48. proxy operator*() const;
  49. };
  50. struct proxy_iterator2
  51. {
  52. typedef std::output_iterator_tag iterator_category;
  53. typedef v value_type;
  54. typedef std::ptrdiff_t difference_type;
  55. typedef v* pointer;
  56. typedef v& reference;
  57. struct proxy
  58. {
  59. proxy& operator=(v) const;
  60. };
  61. proxy operator*() const;
  62. };
  63. int main()
  64. {
  65. BOOST_STATIC_ASSERT(boost::is_readable_iterator<v*>::value);
  66. BOOST_STATIC_ASSERT(boost::is_readable_iterator<v const*>::value);
  67. BOOST_STATIC_ASSERT(boost::is_readable_iterator<std::deque<v>::iterator>::value);
  68. BOOST_STATIC_ASSERT(boost::is_readable_iterator<std::deque<v>::const_iterator>::value);
  69. BOOST_STATIC_ASSERT(!boost::is_readable_iterator<std::back_insert_iterator<std::deque<v> > >::value);
  70. BOOST_STATIC_ASSERT(!boost::is_readable_iterator<std::ostream_iterator<v> >::value);
  71. BOOST_STATIC_ASSERT(boost::is_readable_iterator<proxy_iterator>::value);
  72. BOOST_STATIC_ASSERT(!boost::is_readable_iterator<proxy_iterator2>::value);
  73. BOOST_STATIC_ASSERT(boost::is_readable_iterator<value_iterator>::value);
  74. // Make sure inaccessible copy constructor doesn't prevent
  75. // readability
  76. BOOST_STATIC_ASSERT(boost::is_readable_iterator<noncopyable_iterator>::value);
  77. return 0;
  78. }