input_iterator.hpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Copyright 2005-2010 Daniel James.
  2. // Distributed under 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. #if !defined(BOOST_UNORDERED_TEST_HELPERS_INPUT_ITERATOR_HEADER)
  5. #define BOOST_UNORDERED_TEST_HELPERS_INPUT_ITERATOR_HEADER
  6. #include <boost/config.hpp>
  7. #include <iterator>
  8. namespace test {
  9. template <class Iterator> struct proxy
  10. {
  11. typedef typename Iterator::value_type value_type;
  12. explicit proxy(value_type const& v) : v_(v) {}
  13. proxy(proxy const& x) : v_(x.v_) {}
  14. operator value_type const&() const { return v_; }
  15. value_type v_;
  16. private:
  17. proxy& operator=(proxy const&);
  18. };
  19. template <class Iterator> struct input_iterator_adaptor
  20. {
  21. typedef typename std::iterator_traits<Iterator>::value_type value_type;
  22. typedef typename std::iterator_traits<Iterator>::pointer pointer;
  23. typedef proxy<Iterator> reference;
  24. typedef std::ptrdiff_t difference_type;
  25. typedef std::input_iterator_tag iterator_category;
  26. input_iterator_adaptor() : base_() {}
  27. explicit input_iterator_adaptor(Iterator& it) : base_(&it) {}
  28. proxy<Iterator> operator*() const { return proxy<Iterator>(**base_); }
  29. value_type* operator->() const { return &**base_; }
  30. input_iterator_adaptor& operator++()
  31. {
  32. ++*base_;
  33. return *this;
  34. }
  35. // input_iterator_adaptor operator++(int) {
  36. //}
  37. bool operator==(input_iterator_adaptor const& x) const
  38. {
  39. return *base_ == *x.base_;
  40. }
  41. bool operator!=(input_iterator_adaptor const& x) const
  42. {
  43. return *base_ != *x.base_;
  44. }
  45. private:
  46. Iterator* base_;
  47. };
  48. template <class Iterator>
  49. input_iterator_adaptor<Iterator> input_iterator(Iterator& it)
  50. {
  51. return input_iterator_adaptor<Iterator>(it);
  52. }
  53. template <class Iterator> struct copy_iterator_adaptor
  54. {
  55. typedef typename std::iterator_traits<Iterator>::value_type value_type;
  56. typedef
  57. typename std::iterator_traits<Iterator>::difference_type difference_type;
  58. typedef typename std::iterator_traits<Iterator>::iterator_category
  59. iterator_category;
  60. typedef typename std::iterator_traits<Iterator>::pointer pointer;
  61. typedef proxy<Iterator> reference;
  62. copy_iterator_adaptor() : base_() {}
  63. explicit copy_iterator_adaptor(Iterator const& it) : base_(it) {}
  64. value_type operator*() const { return *base_; }
  65. value_type* operator->() const { return &*base_; }
  66. value_type operator[](difference_type d) { return base_[d]; }
  67. copy_iterator_adaptor& operator++()
  68. {
  69. ++base_;
  70. return *this;
  71. }
  72. copy_iterator_adaptor operator++(int)
  73. {
  74. copy_iterator_adaptor tmp(*this);
  75. ++base_;
  76. return tmp;
  77. }
  78. copy_iterator_adaptor& operator--()
  79. {
  80. --base_;
  81. return *this;
  82. }
  83. copy_iterator_adaptor operator--(int)
  84. {
  85. copy_iterator_adaptor tmp(*this);
  86. --base_;
  87. return tmp;
  88. }
  89. copy_iterator_adaptor operator+=(difference_type x)
  90. {
  91. base_ += x;
  92. return *this;
  93. }
  94. copy_iterator_adaptor operator-=(difference_type x)
  95. {
  96. base_ -= x;
  97. return *this;
  98. }
  99. copy_iterator_adaptor operator+(difference_type n)
  100. {
  101. return copy_iterator_adaptor(base_ + n);
  102. }
  103. copy_iterator_adaptor operator-(difference_type n)
  104. {
  105. return copy_iterator_adaptor(base_ - n);
  106. }
  107. friend copy_iterator_adaptor operator+(
  108. difference_type n, copy_iterator_adaptor x)
  109. {
  110. return x + n;
  111. }
  112. difference_type operator-(copy_iterator_adaptor const& other)
  113. {
  114. return base_ - other.base_;
  115. }
  116. bool operator==(copy_iterator_adaptor const& x) const
  117. {
  118. return base_ == x.base_;
  119. }
  120. bool operator!=(copy_iterator_adaptor const& x) const
  121. {
  122. return base_ != x.base_;
  123. }
  124. bool operator<(copy_iterator_adaptor const& x) const
  125. {
  126. return base_ < x.base_;
  127. }
  128. bool operator>(copy_iterator_adaptor const& x) const
  129. {
  130. return base_ > x.base_;
  131. }
  132. bool operator<=(copy_iterator_adaptor const& x) const
  133. {
  134. return base_ <= x.base_;
  135. }
  136. bool operator>=(copy_iterator_adaptor const& x) const
  137. {
  138. return base_ >= x.base_;
  139. }
  140. private:
  141. Iterator base_;
  142. };
  143. template <class Iterator>
  144. copy_iterator_adaptor<Iterator> copy_iterator(Iterator const& it)
  145. {
  146. return copy_iterator_adaptor<Iterator>(it);
  147. }
  148. }
  149. #endif