Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.09 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. }
  221.  
  222. #include <iostream>
  223. #include <iterator>
  224.  
  225. namespace nsp
  226. {
  227.  
  228. template <class element_type, class element_allocator_type = std::allocator<element_type> >
  229. class test_container
  230. {
  231. private:
  232. element_type numbers[50];
  233. friend class iterator;
  234. friend class reverse_iterator;
  235.  
  236. public:
  237. class reverse_iterator; //forward decl
  238.  
  239. class iterator : public std::iterator<std::bidirectional_iterator_tag, element_type>
  240. {
  241. private:
  242. element_type *i;
  243.  
  244. template <class distance_type>
  245. friend void advance(reverse_iterator &rit, distance_type n);
  246. public:
  247.  
  248. iterator() {}
  249.  
  250. iterator(element_type &_i)
  251. {
  252. i = &(_i);
  253. }
  254.  
  255. element_type & operator *()
  256. {
  257. return *i;
  258. }
  259.  
  260. iterator & operator = (const element_type &source_i)
  261. {
  262. i = &(source_i);
  263. return *this;
  264. }
  265.  
  266. iterator & operator = (const iterator &source)
  267. {
  268. i = source.i;
  269. return *this;
  270. }
  271.  
  272. bool operator != (const iterator rh)
  273. {
  274. return i != rh.i;
  275. }
  276.  
  277. iterator & operator ++()
  278. {
  279. ++i;
  280. return *this;
  281. }
  282.  
  283. iterator & operator --()
  284. {
  285. --i;
  286. return *this;
  287. }
  288.  
  289.  
  290.  
  291. template <class distance_type>
  292. friend void advance(iterator &it, distance_type n)
  293. {
  294. it.i += n;
  295. }
  296.  
  297. friend typename std::iterator_traits<iterator>::difference_type distance(const iterator &first, const iterator &last)
  298. {
  299. return last.i - first.i;
  300. }
  301.  
  302.  
  303. };
  304.  
  305.  
  306.  
  307. class reverse_iterator : public std::iterator<std::bidirectional_iterator_tag, element_type>
  308. {
  309. private:
  310. typename test_container::iterator it;
  311.  
  312. public:
  313.  
  314. reverse_iterator(element_type &_i)
  315. {
  316. it.i = _i;
  317. }
  318.  
  319. reverse_iterator(const typename test_container::iterator &source)
  320. {
  321. it = source;
  322. }
  323.  
  324. element_type & operator *()
  325. {
  326. return *it;
  327. }
  328.  
  329. element_type & operator = (const reverse_iterator &source)
  330. {
  331. it = source.it;
  332. return *this;
  333. }
  334.  
  335. element_type & operator = (const typename test_container::iterator &source)
  336. {
  337. it = source;
  338. return *this;
  339. }
  340.  
  341. bool operator != (const typename test_container::iterator rh)
  342. {
  343. return it != rh.it;
  344. }
  345.  
  346. reverse_iterator & operator ++()
  347. {
  348. --it;
  349. return *this;
  350. }
  351.  
  352. reverse_iterator & operator --()
  353. {
  354. ++it;
  355. return *this;
  356. }
  357.  
  358.  
  359.  
  360. template <class distance_type>
  361. friend void advance(reverse_iterator &rit, distance_type n)
  362. {
  363. rit.it.i -= n;
  364. }
  365.  
  366. friend typename std::iterator_traits<reverse_iterator>::difference_type distance(const reverse_iterator &first, const reverse_iterator &last)
  367. {
  368. return distance(last.it, first.it);
  369. }
  370.  
  371.  
  372. };
  373.  
  374.  
  375. iterator begin()
  376. {
  377. return iterator(numbers[0]);
  378. }
  379.  
  380.  
  381. iterator end()
  382. {
  383. return iterator(numbers[50]);
  384. }
  385.  
  386.  
  387. };
  388.  
  389.  
  390. }
  391.  
  392.  
  393. int main(int argc, char **argv)
  394. {
  395. nsp::test_container<int> stuff;
  396.  
  397. int counter = 0;
  398.  
  399. for (nsp::test_container<int>::iterator it = stuff.begin(); it != stuff.end(); ++it)
  400. {
  401. *it = counter++;
  402. }
  403.  
  404. nsp::test_container<int>::iterator it = stuff.begin(), it2 = stuff.begin();
  405.  
  406. using namespace std;
  407.  
  408. std::cout << *it << std::endl;
  409.  
  410. ++it;
  411. --it;
  412. ++it;
  413.  
  414. std::cout << *it << std::endl;
  415.  
  416. advance(it, 2);
  417.  
  418. std::cout << *it << std::endl;
  419.  
  420. std::advance(it, 2);
  421.  
  422. std::cout << *it << std::endl;
  423.  
  424. int distance_between = distance(it2, it);
  425.  
  426. std::cout << distance_between << std::endl;
  427.  
  428. nsp::test_container<int>::reverse_iterator rit = it, rit2 = it2;
  429.  
  430. --rit;
  431. ++rit;
  432. advance(rit, -2);
  433.  
  434. distance_between = distance(rit2, rit);
  435. std::cout << distance_between << std::endl;
  436.  
  437. std::cin.get();
  438.  
  439. return 0;
  440. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement