1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <algorithm> 11 12 // template <class InputIterator, class Predicate> 13 // constpexr bool // constexpr after C++17 14 // is_partitioned(InputIterator first, InputIterator last, Predicate pred); 15 16 #include <algorithm> 17 #include <functional> 18 #include <cstddef> 19 #include <cassert> 20 21 #include "test_macros.h" 22 #include "test_iterators.h" 23 #include "counting_predicates.hpp" 24 25 struct is_odd { 26 TEST_CONSTEXPR bool operator()(const int &i) const { return i & 1; } 27 }; 28 29 #if TEST_STD_VER > 17 30 TEST_CONSTEXPR bool test_constexpr() { 31 int ia[] = {1, 3, 5, 2, 4, 6}; 32 int ib[] = {1, 2, 3, 4, 5, 6}; 33 return std::is_partitioned(std::begin(ia), std::end(ia), is_odd()) 34 && !std::is_partitioned(std::begin(ib), std::end(ib), is_odd()); 35 } 36 #endif 37 38 39 int main() { 40 { 41 const int ia[] = {1, 2, 3, 4, 5, 6}; 42 unary_counting_predicate<is_odd, int> pred((is_odd())); 43 assert(!std::is_partitioned(input_iterator<const int *>(std::begin(ia)), 44 input_iterator<const int *>(std::end(ia)), 45 std::ref(pred))); 46 assert(static_cast<std::ptrdiff_t>(pred.count()) <= 47 std::distance(std::begin(ia), std::end(ia))); 48 } 49 { 50 const int ia[] = {1, 3, 5, 2, 4, 6}; 51 unary_counting_predicate<is_odd, int> pred((is_odd())); 52 assert(std::is_partitioned(input_iterator<const int *>(std::begin(ia)), 53 input_iterator<const int *>(std::end(ia)), 54 std::ref(pred))); 55 assert(static_cast<std::ptrdiff_t>(pred.count()) <= 56 std::distance(std::begin(ia), std::end(ia))); 57 } 58 { 59 const int ia[] = {2, 4, 6, 1, 3, 5}; 60 unary_counting_predicate<is_odd, int> pred((is_odd())); 61 assert(!std::is_partitioned(input_iterator<const int *>(std::begin(ia)), 62 input_iterator<const int *>(std::end(ia)), 63 std::ref(pred))); 64 assert(static_cast<std::ptrdiff_t>(pred.count()) <= 65 std::distance(std::begin(ia), std::end(ia))); 66 } 67 { 68 const int ia[] = {1, 3, 5, 2, 4, 6, 7}; 69 unary_counting_predicate<is_odd, int> pred((is_odd())); 70 assert(!std::is_partitioned(input_iterator<const int *>(std::begin(ia)), 71 input_iterator<const int *>(std::end(ia)), 72 std::ref(pred))); 73 assert(static_cast<std::ptrdiff_t>(pred.count()) <= 74 std::distance(std::begin(ia), std::end(ia))); 75 } 76 { 77 const int ia[] = {1, 3, 5, 2, 4, 6, 7}; 78 unary_counting_predicate<is_odd, int> pred((is_odd())); 79 assert(std::is_partitioned(input_iterator<const int *>(std::begin(ia)), 80 input_iterator<const int *>(std::begin(ia)), 81 std::ref(pred))); 82 assert(static_cast<std::ptrdiff_t>(pred.count()) <= 83 std::distance(std::begin(ia), std::begin(ia))); 84 } 85 { 86 const int ia[] = {1, 3, 5, 7, 9, 11, 2}; 87 unary_counting_predicate<is_odd, int> pred((is_odd())); 88 assert(std::is_partitioned(input_iterator<const int *>(std::begin(ia)), 89 input_iterator<const int *>(std::end(ia)), 90 std::ref(pred))); 91 assert(static_cast<std::ptrdiff_t>(pred.count()) <= 92 std::distance(std::begin(ia), std::end(ia))); 93 } 94 95 #if TEST_STD_VER > 17 96 static_assert(test_constexpr()); 97 #endif 98 } 99