reverse_iterator.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. // Range v3 library
  2. //
  3. // Copyright Eric Niebler 2014-present
  4. //
  5. // Use, modification and distribution is subject to the
  6. // Boost Software License, Version 1.0. (See accompanying
  7. // file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // Project home: https://github.com/ericniebler/range-v3
  11. //
  12. // These tests of reverse_iterator have been adapted from libc++
  13. // (http://libcxx.llvm.org).
  14. //
  15. //===----------------------------------------------------------------------===//
  16. //
  17. // The LLVM Compiler Infrastructure
  18. //
  19. // This file is dual licensed under the MIT and the University of Illinois Open
  20. // Source Licenses. See LICENSE.TXT for details.
  21. //
  22. //===----------------------------------------------------------------------===//
  23. #include <range/v3/range/access.hpp>
  24. #include <range/v3/view/iota.hpp>
  25. #include "../simple_test.hpp"
  26. #include "../test_iterators.hpp"
  27. template<class It> void test() { ranges::reverse_iterator<It>{}; }
  28. template<class It> void test2(It i) {
  29. ranges::reverse_iterator<It> r(i);
  30. CHECK(r.base() == i);
  31. }
  32. template<class It, class U> void test3(U u) {
  33. const ranges::reverse_iterator<U> r2(u);
  34. ranges::reverse_iterator<It> r1 = ranges::reverse_iterator<It>(r2);
  35. CHECK(r1.base() == u);
  36. }
  37. struct Base {};
  38. struct Derived : Base {};
  39. template<class It> void test4(It i) {
  40. const ranges::reverse_iterator<It> r = ranges::make_reverse_iterator(i);
  41. CHECK(r.base() == i);
  42. }
  43. template<class It> void test5(It l, It r, bool x) {
  44. const ranges::reverse_iterator<It> r1(l);
  45. const ranges::reverse_iterator<It> r2(r);
  46. CHECK((r1 != r2) == x);
  47. }
  48. template<class It> void test6(It i, It x) {
  49. ranges::reverse_iterator<It> r(i);
  50. ranges::reverse_iterator<It> rr = r++;
  51. CHECK(r.base() == x);
  52. CHECK(rr.base() == i);
  53. }
  54. template<class It> void test7(It i, It x) {
  55. ranges::reverse_iterator<It> r(i);
  56. ranges::reverse_iterator<It> &rr = ++r;
  57. CHECK(r.base() == x);
  58. CHECK(&rr == &r);
  59. }
  60. template<class It>
  61. void test8(It i, ranges::iter_difference_t<It> n, It x) {
  62. const ranges::reverse_iterator<It> r(i);
  63. ranges::reverse_iterator<It> rr = r + n;
  64. CHECK(rr.base() == x);
  65. }
  66. template<class It>
  67. void test9(It i, ranges::iter_difference_t<It> n, It x) {
  68. ranges::reverse_iterator<It> r(i);
  69. ranges::reverse_iterator<It> &rr = r += n;
  70. CHECK(r.base() == x);
  71. CHECK(&rr == &r);
  72. }
  73. template<class It> void test10(It i, It x) {
  74. ranges::reverse_iterator<It> r(i);
  75. ranges::reverse_iterator<It> rr = r--;
  76. CHECK(r.base() == x);
  77. CHECK(rr.base() == i);
  78. }
  79. template<class It> void test11(It i, It x) {
  80. ranges::reverse_iterator<It> r(i);
  81. ranges::reverse_iterator<It> &rr = --r;
  82. CHECK(r.base() == x);
  83. CHECK(&rr == &r);
  84. }
  85. template<class It>
  86. void test12(It i, ranges::iter_difference_t<It> n, It x) {
  87. const ranges::reverse_iterator<It> r(i);
  88. ranges::reverse_iterator<It> rr = r - n;
  89. CHECK(rr.base() == x);
  90. }
  91. template<class It>
  92. void test13(It i, ranges::iter_difference_t<It> n, It x) {
  93. ranges::reverse_iterator<It> r(i);
  94. ranges::reverse_iterator<It> &rr = r -= n;
  95. CHECK(r.base() == x);
  96. CHECK(&rr == &r);
  97. }
  98. class A {
  99. int data_ = 1;
  100. public:
  101. A() = default;
  102. friend bool operator==(const A &x, const A &y) { return x.data_ == y.data_; }
  103. };
  104. template<class It> void test14(It i, ranges::iter_value_t<It> x) {
  105. ranges::reverse_iterator<It> r(i);
  106. CHECK(*r == x);
  107. }
  108. template<class It, class U> void test15(U u) {
  109. const ranges::reverse_iterator<U> r2(u);
  110. ranges::reverse_iterator<It> r1;
  111. ranges::reverse_iterator<It> &rr = r1 = r2;
  112. CHECK(r1.base() == u);
  113. CHECK(&rr == &r1);
  114. }
  115. template<class It> void test16(It l, It r, bool x) {
  116. const ranges::reverse_iterator<It> r1(l);
  117. const ranges::reverse_iterator<It> r2(r);
  118. CHECK((r1 == r2) == x);
  119. }
  120. template<class It1, class It2> void test17(It1 l, It2 r, std::ptrdiff_t x) {
  121. const ranges::reverse_iterator<It1> r1(l);
  122. const ranges::reverse_iterator<It2> r2(r);
  123. CHECK((r1 - r2) == x);
  124. }
  125. template<class It> void test18(It l, It r, bool x) {
  126. const ranges::reverse_iterator<It> r1(l);
  127. const ranges::reverse_iterator<It> r2(r);
  128. CHECK((r1 > r2) == x);
  129. }
  130. template<class It> void test19(It l, It r, bool x) {
  131. const ranges::reverse_iterator<It> r1(l);
  132. const ranges::reverse_iterator<It> r2(r);
  133. CHECK((r1 >= r2) == x);
  134. }
  135. template<class It>
  136. void test20(It i, ranges::iter_difference_t<It> n,
  137. ranges::iter_value_t<It> x) {
  138. const ranges::reverse_iterator<It> r(i);
  139. ranges::iter_value_t<It> rr = r[n];
  140. CHECK(rr == x);
  141. }
  142. template<class It> void test21(It l, It r, bool x) {
  143. const ranges::reverse_iterator<It> r1(l);
  144. const ranges::reverse_iterator<It> r2(r);
  145. CHECK((r1 < r2) == x);
  146. }
  147. template<class It>
  148. void
  149. test22(It l, It r, bool x)
  150. {
  151. const ranges::reverse_iterator<It> r1(l);
  152. const ranges::reverse_iterator<It> r2(r);
  153. CHECK((r1 < r2) == x);
  154. }
  155. template<class It>
  156. void
  157. test23(It l, It r, bool x)
  158. {
  159. const ranges::reverse_iterator<It> r1(l);
  160. const ranges::reverse_iterator<It> r2(r);
  161. CHECK((r1 <= r2) == x);
  162. }
  163. class B
  164. {
  165. int data_ = 1;
  166. public:
  167. B() = default;
  168. int get() const {return data_;}
  169. friend bool operator==(const B& x, const B& y)
  170. {return x.data_ == y.data_;}
  171. };
  172. template<class It>
  173. void
  174. test24(It i, ranges::iter_value_t<It> x)
  175. {
  176. ranges::reverse_iterator<It> r(i);
  177. CHECK((*r).get() == x.get());
  178. }
  179. class C
  180. {
  181. int data_ = 1;
  182. public:
  183. C(int d) : data_(d) {}
  184. C() = default;
  185. int get() const {return data_;}
  186. friend bool operator==(const C& x, const C& y)
  187. {return x.data_ == y.data_;}
  188. const C *operator&() const { return nullptr; }
  189. C *operator&() { return nullptr; }
  190. };
  191. template<class It>
  192. void
  193. test25(It i, ranges::iter_difference_t<It> n, It x)
  194. {
  195. const ranges::reverse_iterator<It> r(i);
  196. ranges::reverse_iterator<It> rr = n + r;
  197. CHECK(rr.base() == x);
  198. }
  199. int main()
  200. {
  201. {
  202. static_assert(
  203. ranges::detail::bidirectional_cursor<
  204. ranges::detail::reverse_cursor<BidirectionalIterator<const char *>>>,
  205. "");
  206. static_assert(
  207. ranges::detail::bidirectional_cursor<
  208. ranges::detail::reverse_cursor<RandomAccessIterator<const char *>>>,
  209. "");
  210. static_assert(
  211. ranges::detail::random_access_cursor<
  212. ranges::detail::reverse_cursor<RandomAccessIterator<const char *>>>,
  213. "");
  214. static_assert(
  215. ranges::bidirectional_iterator<
  216. ranges::reverse_iterator<BidirectionalIterator<const char *>>>,
  217. "");
  218. static_assert(
  219. ranges::random_access_iterator<
  220. ranges::reverse_iterator<RandomAccessIterator<const char *>>>,
  221. "");
  222. }
  223. { // test
  224. test<BidirectionalIterator<const char *>>();
  225. test<RandomAccessIterator<char *>>();
  226. test<char *>();
  227. test<const char *>();
  228. }
  229. { // test 2
  230. const char s[] = "123";
  231. test2(BidirectionalIterator<const char *>(s));
  232. test2(RandomAccessIterator<const char *>(s));
  233. }
  234. { // test3
  235. Derived d;
  236. test3<BidirectionalIterator<Base *>>(
  237. BidirectionalIterator<Derived *>(&d));
  238. //test3<RandomAccessIterator<const Base *>>(
  239. // RandomAccessIterator<Derived *>(&d));
  240. }
  241. //{ // test4
  242. // const char *s = "1234567890";
  243. // RandomAccessIterator<const char *> b(s);
  244. // RandomAccessIterator<const char *> e(s + 10);
  245. // while (b != e)
  246. // test4(b++);
  247. //}
  248. //{ // test5
  249. // const char *s = "1234567890";
  250. // test5(BidirectionalIterator<const char *>(s),
  251. // BidirectionalIterator<const char *>(s), false);
  252. // test5(BidirectionalIterator<const char *>(s),
  253. // BidirectionalIterator<const char *>(s + 1), true);
  254. // test5(RandomAccessIterator<const char *>(s),
  255. // RandomAccessIterator<const char *>(s), false);
  256. // test5(RandomAccessIterator<const char *>(s),
  257. // RandomAccessIterator<const char *>(s + 1), true);
  258. // test5(s, s, false);
  259. // test5(s, s + 1, true);
  260. //}
  261. //{
  262. // const char *s = "123";
  263. // test6(BidirectionalIterator<const char *>(s + 1),
  264. // BidirectionalIterator<const char *>(s));
  265. // test6(RandomAccessIterator<const char *>(s + 1),
  266. // RandomAccessIterator<const char *>(s));
  267. // test6(s + 1, s);
  268. //}
  269. //{
  270. // const char *s = "123";
  271. // test7(BidirectionalIterator<const char *>(s + 1),
  272. // BidirectionalIterator<const char *>(s));
  273. // test7(RandomAccessIterator<const char *>(s + 1),
  274. // RandomAccessIterator<const char *>(s));
  275. // test7(s + 1, s);
  276. //}
  277. //{
  278. // const char *s = "1234567890";
  279. // test8(RandomAccessIterator<const char *>(s + 5), 5,
  280. // RandomAccessIterator<const char *>(s));
  281. // test8(s + 5, 5, s);
  282. //}
  283. //{
  284. // const char *s = "1234567890";
  285. // test9(RandomAccessIterator<const char *>(s + 5), 5,
  286. // RandomAccessIterator<const char *>(s));
  287. // test9(s + 5, 5, s);
  288. //}
  289. //{
  290. // const char *s = "123";
  291. // test10(BidirectionalIterator<const char *>(s + 1),
  292. // BidirectionalIterator<const char *>(s + 2));
  293. // test10(RandomAccessIterator<const char *>(s + 1),
  294. // RandomAccessIterator<const char *>(s + 2));
  295. // test10(s + 1, s + 2);
  296. //}
  297. //{
  298. // const char *s = "123";
  299. // test11(BidirectionalIterator<const char *>(s + 1),
  300. // BidirectionalIterator<const char *>(s + 2));
  301. // test11(RandomAccessIterator<const char *>(s + 1),
  302. // RandomAccessIterator<const char *>(s + 2));
  303. // test11(s + 1, s + 2);
  304. //}
  305. //{
  306. // const char *s = "1234567890";
  307. // test12(RandomAccessIterator<const char *>(s + 5), 5,
  308. // RandomAccessIterator<const char *>(s + 10));
  309. // test12(s + 5, 5, s + 10);
  310. //}
  311. //{
  312. // const char *s = "1234567890";
  313. // test13(RandomAccessIterator<const char *>(s + 5), 5,
  314. // RandomAccessIterator<const char *>(s + 10));
  315. // test13(s + 5, 5, s + 10);
  316. //}
  317. //{
  318. // A a;
  319. // test14(&a + 1, A());
  320. //}
  321. //{
  322. // Derived d;
  323. // test15<BidirectionalIterator<Base *>>(
  324. // BidirectionalIterator<Derived *>(&d));
  325. // test15<RandomAccessIterator<const Base *>>(
  326. // RandomAccessIterator<Derived *>(&d));
  327. // test15<Base *>(&d);
  328. //}
  329. //{
  330. // const char *s = "1234567890";
  331. // test16(BidirectionalIterator<const char *>(s),
  332. // BidirectionalIterator<const char *>(s), true);
  333. // test16(BidirectionalIterator<const char *>(s),
  334. // BidirectionalIterator<const char *>(s + 1), false);
  335. // test16(RandomAccessIterator<const char *>(s),
  336. // RandomAccessIterator<const char *>(s), true);
  337. // test16(RandomAccessIterator<const char *>(s),
  338. // RandomAccessIterator<const char *>(s + 1), false);
  339. // test16(s, s, true);
  340. // test16(s, s + 1, false);
  341. //}
  342. //{
  343. // char s[3] = {0};
  344. // test17(RandomAccessIterator<const char *>(s),
  345. // RandomAccessIterator<char *>(s), 0);
  346. // RandomAccessIterator<char *> inp1(s);
  347. // test17(RandomAccessIterator<char *>(s),
  348. // RandomAccessIterator<const char *>(s + 1), 1);
  349. // test17(RandomAccessIterator<const char *>(s + 1),
  350. // RandomAccessIterator<char *>(s), -1);
  351. // test17(s, s, 0);
  352. // test17(s, s + 1, 1);
  353. // test17(s + 1, s, -1);
  354. //}
  355. //{
  356. // const char *s = "1234567890";
  357. // test18(RandomAccessIterator<const char *>(s),
  358. // RandomAccessIterator<const char *>(s), false);
  359. // test18(RandomAccessIterator<const char *>(s),
  360. // RandomAccessIterator<const char *>(s + 1), true);
  361. // test18(RandomAccessIterator<const char *>(s + 1),
  362. // RandomAccessIterator<const char *>(s), false);
  363. // test18(s, s, false);
  364. // test18(s, s + 1, true);
  365. // test18(s + 1, s, false);
  366. //}
  367. //{
  368. // const char *s = "1234567890";
  369. // test19(RandomAccessIterator<const char *>(s),
  370. // RandomAccessIterator<const char *>(s), true);
  371. // test19(RandomAccessIterator<const char *>(s),
  372. // RandomAccessIterator<const char *>(s + 1), true);
  373. // test19(RandomAccessIterator<const char *>(s + 1),
  374. // RandomAccessIterator<const char *>(s), false);
  375. // test19(s, s, true);
  376. // test19(s, s + 1, true);
  377. // test19(s + 1, s, false);
  378. //}
  379. //{
  380. // const char *s = "1234567890";
  381. // test20(RandomAccessIterator<const char *>(s + 5), 4, '1');
  382. // test20(s + 5, 4, '1');
  383. //}
  384. //{
  385. // const char *s = "1234567890";
  386. // test21(RandomAccessIterator<const char *>(s),
  387. // RandomAccessIterator<const char *>(s), false);
  388. // test21(RandomAccessIterator<const char *>(s),
  389. // RandomAccessIterator<const char *>(s + 1), false);
  390. // test21(RandomAccessIterator<const char *>(s + 1),
  391. // RandomAccessIterator<const char *>(s), true);
  392. // test21(s, s, false);
  393. // test21(s, s + 1, false);
  394. // test21(s + 1, s, true);
  395. //}
  396. //{
  397. // const char* s = "1234567890";
  398. // test22(RandomAccessIterator<const char*>(s), RandomAccessIterator<const char*>(s), false);
  399. // test22(RandomAccessIterator<const char*>(s), RandomAccessIterator<const char*>(s+1), false);
  400. // test22(RandomAccessIterator<const char*>(s+1), RandomAccessIterator<const char*>(s), true);
  401. // test22(s, s, false);
  402. // test22(s, s+1, false);
  403. // test22(s+1, s, true);
  404. //}
  405. //{
  406. // const char* s = "1234567890";
  407. // test23(RandomAccessIterator<const char*>(s), RandomAccessIterator<const char*>(s), true);
  408. // test23(RandomAccessIterator<const char*>(s), RandomAccessIterator<const char*>(s+1), false);
  409. // test23(RandomAccessIterator<const char*>(s+1), RandomAccessIterator<const char*>(s), true);
  410. // test23(s, s, true);
  411. // test23(s, s+1, false);
  412. // test23(s+1, s, true);
  413. //}
  414. //{
  415. // B a;
  416. // test24(&a+1, B());
  417. //}
  418. //{
  419. // C l[3] = {C(0), C(1), C(2)};
  420. // auto ri = ranges::rbegin(l);
  421. // CHECK ( ri->get() == 2 );
  422. // CHECK ( (*ri).get() == 2 );
  423. // CHECK ( ri.operator->() == ranges::prev(ri.base()) );
  424. // ++ri;
  425. // CHECK ( ri->get() == 1 );
  426. // CHECK ( (*ri).get() == 1 );
  427. // CHECK ( ri.operator->() == ranges::prev(ri.base()) );
  428. // ++ri;
  429. // CHECK ( ri->get() == 0 );
  430. // CHECK ( (*ri).get() == 0 );
  431. // CHECK ( ri.operator->() == ranges::prev(ri.base()) );
  432. // ++ri;
  433. // CHECK ( ri == ranges::rend(l));
  434. //}
  435. //{
  436. // const char* s = "1234567890";
  437. // test25(RandomAccessIterator<const char*>(s+5), 5, RandomAccessIterator<const char*>(s));
  438. // test25(s+5, 5, s);
  439. //}
  440. return test_result();
  441. }