| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480 |
- // Range v3 library
- //
- // Copyright Eric Niebler 2014-present
- //
- // Use, modification and distribution is subject to the
- // Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- //
- // Project home: https://github.com/ericniebler/range-v3
- //
- // These tests of reverse_iterator have been adapted from libc++
- // (http://libcxx.llvm.org).
- //
- //===----------------------------------------------------------------------===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is dual licensed under the MIT and the University of Illinois Open
- // Source Licenses. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- #include <range/v3/range/access.hpp>
- #include <range/v3/view/iota.hpp>
- #include "../simple_test.hpp"
- #include "../test_iterators.hpp"
- template<class It> void test() { ranges::reverse_iterator<It>{}; }
- template<class It> void test2(It i) {
- ranges::reverse_iterator<It> r(i);
- CHECK(r.base() == i);
- }
- template<class It, class U> void test3(U u) {
- const ranges::reverse_iterator<U> r2(u);
- ranges::reverse_iterator<It> r1 = ranges::reverse_iterator<It>(r2);
- CHECK(r1.base() == u);
- }
- struct Base {};
- struct Derived : Base {};
- template<class It> void test4(It i) {
- const ranges::reverse_iterator<It> r = ranges::make_reverse_iterator(i);
- CHECK(r.base() == i);
- }
- template<class It> void test5(It l, It r, bool x) {
- const ranges::reverse_iterator<It> r1(l);
- const ranges::reverse_iterator<It> r2(r);
- CHECK((r1 != r2) == x);
- }
- template<class It> void test6(It i, It x) {
- ranges::reverse_iterator<It> r(i);
- ranges::reverse_iterator<It> rr = r++;
- CHECK(r.base() == x);
- CHECK(rr.base() == i);
- }
- template<class It> void test7(It i, It x) {
- ranges::reverse_iterator<It> r(i);
- ranges::reverse_iterator<It> &rr = ++r;
- CHECK(r.base() == x);
- CHECK(&rr == &r);
- }
- template<class It>
- void test8(It i, ranges::iter_difference_t<It> n, It x) {
- const ranges::reverse_iterator<It> r(i);
- ranges::reverse_iterator<It> rr = r + n;
- CHECK(rr.base() == x);
- }
- template<class It>
- void test9(It i, ranges::iter_difference_t<It> n, It x) {
- ranges::reverse_iterator<It> r(i);
- ranges::reverse_iterator<It> &rr = r += n;
- CHECK(r.base() == x);
- CHECK(&rr == &r);
- }
- template<class It> void test10(It i, It x) {
- ranges::reverse_iterator<It> r(i);
- ranges::reverse_iterator<It> rr = r--;
- CHECK(r.base() == x);
- CHECK(rr.base() == i);
- }
- template<class It> void test11(It i, It x) {
- ranges::reverse_iterator<It> r(i);
- ranges::reverse_iterator<It> &rr = --r;
- CHECK(r.base() == x);
- CHECK(&rr == &r);
- }
- template<class It>
- void test12(It i, ranges::iter_difference_t<It> n, It x) {
- const ranges::reverse_iterator<It> r(i);
- ranges::reverse_iterator<It> rr = r - n;
- CHECK(rr.base() == x);
- }
- template<class It>
- void test13(It i, ranges::iter_difference_t<It> n, It x) {
- ranges::reverse_iterator<It> r(i);
- ranges::reverse_iterator<It> &rr = r -= n;
- CHECK(r.base() == x);
- CHECK(&rr == &r);
- }
- class A {
- int data_ = 1;
- public:
- A() = default;
- friend bool operator==(const A &x, const A &y) { return x.data_ == y.data_; }
- };
- template<class It> void test14(It i, ranges::iter_value_t<It> x) {
- ranges::reverse_iterator<It> r(i);
- CHECK(*r == x);
- }
- template<class It, class U> void test15(U u) {
- const ranges::reverse_iterator<U> r2(u);
- ranges::reverse_iterator<It> r1;
- ranges::reverse_iterator<It> &rr = r1 = r2;
- CHECK(r1.base() == u);
- CHECK(&rr == &r1);
- }
- template<class It> void test16(It l, It r, bool x) {
- const ranges::reverse_iterator<It> r1(l);
- const ranges::reverse_iterator<It> r2(r);
- CHECK((r1 == r2) == x);
- }
- template<class It1, class It2> void test17(It1 l, It2 r, std::ptrdiff_t x) {
- const ranges::reverse_iterator<It1> r1(l);
- const ranges::reverse_iterator<It2> r2(r);
- CHECK((r1 - r2) == x);
- }
- template<class It> void test18(It l, It r, bool x) {
- const ranges::reverse_iterator<It> r1(l);
- const ranges::reverse_iterator<It> r2(r);
- CHECK((r1 > r2) == x);
- }
- template<class It> void test19(It l, It r, bool x) {
- const ranges::reverse_iterator<It> r1(l);
- const ranges::reverse_iterator<It> r2(r);
- CHECK((r1 >= r2) == x);
- }
- template<class It>
- void test20(It i, ranges::iter_difference_t<It> n,
- ranges::iter_value_t<It> x) {
- const ranges::reverse_iterator<It> r(i);
- ranges::iter_value_t<It> rr = r[n];
- CHECK(rr == x);
- }
- template<class It> void test21(It l, It r, bool x) {
- const ranges::reverse_iterator<It> r1(l);
- const ranges::reverse_iterator<It> r2(r);
- CHECK((r1 < r2) == x);
- }
- template<class It>
- void
- test22(It l, It r, bool x)
- {
- const ranges::reverse_iterator<It> r1(l);
- const ranges::reverse_iterator<It> r2(r);
- CHECK((r1 < r2) == x);
- }
- template<class It>
- void
- test23(It l, It r, bool x)
- {
- const ranges::reverse_iterator<It> r1(l);
- const ranges::reverse_iterator<It> r2(r);
- CHECK((r1 <= r2) == x);
- }
- class B
- {
- int data_ = 1;
- public:
- B() = default;
- int get() const {return data_;}
- friend bool operator==(const B& x, const B& y)
- {return x.data_ == y.data_;}
- };
- template<class It>
- void
- test24(It i, ranges::iter_value_t<It> x)
- {
- ranges::reverse_iterator<It> r(i);
- CHECK((*r).get() == x.get());
- }
- class C
- {
- int data_ = 1;
- public:
- C(int d) : data_(d) {}
- C() = default;
- int get() const {return data_;}
- friend bool operator==(const C& x, const C& y)
- {return x.data_ == y.data_;}
- const C *operator&() const { return nullptr; }
- C *operator&() { return nullptr; }
- };
- template<class It>
- void
- test25(It i, ranges::iter_difference_t<It> n, It x)
- {
- const ranges::reverse_iterator<It> r(i);
- ranges::reverse_iterator<It> rr = n + r;
- CHECK(rr.base() == x);
- }
- int main()
- {
- {
- static_assert(
- ranges::detail::bidirectional_cursor<
- ranges::detail::reverse_cursor<BidirectionalIterator<const char *>>>,
- "");
- static_assert(
- ranges::detail::bidirectional_cursor<
- ranges::detail::reverse_cursor<RandomAccessIterator<const char *>>>,
- "");
- static_assert(
- ranges::detail::random_access_cursor<
- ranges::detail::reverse_cursor<RandomAccessIterator<const char *>>>,
- "");
- static_assert(
- ranges::bidirectional_iterator<
- ranges::reverse_iterator<BidirectionalIterator<const char *>>>,
- "");
- static_assert(
- ranges::random_access_iterator<
- ranges::reverse_iterator<RandomAccessIterator<const char *>>>,
- "");
- }
- { // test
- test<BidirectionalIterator<const char *>>();
- test<RandomAccessIterator<char *>>();
- test<char *>();
- test<const char *>();
- }
- { // test 2
- const char s[] = "123";
- test2(BidirectionalIterator<const char *>(s));
- test2(RandomAccessIterator<const char *>(s));
- }
- { // test3
- Derived d;
- test3<BidirectionalIterator<Base *>>(
- BidirectionalIterator<Derived *>(&d));
- //test3<RandomAccessIterator<const Base *>>(
- // RandomAccessIterator<Derived *>(&d));
- }
- //{ // test4
- // const char *s = "1234567890";
- // RandomAccessIterator<const char *> b(s);
- // RandomAccessIterator<const char *> e(s + 10);
- // while (b != e)
- // test4(b++);
- //}
- //{ // test5
- // const char *s = "1234567890";
- // test5(BidirectionalIterator<const char *>(s),
- // BidirectionalIterator<const char *>(s), false);
- // test5(BidirectionalIterator<const char *>(s),
- // BidirectionalIterator<const char *>(s + 1), true);
- // test5(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s), false);
- // test5(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s + 1), true);
- // test5(s, s, false);
- // test5(s, s + 1, true);
- //}
- //{
- // const char *s = "123";
- // test6(BidirectionalIterator<const char *>(s + 1),
- // BidirectionalIterator<const char *>(s));
- // test6(RandomAccessIterator<const char *>(s + 1),
- // RandomAccessIterator<const char *>(s));
- // test6(s + 1, s);
- //}
- //{
- // const char *s = "123";
- // test7(BidirectionalIterator<const char *>(s + 1),
- // BidirectionalIterator<const char *>(s));
- // test7(RandomAccessIterator<const char *>(s + 1),
- // RandomAccessIterator<const char *>(s));
- // test7(s + 1, s);
- //}
- //{
- // const char *s = "1234567890";
- // test8(RandomAccessIterator<const char *>(s + 5), 5,
- // RandomAccessIterator<const char *>(s));
- // test8(s + 5, 5, s);
- //}
- //{
- // const char *s = "1234567890";
- // test9(RandomAccessIterator<const char *>(s + 5), 5,
- // RandomAccessIterator<const char *>(s));
- // test9(s + 5, 5, s);
- //}
- //{
- // const char *s = "123";
- // test10(BidirectionalIterator<const char *>(s + 1),
- // BidirectionalIterator<const char *>(s + 2));
- // test10(RandomAccessIterator<const char *>(s + 1),
- // RandomAccessIterator<const char *>(s + 2));
- // test10(s + 1, s + 2);
- //}
- //{
- // const char *s = "123";
- // test11(BidirectionalIterator<const char *>(s + 1),
- // BidirectionalIterator<const char *>(s + 2));
- // test11(RandomAccessIterator<const char *>(s + 1),
- // RandomAccessIterator<const char *>(s + 2));
- // test11(s + 1, s + 2);
- //}
- //{
- // const char *s = "1234567890";
- // test12(RandomAccessIterator<const char *>(s + 5), 5,
- // RandomAccessIterator<const char *>(s + 10));
- // test12(s + 5, 5, s + 10);
- //}
- //{
- // const char *s = "1234567890";
- // test13(RandomAccessIterator<const char *>(s + 5), 5,
- // RandomAccessIterator<const char *>(s + 10));
- // test13(s + 5, 5, s + 10);
- //}
- //{
- // A a;
- // test14(&a + 1, A());
- //}
- //{
- // Derived d;
- // test15<BidirectionalIterator<Base *>>(
- // BidirectionalIterator<Derived *>(&d));
- // test15<RandomAccessIterator<const Base *>>(
- // RandomAccessIterator<Derived *>(&d));
- // test15<Base *>(&d);
- //}
- //{
- // const char *s = "1234567890";
- // test16(BidirectionalIterator<const char *>(s),
- // BidirectionalIterator<const char *>(s), true);
- // test16(BidirectionalIterator<const char *>(s),
- // BidirectionalIterator<const char *>(s + 1), false);
- // test16(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s), true);
- // test16(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s + 1), false);
- // test16(s, s, true);
- // test16(s, s + 1, false);
- //}
- //{
- // char s[3] = {0};
- // test17(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<char *>(s), 0);
- // RandomAccessIterator<char *> inp1(s);
- // test17(RandomAccessIterator<char *>(s),
- // RandomAccessIterator<const char *>(s + 1), 1);
- // test17(RandomAccessIterator<const char *>(s + 1),
- // RandomAccessIterator<char *>(s), -1);
- // test17(s, s, 0);
- // test17(s, s + 1, 1);
- // test17(s + 1, s, -1);
- //}
- //{
- // const char *s = "1234567890";
- // test18(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s), false);
- // test18(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s + 1), true);
- // test18(RandomAccessIterator<const char *>(s + 1),
- // RandomAccessIterator<const char *>(s), false);
- // test18(s, s, false);
- // test18(s, s + 1, true);
- // test18(s + 1, s, false);
- //}
- //{
- // const char *s = "1234567890";
- // test19(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s), true);
- // test19(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s + 1), true);
- // test19(RandomAccessIterator<const char *>(s + 1),
- // RandomAccessIterator<const char *>(s), false);
- // test19(s, s, true);
- // test19(s, s + 1, true);
- // test19(s + 1, s, false);
- //}
- //{
- // const char *s = "1234567890";
- // test20(RandomAccessIterator<const char *>(s + 5), 4, '1');
- // test20(s + 5, 4, '1');
- //}
- //{
- // const char *s = "1234567890";
- // test21(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s), false);
- // test21(RandomAccessIterator<const char *>(s),
- // RandomAccessIterator<const char *>(s + 1), false);
- // test21(RandomAccessIterator<const char *>(s + 1),
- // RandomAccessIterator<const char *>(s), true);
- // test21(s, s, false);
- // test21(s, s + 1, false);
- // test21(s + 1, s, true);
- //}
- //{
- // const char* s = "1234567890";
- // test22(RandomAccessIterator<const char*>(s), RandomAccessIterator<const char*>(s), false);
- // test22(RandomAccessIterator<const char*>(s), RandomAccessIterator<const char*>(s+1), false);
- // test22(RandomAccessIterator<const char*>(s+1), RandomAccessIterator<const char*>(s), true);
- // test22(s, s, false);
- // test22(s, s+1, false);
- // test22(s+1, s, true);
- //}
- //{
- // const char* s = "1234567890";
- // test23(RandomAccessIterator<const char*>(s), RandomAccessIterator<const char*>(s), true);
- // test23(RandomAccessIterator<const char*>(s), RandomAccessIterator<const char*>(s+1), false);
- // test23(RandomAccessIterator<const char*>(s+1), RandomAccessIterator<const char*>(s), true);
- // test23(s, s, true);
- // test23(s, s+1, false);
- // test23(s+1, s, true);
- //}
- //{
- // B a;
- // test24(&a+1, B());
- //}
- //{
- // C l[3] = {C(0), C(1), C(2)};
- // auto ri = ranges::rbegin(l);
- // CHECK ( ri->get() == 2 );
- // CHECK ( (*ri).get() == 2 );
- // CHECK ( ri.operator->() == ranges::prev(ri.base()) );
- // ++ri;
- // CHECK ( ri->get() == 1 );
- // CHECK ( (*ri).get() == 1 );
- // CHECK ( ri.operator->() == ranges::prev(ri.base()) );
- // ++ri;
- // CHECK ( ri->get() == 0 );
- // CHECK ( (*ri).get() == 0 );
- // CHECK ( ri.operator->() == ranges::prev(ri.base()) );
- // ++ri;
- // CHECK ( ri == ranges::rend(l));
- //}
- //{
- // const char* s = "1234567890";
- // test25(RandomAccessIterator<const char*>(s+5), 5, RandomAccessIterator<const char*>(s));
- // test25(s+5, 5, s);
- //}
- return test_result();
- }
|