Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <iterator>
  3.  
  4. namespace nsp
  5. {
  6.  
  7. template <class element_type, class element_allocator_type = std::allocator<element_type> >
  8. class test_container
  9. {
  10. private:
  11. element_type numbers[50];
  12. friend class iterator;
  13. friend class reverse_iterator;
  14.  
  15. public:
  16. class reverse_iterator; //forward decl
  17.  
  18. class iterator : public std::iterator<std::bidirectional_iterator_tag, element_type>
  19. {
  20. private:
  21. element_type *i;
  22.  
  23. template <class distance_type>
  24. friend void advance(reverse_iterator &rit, distance_type n);
  25. public:
  26.  
  27. iterator() {}
  28.  
  29. iterator(element_type &_i)
  30. {
  31. i = &(_i);
  32. }
  33.  
  34. element_type & operator *()
  35. {
  36. return *i;
  37. }
  38.  
  39. iterator & operator = (const element_type &source_i)
  40. {
  41. i = &(source_i);
  42. return *this;
  43. }
  44.  
  45. iterator & operator = (const iterator &source)
  46. {
  47. i = source.i;
  48. return *this;
  49. }
  50.  
  51. bool operator != (const iterator rh)
  52. {
  53. return i != rh.i;
  54. }
  55.  
  56. iterator & operator ++()
  57. {
  58. ++i;
  59. return *this;
  60. }
  61.  
  62. iterator & operator --()
  63. {
  64. --i;
  65. return *this;
  66. }
  67.  
  68.  
  69.  
  70. template <class distance_type>
  71. friend void advance(iterator &it, distance_type n)
  72. {
  73. it.i += n;
  74. }
  75.  
  76. friend typename std::iterator_traits<iterator>::difference_type distance(const iterator &first, const iterator &last)
  77. {
  78. return last.i - first.i;
  79. }
  80.  
  81.  
  82. };
  83.  
  84.  
  85.  
  86. class reverse_iterator : public std::iterator<std::bidirectional_iterator_tag, element_type>
  87. {
  88. private:
  89. iterator it;
  90.  
  91. public:
  92.  
  93. reverse_iterator(element_type &_i)
  94. {
  95. it.i = _i;
  96. }
  97.  
  98. reverse_iterator(const iterator &source)
  99. {
  100. it = source;
  101. }
  102.  
  103. element_type & operator *()
  104. {
  105. return *it;
  106. }
  107.  
  108. element_type & operator = (const reverse_iterator &source)
  109. {
  110. it = source.it;
  111. return *this;
  112. }
  113.  
  114. element_type & operator = (const iterator &source)
  115. {
  116. it = source;
  117. return *this;
  118. }
  119.  
  120. bool operator != (const iterator rh)
  121. {
  122. return it != rh.it;
  123. }
  124.  
  125. reverse_iterator & operator ++()
  126. {
  127. --it;
  128. return *this;
  129. }
  130.  
  131. reverse_iterator & operator --()
  132. {
  133. ++it;
  134. return *this;
  135. }
  136.  
  137.  
  138.  
  139. template <class distance_type>
  140. friend void advance(reverse_iterator &rit, distance_type n)
  141. {
  142. rit.it.i -= n;
  143. }
  144.  
  145. friend typename std::iterator_traits<reverse_iterator>::difference_type distance(const reverse_iterator &first, const reverse_iterator &last)
  146. {
  147. return distance(last.it, first.it);
  148. }
  149.  
  150.  
  151. };
  152.  
  153.  
  154. iterator begin()
  155. {
  156. return iterator(numbers[0]);
  157. }
  158.  
  159.  
  160. iterator end()
  161. {
  162. return iterator(numbers[50]);
  163. }
  164.  
  165.  
  166. };
  167.  
  168.  
  169. }
  170.  
  171.  
  172. int main(int argc, char **argv)
  173. {
  174. nsp::test_container<int> stuff;
  175.  
  176. int counter = 0;
  177.  
  178. for (nsp::test_container<int>::iterator it = stuff.begin(); it != stuff.end(); ++it)
  179. {
  180. *it = counter++;
  181. }
  182.  
  183. nsp::test_container<int>::iterator it = stuff.begin(), it2 = stuff.begin();
  184.  
  185. using namespace std;
  186.  
  187. std::cout << *it << std::endl;
  188.  
  189. ++it;
  190. --it;
  191. ++it;
  192.  
  193.  
  194. std::cout << *it << std::endl;
  195.  
  196. advance(it, 2);
  197.  
  198. std::cout << *it << std::endl;
  199.  
  200. std::advance(it, 2);
  201.  
  202. std::cout << *it << std::endl;
  203.  
  204. int distance_between = distance(it2, it);
  205.  
  206. std::cout << distance_between << std::endl;
  207.  
  208. nsp::test_container<int>::reverse_iterator rit = it, rit2 = it2;
  209.  
  210. --rit;
  211. ++rit;
  212. advance(rit, -2);
  213.  
  214. distance_between = distance(rit2, rit);
  215. std::cout << distance_between << std::endl;
  216.  
  217. std::cin.get();
  218.  
  219. return 0;
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement