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