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 // <algorithm> 10 11 // template<InputIterator Iter1, ForwardIterator Iter2> 12 // requires HasEqualTo<Iter1::value_type, Iter2::value_type> 13 // constexpr Iter1 // constexpr after C++17 14 // find_first_of(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2); 15 16 #include <algorithm> 17 #include <cassert> 18 19 #include "test_macros.h" 20 #include "test_iterators.h" 21 22 #if TEST_STD_VER > 17 23 TEST_CONSTEXPR bool test_constexpr() { 24 int ia[] = {1, 2, 3}; 25 int ib[] = {7, 8, 9}; 26 int ic[] = {0, 1, 2, 3, 4, 5, 0, 1, 2, 3}; 27 typedef forward_iterator<int*> FI; 28 typedef bidirectional_iterator<int*> BI; 29 typedef random_access_iterator<int*> RI; 30 31 return (std::find_first_of(FI(std::begin(ic)), FI(std::end(ic)), FI(std::begin(ia)), FI(std::end(ia))) == FI(ic+1)) 32 && (std::find_first_of(FI(std::begin(ic)), FI(std::end(ic)), FI(std::begin(ib)), FI(std::end(ib))) == FI(std::end(ic))) 33 && (std::find_first_of(BI(std::begin(ic)), BI(std::end(ic)), BI(std::begin(ia)), BI(std::end(ia))) == BI(ic+1)) 34 && (std::find_first_of(BI(std::begin(ic)), BI(std::end(ic)), BI(std::begin(ib)), BI(std::end(ib))) == BI(std::end(ic))) 35 && (std::find_first_of(RI(std::begin(ic)), RI(std::end(ic)), RI(std::begin(ia)), RI(std::end(ia))) == RI(ic+1)) 36 && (std::find_first_of(RI(std::begin(ic)), RI(std::end(ic)), RI(std::begin(ib)), RI(std::end(ib))) == RI(std::end(ic))) 37 ; 38 } 39 #endif 40 41 int main() 42 { 43 int ia[] = {0, 1, 2, 3, 0, 1, 2, 3}; 44 const unsigned sa = sizeof(ia)/sizeof(ia[0]); 45 int ib[] = {1, 3, 5, 7}; 46 const unsigned sb = sizeof(ib)/sizeof(ib[0]); 47 assert(std::find_first_of(input_iterator<const int*>(ia), 48 input_iterator<const int*>(ia + sa), 49 forward_iterator<const int*>(ib), 50 forward_iterator<const int*>(ib + sb)) == 51 input_iterator<const int*>(ia+1)); 52 int ic[] = {7}; 53 assert(std::find_first_of(input_iterator<const int*>(ia), 54 input_iterator<const int*>(ia + sa), 55 forward_iterator<const int*>(ic), 56 forward_iterator<const int*>(ic + 1)) == 57 input_iterator<const int*>(ia+sa)); 58 assert(std::find_first_of(input_iterator<const int*>(ia), 59 input_iterator<const int*>(ia + sa), 60 forward_iterator<const int*>(ic), 61 forward_iterator<const int*>(ic)) == 62 input_iterator<const int*>(ia+sa)); 63 assert(std::find_first_of(input_iterator<const int*>(ia), 64 input_iterator<const int*>(ia), 65 forward_iterator<const int*>(ic), 66 forward_iterator<const int*>(ic+1)) == 67 input_iterator<const int*>(ia)); 68 69 #if TEST_STD_VER > 17 70 static_assert(test_constexpr()); 71 #endif 72 } 73