1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <iterator> 10 11 // template <InputIterator Iter> 12 // Iter prev(Iter x, Iter::difference_type n = 1); 13 14 #include <iterator> 15 #include <cassert> 16 17 #include "test_macros.h" 18 #include "test_iterators.h" 19 20 template <class It> 21 void 22 test(It i, typename std::iterator_traits<It>::difference_type n, It x) 23 { 24 assert(std::prev(i, n) == x); 25 26 It (*prev)(It, typename std::iterator_traits<It>::difference_type) = std::prev; 27 assert(prev(i, n) == x); 28 } 29 30 template <class It> 31 void 32 test(It i, It x) 33 { 34 assert(std::prev(i) == x); 35 } 36 37 #if TEST_STD_VER > 14 38 template <class It> 39 constexpr bool 40 constexpr_test(It i, typename std::iterator_traits<It>::difference_type n, It x) 41 { 42 return std::prev(i, n) == x; 43 } 44 45 template <class It> 46 constexpr bool 47 constexpr_test(It i, It x) 48 { 49 return std::prev(i) == x; 50 } 51 #endif 52 53 int main(int, char**) 54 { 55 { 56 const char* s = "1234567890"; 57 test(forward_iterator <const char*>(s), -10, forward_iterator <const char*>(s+10)); 58 test(bidirectional_iterator<const char*>(s+10), 10, bidirectional_iterator<const char*>(s)); 59 test(bidirectional_iterator<const char*>(s), -10, bidirectional_iterator<const char*>(s+10)); 60 test(random_access_iterator<const char*>(s+10), 10, random_access_iterator<const char*>(s)); 61 test(random_access_iterator<const char*>(s), -10, random_access_iterator<const char*>(s+10)); 62 test(s+10, 10, s); 63 64 test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s)); 65 test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s)); 66 test(s+1, s); 67 } 68 #if TEST_STD_VER > 14 69 { 70 constexpr const char* s = "1234567890"; 71 static_assert( constexpr_test(forward_iterator <const char*>(s), -10, forward_iterator <const char*>(s+10)), "" ); 72 static_assert( constexpr_test(bidirectional_iterator<const char*>(s+10), 10, bidirectional_iterator<const char*>(s)), "" ); 73 static_assert( constexpr_test(forward_iterator <const char*>(s), -10, forward_iterator <const char*>(s+10)), "" ); 74 static_assert( constexpr_test(random_access_iterator<const char*>(s+10), 10, random_access_iterator<const char*>(s)), "" ); 75 static_assert( constexpr_test(forward_iterator <const char*>(s), -10, forward_iterator <const char*>(s+10)), "" ); 76 static_assert( constexpr_test(s+10, 10, s), "" ); 77 78 static_assert( constexpr_test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s)), "" ); 79 static_assert( constexpr_test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s)), "" ); 80 static_assert( constexpr_test(s+1, s), "" ); 81 } 82 #endif 83 84 85 return 0; 86 } 87