15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <iterator>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // template <InputIterator Iter>
1260cde7bbSLouis Dionne // Iter next(Iter x, Iter::difference_type n = 1); // constexpr in C++17
135a83710eSEric Fiselier
14e5f1288fSMarshall Clow // LWG #2353 relaxed the requirement on next from ForwardIterator to InputIterator
15e5f1288fSMarshall Clow
165a83710eSEric Fiselier #include <iterator>
175a83710eSEric Fiselier #include <cassert>
1860cde7bbSLouis Dionne #include <type_traits>
195a83710eSEric Fiselier
207fc6a556SMarshall Clow #include "test_macros.h"
215a83710eSEric Fiselier #include "test_iterators.h"
225a83710eSEric Fiselier
235a83710eSEric Fiselier template <class It>
2460cde7bbSLouis Dionne TEST_CONSTEXPR_CXX17 void
check_next_n(It it,typename std::iterator_traits<It>::difference_type n,It result)2560cde7bbSLouis Dionne check_next_n(It it, typename std::iterator_traits<It>::difference_type n, It result)
265a83710eSEric Fiselier {
2760cde7bbSLouis Dionne static_assert(std::is_same<decltype(std::next(it, n)), It>::value, "");
2860cde7bbSLouis Dionne assert(std::next(it, n) == result);
293e2ef408SRachel Craik
3060cde7bbSLouis Dionne It (*next_ptr)(It, typename std::iterator_traits<It>::difference_type) = std::next;
3160cde7bbSLouis Dionne assert(next_ptr(it, n) == result);
325a83710eSEric Fiselier }
335a83710eSEric Fiselier
345a83710eSEric Fiselier template <class It>
3560cde7bbSLouis Dionne TEST_CONSTEXPR_CXX17 void
check_next_1(It it,It result)3660cde7bbSLouis Dionne check_next_1(It it, It result)
375a83710eSEric Fiselier {
3860cde7bbSLouis Dionne static_assert(std::is_same<decltype(std::next(it)), It>::value, "");
3960cde7bbSLouis Dionne assert(std::next(it) == result);
405a83710eSEric Fiselier }
415a83710eSEric Fiselier
tests()4260cde7bbSLouis Dionne TEST_CONSTEXPR_CXX17 bool tests()
43f51ee632SMarshall Clow {
4460cde7bbSLouis Dionne const char* s = "1234567890";
45*773ae441SChristopher Di Bella check_next_n(cpp17_input_iterator<const char*>(s), 10, cpp17_input_iterator<const char*>(s+10));
4660cde7bbSLouis Dionne check_next_n(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
4760cde7bbSLouis Dionne check_next_n(bidirectional_iterator<const char*>(s), 10, bidirectional_iterator<const char*>(s+10));
4860cde7bbSLouis Dionne check_next_n(bidirectional_iterator<const char*>(s+10), -10, bidirectional_iterator<const char*>(s));
4960cde7bbSLouis Dionne check_next_n(random_access_iterator<const char*>(s), 10, random_access_iterator<const char*>(s+10));
5060cde7bbSLouis Dionne check_next_n(random_access_iterator<const char*>(s+10), -10, random_access_iterator<const char*>(s));
5160cde7bbSLouis Dionne check_next_n(s, 10, s+10);
52f51ee632SMarshall Clow
53*773ae441SChristopher Di Bella check_next_1(cpp17_input_iterator<const char*>(s), cpp17_input_iterator<const char*>(s+1));
5460cde7bbSLouis Dionne check_next_1(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1));
5560cde7bbSLouis Dionne check_next_1(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1));
5660cde7bbSLouis Dionne check_next_1(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1));
5760cde7bbSLouis Dionne check_next_1(s, s+1);
5860cde7bbSLouis Dionne
5960cde7bbSLouis Dionne return true;
60f51ee632SMarshall Clow }
61f51ee632SMarshall Clow
main(int,char **)622df59c50SJF Bastien int main(int, char**)
635a83710eSEric Fiselier {
6460cde7bbSLouis Dionne tests();
6560cde7bbSLouis Dionne #if TEST_STD_VER >= 17
6660cde7bbSLouis Dionne static_assert(tests(), "");
67f51ee632SMarshall Clow #endif
682df59c50SJF Bastien return 0;
69f51ee632SMarshall Clow }
70