Advertisement
Guest User

Untitled

a guest
Dec 17th, 2014
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.34 KB | None | 0 0
  1. template<std::size_t N, typename Iterator>
  2. class get_iterator:
  3. public std::iterator<
  4. typename std::iterator_traits<Iterator>::iterator_category,
  5. typename std::remove_reference<decltype(std::get<N>(*Iterator{}))>::type,
  6. typename std::iterator_traits<Iterator>::difference_type>
  7. {
  8. private:
  9.  
  10. Iterator _current;
  11.  
  12. public:
  13.  
  14. using iterator_type = Iterator;
  15. using value_type = typename std::remove_reference<decltype(std::get<N>(*_current))>::type;
  16. using pointer = value_type*;
  17. using reference = value_type&;
  18.  
  19. get_iterator();
  20. explicit get_iterator(Iterator it);
  21. template<typename U>
  22. get_iterator(const get_iterator<N, U>& other);
  23.  
  24. template<typename U>
  25. auto operator=(const get_iterator<N, U>& other)
  26. -> get_iterator&;
  27.  
  28. auto base() const
  29. -> Iterator;
  30.  
  31. auto operator*() const
  32. -> reference;
  33. auto operator->() const
  34. -> pointer;
  35.  
  36. auto operator++()
  37. -> get_iterator&;
  38. auto operator++(int)
  39. -> get_iterator&;
  40.  
  41. auto operator--()
  42. -> get_iterator&;
  43. auto operator--(int)
  44. -> get_iterator&;
  45. };
  46.  
  47. template<std::size_t N, typename Iterator>
  48. get_iterator<N, Iterator>::get_iterator()
  49. = default;
  50.  
  51. template<std::size_t N, typename Iterator>
  52. get_iterator<N, Iterator>::get_iterator(Iterator it):
  53. _current(it)
  54. {}
  55.  
  56. template<std::size_t N, typename Iterator>
  57. template<typename U>
  58. get_iterator<N, Iterator>::get_iterator(const get_iterator<N, U>& other):
  59. _current(other.base())
  60. {}
  61.  
  62. template<std::size_t N, typename Iterator>
  63. template<typename U>
  64. auto get_iterator<N, Iterator>::operator=(const get_iterator<N, U>& other)
  65. -> get_iterator&
  66. {
  67. if (&other != this)
  68. {
  69. _current = other.base();
  70. }
  71. return *this;
  72. }
  73.  
  74. template<std::size_t N, typename Iterator>
  75. auto get_iterator<N, Iterator>::base() const
  76. -> Iterator
  77. {
  78. return _current;
  79. }
  80.  
  81. template<std::size_t N, typename Iterator>
  82. auto get_iterator<N, Iterator>::operator*() const
  83. -> reference
  84. {
  85. return std::get<N>(*_current);
  86. }
  87.  
  88. template<std::size_t N, typename Iterator>
  89. auto get_iterator<N, Iterator>::operator->() const
  90. -> pointer
  91. {
  92. return &(operator*());
  93. }
  94.  
  95. template<std::size_t N, typename Iterator>
  96. auto get_iterator<N, Iterator>::operator++()
  97. -> get_iterator&
  98. {
  99. ++_current;
  100. return *this;
  101. }
  102.  
  103. template<std::size_t N, typename Iterator>
  104. auto get_iterator<N, Iterator>::operator++(int)
  105. -> get_iterator&
  106. {
  107. auto tmp = *this;
  108. ++_current;
  109. return tmp;
  110. }
  111.  
  112. template<std::size_t N, typename Iterator>
  113. auto get_iterator<N, Iterator>::operator--()
  114. -> get_iterator&
  115. {
  116. --_current;
  117. return *this;
  118. }
  119.  
  120. template<std::size_t N, typename Iterator>
  121. auto get_iterator<N, Iterator>::operator--(int)
  122. -> get_iterator&
  123. {
  124. auto tmp = *this;
  125. --_current;
  126. return tmp;
  127. }
  128.  
  129. struct getter
  130. {
  131. template<typename T>
  132. auto operator()(T&& value)
  133. -> decltype(auto)
  134. {
  135. return std::get<N>(std::forward<T>(arg));
  136. }
  137. };
  138.  
  139. template<std::size_t N, typename Iterator>
  140. using = boost::iterators::transform_iterator<getter<N>, Iterator>;
  141.  
  142. template<std::size_t N, typename Iterator>
  143. auto make_get_iterator(Iterator it)
  144. -> get_iterator<N, Iterator>
  145. {
  146. return get_iterator<N, Iterator>(it);
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement