// 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 //===----------------------------------------------------------------------===// // // 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 "../array.hpp" #include "../simple_test.hpp" #include "../test_utils.hpp" #include "../test_iterators.hpp" template void test_iter1() { int ia[] = {1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[] = {1, 2, 3}; CHECK(!ranges::lexicographical_compare(Iter1(ia), Sent1(ia+sa), Iter2(ib), Sent2(ib+2))); CHECK(ranges::lexicographical_compare(Iter1(ib), Sent1(ib+2), Iter2(ia), Sent2(ia+sa))); CHECK(!ranges::lexicographical_compare(Iter1(ia), Sent1(ia+sa), Iter2(ib), Sent2(ib+3))); CHECK(ranges::lexicographical_compare(Iter1(ib), Sent1(ib+3), Iter2(ia), Sent2(ia+sa))); CHECK(ranges::lexicographical_compare(Iter1(ia), Sent1(ia+sa), Iter2(ib+1), Sent2(ib+3))); CHECK(!ranges::lexicographical_compare(Iter1(ib+1), Sent1(ib+3), Iter2(ia), Sent2(ia+sa))); } void test_iter() { typedef Sentinel S; test_iter1, InputIterator >(); test_iter1, ForwardIterator >(); test_iter1, BidirectionalIterator >(); test_iter1, RandomAccessIterator >(); test_iter1, InputIterator, S, S>(); test_iter1, ForwardIterator, S, S>(); test_iter1, BidirectionalIterator, S, S>(); test_iter1, RandomAccessIterator, S, S>(); test_iter1, const int*>(); test_iter1, InputIterator >(); test_iter1, ForwardIterator >(); test_iter1, BidirectionalIterator >(); test_iter1, RandomAccessIterator >(); test_iter1, InputIterator, S, S>(); test_iter1, ForwardIterator, S, S>(); test_iter1, BidirectionalIterator, S, S>(); test_iter1, RandomAccessIterator, S, S>(); test_iter1, const int*>(); test_iter1, InputIterator >(); test_iter1, ForwardIterator >(); test_iter1, BidirectionalIterator >(); test_iter1, RandomAccessIterator >(); test_iter1, InputIterator, S, S>(); test_iter1, ForwardIterator, S, S>(); test_iter1, BidirectionalIterator, S, S>(); test_iter1, RandomAccessIterator, S, S>(); test_iter1, const int*>(); test_iter1, InputIterator >(); test_iter1, ForwardIterator >(); test_iter1, BidirectionalIterator >(); test_iter1, RandomAccessIterator >(); test_iter1, InputIterator, S, S>(); test_iter1, ForwardIterator, S, S>(); test_iter1, BidirectionalIterator, S, S>(); test_iter1, RandomAccessIterator, S, S>(); test_iter1, const int*>(); test_iter1 >(); test_iter1 >(); test_iter1 >(); test_iter1 >(); test_iter1, const int*, S>(); test_iter1, const int*, S>(); test_iter1, const int*, S>(); test_iter1, const int*, S>(); test_iter1(); } template void test_iter_comp1() { int ia[] = {1, 2, 3, 4}; const unsigned sa = sizeof(ia)/sizeof(ia[0]); int ib[] = {1, 2, 3}; typedef std::greater C; C c; CHECK(!ranges::lexicographical_compare(Iter1(ia), Sent1(ia+sa), Iter2(ib), Sent2(ib+2), c)); CHECK(ranges::lexicographical_compare(Iter1(ib), Sent1(ib+2), Iter2(ia), Sent2(ia+sa), c)); CHECK(!ranges::lexicographical_compare(Iter1(ia), Sent1(ia+sa), Iter2(ib), Sent2(ib+3), c)); CHECK(ranges::lexicographical_compare(Iter1(ib), Sent1(ib+3), Iter2(ia), Sent2(ia+sa), c)); CHECK(!ranges::lexicographical_compare(Iter1(ia), Sent1(ia+sa), Iter2(ib+1), Sent2(ib+3), c)); CHECK(ranges::lexicographical_compare(Iter1(ib+1), Sent1(ib+3), Iter2(ia), Sent2(ia+sa), c)); } void test_iter_comp() { typedef Sentinel S; test_iter_comp1, InputIterator >(); test_iter_comp1, ForwardIterator >(); test_iter_comp1, BidirectionalIterator >(); test_iter_comp1, RandomAccessIterator >(); test_iter_comp1, InputIterator, S, S>(); test_iter_comp1, ForwardIterator, S, S>(); test_iter_comp1, BidirectionalIterator, S, S>(); test_iter_comp1, RandomAccessIterator, S, S>(); test_iter_comp1, const int*>(); test_iter_comp1, InputIterator >(); test_iter_comp1, ForwardIterator >(); test_iter_comp1, BidirectionalIterator >(); test_iter_comp1, RandomAccessIterator >(); test_iter_comp1, InputIterator, S, S>(); test_iter_comp1, ForwardIterator, S, S>(); test_iter_comp1, BidirectionalIterator, S, S>(); test_iter_comp1, RandomAccessIterator, S, S>(); test_iter_comp1, const int*>(); test_iter_comp1, InputIterator >(); test_iter_comp1, ForwardIterator >(); test_iter_comp1, BidirectionalIterator >(); test_iter_comp1, RandomAccessIterator >(); test_iter_comp1, InputIterator, S, S>(); test_iter_comp1, ForwardIterator, S, S>(); test_iter_comp1, BidirectionalIterator, S, S>(); test_iter_comp1, RandomAccessIterator, S, S>(); test_iter_comp1, const int*>(); test_iter_comp1, InputIterator >(); test_iter_comp1, ForwardIterator >(); test_iter_comp1, BidirectionalIterator >(); test_iter_comp1, RandomAccessIterator >(); test_iter_comp1, InputIterator, S, S>(); test_iter_comp1, ForwardIterator, S, S>(); test_iter_comp1, BidirectionalIterator, S, S>(); test_iter_comp1, RandomAccessIterator, S, S>(); test_iter_comp1, const int*>(); test_iter_comp1 >(); test_iter_comp1 >(); test_iter_comp1 >(); test_iter_comp1 >(); test_iter_comp1, const int*, S>(); test_iter_comp1, const int*, S>(); test_iter_comp1, const int*, S>(); test_iter_comp1, const int*, S>(); test_iter_comp1(); } constexpr bool test_constexpr() { test::array ia{{1, 2, 3, 4}}; test::array ib{{1, 2, 3}}; auto ia_b = ranges::begin(ia); auto ia_e = ranges::end(ia); auto ib_b = ranges::begin(ib); auto ib_1 = ib_b + 1; auto ib_2 = ib_b + 2; auto ib_3 = ib_b + 3; STATIC_CHECK_RETURN(!ranges::lexicographical_compare(ia_b, ia_e, ib_b, ib_2)); STATIC_CHECK_RETURN(ranges::lexicographical_compare(ib_b, ib_2, ia_b, ia_e)); STATIC_CHECK_RETURN(!ranges::lexicographical_compare(ia_b, ia_e, ib_b, ib_3)); STATIC_CHECK_RETURN(ranges::lexicographical_compare(ib_b, ib_3, ia_b, ia_e)); STATIC_CHECK_RETURN(ranges::lexicographical_compare(ia_b, ia_e, ib_1, ib_3)); STATIC_CHECK_RETURN(!ranges::lexicographical_compare(ib_1, ib_3, ia_b, ia_e)); typedef std::greater C; C c{}; STATIC_CHECK_RETURN(!ranges::lexicographical_compare(ia_b, ia_e, ib_b, ib_2, c)); STATIC_CHECK_RETURN(ranges::lexicographical_compare(ib_b, ib_2, ia_b, ia_e, c)); STATIC_CHECK_RETURN(!ranges::lexicographical_compare(ia_b, ia_e, ib_b, ib_3, c)); STATIC_CHECK_RETURN(ranges::lexicographical_compare(ib_b, ib_3, ia_b, ia_e, c)); STATIC_CHECK_RETURN(!ranges::lexicographical_compare(ia_b, ia_e, ib_1, ib_3, c)); STATIC_CHECK_RETURN(ranges::lexicographical_compare(ib_1, ib_3, ia_b, ia_e, c)); return true; } int main() { test_iter(); test_iter_comp(); { STATIC_CHECK(test_constexpr()); } return test_result(); }