indirect_iterator.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // (C) Copyright David Abrahams 2002.
  2. // (C) Copyright Jeremy Siek 2002.
  3. // (C) Copyright Thomas Witt 2002.
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. #ifndef BOOST_INDIRECT_ITERATOR_23022003THW_HPP
  8. #define BOOST_INDIRECT_ITERATOR_23022003THW_HPP
  9. #include <boost/iterator.hpp>
  10. #include <boost/iterator/iterator_adaptor.hpp>
  11. #include <boost/pointee.hpp>
  12. #include <boost/indirect_reference.hpp>
  13. #include <boost/detail/iterator.hpp>
  14. #include <boost/detail/indirect_traits.hpp>
  15. #include <boost/type_traits/is_same.hpp>
  16. #include <boost/type_traits/add_reference.hpp>
  17. #include <boost/mpl/bool.hpp>
  18. #include <boost/mpl/identity.hpp>
  19. #include <boost/mpl/eval_if.hpp>
  20. #include <boost/mpl/not.hpp>
  21. #include <boost/mpl/has_xxx.hpp>
  22. #ifdef BOOST_MPL_CFG_NO_HAS_XXX
  23. # include <boost/shared_ptr.hpp>
  24. # include <boost/scoped_ptr.hpp>
  25. # include <boost/mpl/bool.hpp>
  26. # include <memory>
  27. #endif
  28. #include <boost/iterator/detail/config_def.hpp> // must be last #include
  29. namespace boost
  30. {
  31. template <class Iter, class Value, class Category, class Reference, class Difference>
  32. class indirect_iterator;
  33. namespace detail
  34. {
  35. template <class Iter, class Value, class Category, class Reference, class Difference>
  36. struct indirect_base
  37. {
  38. typedef typename iterator_traits<Iter>::value_type dereferenceable;
  39. typedef iterator_adaptor<
  40. indirect_iterator<Iter, Value, Category, Reference, Difference>
  41. , Iter
  42. , typename ia_dflt_help<
  43. Value, pointee<dereferenceable>
  44. >::type
  45. , Category
  46. , typename ia_dflt_help<
  47. Reference
  48. , mpl::eval_if<
  49. is_same<Value,use_default>
  50. , indirect_reference<dereferenceable>
  51. , add_reference<Value>
  52. >
  53. >::type
  54. , Difference
  55. > type;
  56. };
  57. template <>
  58. struct indirect_base<int, int, int, int, int> {};
  59. } // namespace detail
  60. template <
  61. class Iterator
  62. , class Value = use_default
  63. , class Category = use_default
  64. , class Reference = use_default
  65. , class Difference = use_default
  66. >
  67. class indirect_iterator
  68. : public detail::indirect_base<
  69. Iterator, Value, Category, Reference, Difference
  70. >::type
  71. {
  72. typedef typename detail::indirect_base<
  73. Iterator, Value, Category, Reference, Difference
  74. >::type super_t;
  75. friend class iterator_core_access;
  76. public:
  77. indirect_iterator() {}
  78. indirect_iterator(Iterator iter)
  79. : super_t(iter) {}
  80. template <
  81. class Iterator2, class Value2, class Category2
  82. , class Reference2, class Difference2
  83. >
  84. indirect_iterator(
  85. indirect_iterator<
  86. Iterator2, Value2, Category2, Reference2, Difference2
  87. > const& y
  88. , typename enable_if_convertible<Iterator2, Iterator>::type* = 0
  89. )
  90. : super_t(y.base())
  91. {}
  92. private:
  93. typename super_t::reference dereference() const
  94. {
  95. # if BOOST_WORKAROUND(__BORLANDC__, < 0x5A0 )
  96. return const_cast<super_t::reference>(**this->base());
  97. # else
  98. return **this->base();
  99. # endif
  100. }
  101. };
  102. template <class Iter>
  103. inline
  104. indirect_iterator<Iter> make_indirect_iterator(Iter x)
  105. {
  106. return indirect_iterator<Iter>(x);
  107. }
  108. template <class Traits, class Iter>
  109. inline
  110. indirect_iterator<Iter,Traits> make_indirect_iterator(Iter x, Traits* = 0)
  111. {
  112. return indirect_iterator<Iter, Traits>(x);
  113. }
  114. } // namespace boost
  115. #include <boost/iterator/detail/config_undef.hpp>
  116. #endif // BOOST_INDIRECT_ITERATOR_23022003THW_HPP