1128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant//===----------------------------------------------------------------------===// 2128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// 3128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// The LLVM Compiler Infrastructure 4128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// 5128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// 8128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant//===----------------------------------------------------------------------===// 9128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant 10128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// <algorithm> 11128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant 12128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// template<class ForwardIterator, class Size, class T> 13d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow// constexpr ForwardIterator // constexpr after C++17 14128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// search_n(ForwardIterator first, ForwardIterator last, Size count, 15128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant// const T& value); 16128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant 17128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant#include <algorithm> 18128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant#include <cassert> 19128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant 20d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow#include "test_macros.h" 21128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant#include "test_iterators.h" 2231cb7fe75e41a706062859350ab7b4879470eefeEric Fiselier#include "user_defined_integral.hpp" 23128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant 24d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow#if TEST_STD_VER > 17 25d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall ClowTEST_CONSTEXPR bool test_constexpr() { 26d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow int ia[] = {0, 0, 1, 1, 2, 2}; 27d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow return (std::search_n(std::begin(ia), std::end(ia), 1, 0) == ia) 28d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow && (std::search_n(std::begin(ia), std::end(ia), 2, 1) == ia+2) 29d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow && (std::search_n(std::begin(ia), std::end(ia), 1, 3) == std::end(ia)) 30d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow ; 31d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow } 32d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow#endif 33d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow 34128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnanttemplate <class Iter> 35128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnantvoid 36128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnanttest() 37128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant{ 38128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant int ia[] = {0, 1, 2, 3, 4, 5}; 39128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant const unsigned sa = sizeof(ia)/sizeof(ia[0]); 40128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 0) == Iter(ia)); 41128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 0) == Iter(ia+0)); 42128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 0) == Iter(ia+sa)); 43128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 0) == Iter(ia+sa)); 44128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 3) == Iter(ia)); 45128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 3) == Iter(ia+3)); 46128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 3) == Iter(ia+sa)); 47128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 3) == Iter(ia+sa)); 48128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 5) == Iter(ia)); 49128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 5) == Iter(ia+5)); 50128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 5) == Iter(ia+sa)); 51128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 5) == Iter(ia+sa)); 52128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant 53128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant int ib[] = {0, 0, 1, 1, 2, 2}; 54128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant const unsigned sb = sizeof(ib)/sizeof(ib[0]); 55128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 0) == Iter(ib)); 56128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 0) == Iter(ib+0)); 57128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 0) == Iter(ib+0)); 58128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 0) == Iter(ib+sb)); 59128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 0) == Iter(ib+sb)); 60128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 1) == Iter(ib)); 61128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 1) == Iter(ib+2)); 62128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 1) == Iter(ib+2)); 63128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 1) == Iter(ib+sb)); 64128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 1) == Iter(ib+sb)); 65128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 2) == Iter(ib)); 66128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 2) == Iter(ib+4)); 67128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 2) == Iter(ib+4)); 68128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 2) == Iter(ib+sb)); 69128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 2) == Iter(ib+sb)); 70128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant 71128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant int ic[] = {0, 0, 0}; 72128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant const unsigned sc = sizeof(ic)/sizeof(ic[0]); 73128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ic), Iter(ic+sc), 0, 0) == Iter(ic)); 74128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ic), Iter(ic+sc), 1, 0) == Iter(ic)); 75128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ic), Iter(ic+sc), 2, 0) == Iter(ic)); 76128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ic), Iter(ic+sc), 3, 0) == Iter(ic)); 77128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant assert(std::search_n(Iter(ic), Iter(ic+sc), 4, 0) == Iter(ic+sc)); 7831cb7fe75e41a706062859350ab7b4879470eefeEric Fiselier 7931cb7fe75e41a706062859350ab7b4879470eefeEric Fiselier // Check that we properly convert the size argument to an integral. 80b9816677762c5dc7957a0c92a506505b12231580Billy Robert O'Neal III (void)std::search_n(Iter(ic), Iter(ic+sc), UserDefinedIntegral<unsigned>(0), 0); 81128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant} 82128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant 83128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnantint main() 84128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant{ 85128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant test<forward_iterator<const int*> >(); 86128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant test<bidirectional_iterator<const int*> >(); 87128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant test<random_access_iterator<const int*> >(); 88d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow 89d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow#if TEST_STD_VER > 17 90d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow static_assert(test_constexpr()); 91d6082200f6fad2c3ca7d1ce8a01253d503c7158aMarshall Clow#endif 92128f7bf4fadd6231d23e53890e418415414241a5Howard Hinnant} 93