| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // <iterator> |
| |
| // All of these became constexpr in C++17 |
| // |
| // template <InputIterator Iter, class Distance> |
| // constexpr void advance(Iter& i, Distance n); |
| // |
| // template <BidirectionalIterator Iter, class Distance> |
| // constexpr void advance(Iter& i, Distance n); |
| // |
| // template <RandomAccessIterator Iter, class Distance> |
| // constexpr void advance(Iter& i, Distance n); |
| |
| // Make sure we catch forced conversions to the difference_type if they happen. |
| // ADDITIONAL_COMPILER_FLAGS: -Wsign-conversion |
| |
| #include <iterator> |
| #include <cassert> |
| #include <cstddef> |
| #include <type_traits> |
| |
| #include "test_macros.h" |
| #include "test_iterators.h" |
| |
| template <class Distance, class It> |
| TEST_CONSTEXPR_CXX17 |
| void check_advance(It it, Distance n, It result) |
| { |
| static_assert(std::is_same<decltype(std::advance(it, n)), void>::value, ""); |
| std::advance(it, n); |
| assert(it == result); |
| } |
| |
| TEST_CONSTEXPR_CXX17 bool tests() |
| { |
| const char* s = "1234567890"; |
| typedef std::iterator_traits<const char*>::difference_type Distance; |
| check_advance<Distance>(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10)); |
| check_advance<Distance>(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)); |
| check_advance<Distance>(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10)); |
| check_advance<Distance>(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s)); |
| check_advance<Distance>(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)); |
| check_advance<Distance>(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s)); |
| check_advance<Distance>(s+5, 5, s+10); |
| check_advance<Distance>(s+5, -5, s); |
| |
| // Also check with other distance types |
| check_advance<std::size_t>(input_iterator<const char*>(s), 10u, input_iterator<const char*>(s+10)); |
| check_advance<std::size_t>(forward_iterator<const char*>(s), 10u, forward_iterator<const char*>(s+10)); |
| check_advance<std::size_t>(bidirectional_iterator<const char*>(s), 10u, bidirectional_iterator<const char*>(s+10)); |
| check_advance<std::size_t>(random_access_iterator<const char*>(s), 10u, random_access_iterator<const char*>(s+10)); |
| |
| return true; |
| } |
| |
| int main(int, char**) |
| { |
| tests(); |
| #if TEST_STD_VER >= 17 |
| static_assert(tests(), ""); |
| #endif |
| return 0; |
| } |