// 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 #include #include "../simple_test.hpp" #include "../test_iterators.hpp" template void test() { ranges::reverse_iterator{}; } template void test2(It i) { ranges::reverse_iterator r(i); CHECK(r.base() == i); } template void test3(U u) { const ranges::reverse_iterator r2(u); ranges::reverse_iterator r1 = ranges::reverse_iterator(r2); CHECK(r1.base() == u); } struct Base {}; struct Derived : Base {}; template void test4(It i) { const ranges::reverse_iterator r = ranges::make_reverse_iterator(i); CHECK(r.base() == i); } template void test5(It l, It r, bool x) { const ranges::reverse_iterator r1(l); const ranges::reverse_iterator r2(r); CHECK((r1 != r2) == x); } template void test6(It i, It x) { ranges::reverse_iterator r(i); ranges::reverse_iterator rr = r++; CHECK(r.base() == x); CHECK(rr.base() == i); } template void test7(It i, It x) { ranges::reverse_iterator r(i); ranges::reverse_iterator &rr = ++r; CHECK(r.base() == x); CHECK(&rr == &r); } template void test8(It i, ranges::iter_difference_t n, It x) { const ranges::reverse_iterator r(i); ranges::reverse_iterator rr = r + n; CHECK(rr.base() == x); } template void test9(It i, ranges::iter_difference_t n, It x) { ranges::reverse_iterator r(i); ranges::reverse_iterator &rr = r += n; CHECK(r.base() == x); CHECK(&rr == &r); } template void test10(It i, It x) { ranges::reverse_iterator r(i); ranges::reverse_iterator rr = r--; CHECK(r.base() == x); CHECK(rr.base() == i); } template void test11(It i, It x) { ranges::reverse_iterator r(i); ranges::reverse_iterator &rr = --r; CHECK(r.base() == x); CHECK(&rr == &r); } template void test12(It i, ranges::iter_difference_t n, It x) { const ranges::reverse_iterator r(i); ranges::reverse_iterator rr = r - n; CHECK(rr.base() == x); } template void test13(It i, ranges::iter_difference_t n, It x) { ranges::reverse_iterator r(i); ranges::reverse_iterator &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 void test14(It i, ranges::iter_value_t x) { ranges::reverse_iterator r(i); CHECK(*r == x); } template void test15(U u) { const ranges::reverse_iterator r2(u); ranges::reverse_iterator r1; ranges::reverse_iterator &rr = r1 = r2; CHECK(r1.base() == u); CHECK(&rr == &r1); } template void test16(It l, It r, bool x) { const ranges::reverse_iterator r1(l); const ranges::reverse_iterator r2(r); CHECK((r1 == r2) == x); } template void test17(It1 l, It2 r, std::ptrdiff_t x) { const ranges::reverse_iterator r1(l); const ranges::reverse_iterator r2(r); CHECK((r1 - r2) == x); } template void test18(It l, It r, bool x) { const ranges::reverse_iterator r1(l); const ranges::reverse_iterator r2(r); CHECK((r1 > r2) == x); } template void test19(It l, It r, bool x) { const ranges::reverse_iterator r1(l); const ranges::reverse_iterator r2(r); CHECK((r1 >= r2) == x); } template void test20(It i, ranges::iter_difference_t n, ranges::iter_value_t x) { const ranges::reverse_iterator r(i); ranges::iter_value_t rr = r[n]; CHECK(rr == x); } template void test21(It l, It r, bool x) { const ranges::reverse_iterator r1(l); const ranges::reverse_iterator r2(r); CHECK((r1 < r2) == x); } template void test22(It l, It r, bool x) { const ranges::reverse_iterator r1(l); const ranges::reverse_iterator r2(r); CHECK((r1 < r2) == x); } template void test23(It l, It r, bool x) { const ranges::reverse_iterator r1(l); const ranges::reverse_iterator 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 void test24(It i, ranges::iter_value_t x) { ranges::reverse_iterator 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 void test25(It i, ranges::iter_difference_t n, It x) { const ranges::reverse_iterator r(i); ranges::reverse_iterator rr = n + r; CHECK(rr.base() == x); } int main() { { static_assert( ranges::detail::bidirectional_cursor< ranges::detail::reverse_cursor>>, ""); static_assert( ranges::detail::bidirectional_cursor< ranges::detail::reverse_cursor>>, ""); static_assert( ranges::detail::random_access_cursor< ranges::detail::reverse_cursor>>, ""); static_assert( ranges::bidirectional_iterator< ranges::reverse_iterator>>, ""); static_assert( ranges::random_access_iterator< ranges::reverse_iterator>>, ""); } { // test test>(); test>(); test(); test(); } { // test 2 const char s[] = "123"; test2(BidirectionalIterator(s)); test2(RandomAccessIterator(s)); } { // test3 Derived d; test3>( BidirectionalIterator(&d)); //test3>( // RandomAccessIterator(&d)); } //{ // test4 // const char *s = "1234567890"; // RandomAccessIterator b(s); // RandomAccessIterator e(s + 10); // while (b != e) // test4(b++); //} //{ // test5 // const char *s = "1234567890"; // test5(BidirectionalIterator(s), // BidirectionalIterator(s), false); // test5(BidirectionalIterator(s), // BidirectionalIterator(s + 1), true); // test5(RandomAccessIterator(s), // RandomAccessIterator(s), false); // test5(RandomAccessIterator(s), // RandomAccessIterator(s + 1), true); // test5(s, s, false); // test5(s, s + 1, true); //} //{ // const char *s = "123"; // test6(BidirectionalIterator(s + 1), // BidirectionalIterator(s)); // test6(RandomAccessIterator(s + 1), // RandomAccessIterator(s)); // test6(s + 1, s); //} //{ // const char *s = "123"; // test7(BidirectionalIterator(s + 1), // BidirectionalIterator(s)); // test7(RandomAccessIterator(s + 1), // RandomAccessIterator(s)); // test7(s + 1, s); //} //{ // const char *s = "1234567890"; // test8(RandomAccessIterator(s + 5), 5, // RandomAccessIterator(s)); // test8(s + 5, 5, s); //} //{ // const char *s = "1234567890"; // test9(RandomAccessIterator(s + 5), 5, // RandomAccessIterator(s)); // test9(s + 5, 5, s); //} //{ // const char *s = "123"; // test10(BidirectionalIterator(s + 1), // BidirectionalIterator(s + 2)); // test10(RandomAccessIterator(s + 1), // RandomAccessIterator(s + 2)); // test10(s + 1, s + 2); //} //{ // const char *s = "123"; // test11(BidirectionalIterator(s + 1), // BidirectionalIterator(s + 2)); // test11(RandomAccessIterator(s + 1), // RandomAccessIterator(s + 2)); // test11(s + 1, s + 2); //} //{ // const char *s = "1234567890"; // test12(RandomAccessIterator(s + 5), 5, // RandomAccessIterator(s + 10)); // test12(s + 5, 5, s + 10); //} //{ // const char *s = "1234567890"; // test13(RandomAccessIterator(s + 5), 5, // RandomAccessIterator(s + 10)); // test13(s + 5, 5, s + 10); //} //{ // A a; // test14(&a + 1, A()); //} //{ // Derived d; // test15>( // BidirectionalIterator(&d)); // test15>( // RandomAccessIterator(&d)); // test15(&d); //} //{ // const char *s = "1234567890"; // test16(BidirectionalIterator(s), // BidirectionalIterator(s), true); // test16(BidirectionalIterator(s), // BidirectionalIterator(s + 1), false); // test16(RandomAccessIterator(s), // RandomAccessIterator(s), true); // test16(RandomAccessIterator(s), // RandomAccessIterator(s + 1), false); // test16(s, s, true); // test16(s, s + 1, false); //} //{ // char s[3] = {0}; // test17(RandomAccessIterator(s), // RandomAccessIterator(s), 0); // RandomAccessIterator inp1(s); // test17(RandomAccessIterator(s), // RandomAccessIterator(s + 1), 1); // test17(RandomAccessIterator(s + 1), // RandomAccessIterator(s), -1); // test17(s, s, 0); // test17(s, s + 1, 1); // test17(s + 1, s, -1); //} //{ // const char *s = "1234567890"; // test18(RandomAccessIterator(s), // RandomAccessIterator(s), false); // test18(RandomAccessIterator(s), // RandomAccessIterator(s + 1), true); // test18(RandomAccessIterator(s + 1), // RandomAccessIterator(s), false); // test18(s, s, false); // test18(s, s + 1, true); // test18(s + 1, s, false); //} //{ // const char *s = "1234567890"; // test19(RandomAccessIterator(s), // RandomAccessIterator(s), true); // test19(RandomAccessIterator(s), // RandomAccessIterator(s + 1), true); // test19(RandomAccessIterator(s + 1), // RandomAccessIterator(s), false); // test19(s, s, true); // test19(s, s + 1, true); // test19(s + 1, s, false); //} //{ // const char *s = "1234567890"; // test20(RandomAccessIterator(s + 5), 4, '1'); // test20(s + 5, 4, '1'); //} //{ // const char *s = "1234567890"; // test21(RandomAccessIterator(s), // RandomAccessIterator(s), false); // test21(RandomAccessIterator(s), // RandomAccessIterator(s + 1), false); // test21(RandomAccessIterator(s + 1), // RandomAccessIterator(s), true); // test21(s, s, false); // test21(s, s + 1, false); // test21(s + 1, s, true); //} //{ // const char* s = "1234567890"; // test22(RandomAccessIterator(s), RandomAccessIterator(s), false); // test22(RandomAccessIterator(s), RandomAccessIterator(s+1), false); // test22(RandomAccessIterator(s+1), RandomAccessIterator(s), true); // test22(s, s, false); // test22(s, s+1, false); // test22(s+1, s, true); //} //{ // const char* s = "1234567890"; // test23(RandomAccessIterator(s), RandomAccessIterator(s), true); // test23(RandomAccessIterator(s), RandomAccessIterator(s+1), false); // test23(RandomAccessIterator(s+1), RandomAccessIterator(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(s+5), 5, RandomAccessIterator(s)); // test25(s+5, 5, s); //} return test_result(); }