Home | History | Annotate | Download | only in alg.search
      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 ForwardIterator, class Size, class T, class BinaryPredicate>
     13 //   ForwardIterator
     14 //   search_n(ForwardIterator first, ForwardIterator last, Size count,
     15 //            const T& value, BinaryPredicate pred);
     16 
     17 #include <algorithm>
     18 #include <cassert>
     19 
     20 #include "test_iterators.h"
     21 #include "user_defined_integral.hpp"
     22 
     23 struct count_equal
     24 {
     25     static unsigned count;
     26     template <class T>
     27     bool operator()(const T& x, const T& y)
     28         {++count; return x == y;}
     29 };
     30 
     31 unsigned count_equal::count = 0;
     32 
     33 
     34 template <class Iter>
     35 void
     36 test()
     37 {
     38     int ia[] = {0, 1, 2, 3, 4, 5};
     39     const unsigned sa = sizeof(ia)/sizeof(ia[0]);
     40     count_equal::count = 0;
     41     assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 0, count_equal()) == Iter(ia));
     42     assert(count_equal::count <= sa);
     43     count_equal::count = 0;
     44     assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 0, count_equal()) == Iter(ia+0));
     45     assert(count_equal::count <= sa);
     46     count_equal::count = 0;
     47     assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 0, count_equal()) == Iter(ia+sa));
     48     assert(count_equal::count <= sa);
     49     count_equal::count = 0;
     50     assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 0, count_equal()) == Iter(ia+sa));
     51     assert(count_equal::count <= sa);
     52     count_equal::count = 0;
     53     assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 3, count_equal()) == Iter(ia));
     54     assert(count_equal::count <= sa);
     55     count_equal::count = 0;
     56     assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 3, count_equal()) == Iter(ia+3));
     57     assert(count_equal::count <= sa);
     58     count_equal::count = 0;
     59     assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 3, count_equal()) == Iter(ia+sa));
     60     assert(count_equal::count <= sa);
     61     count_equal::count = 0;
     62     assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 3, count_equal()) == Iter(ia+sa));
     63     assert(count_equal::count <= sa);
     64     count_equal::count = 0;
     65     assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 5, count_equal()) == Iter(ia));
     66     assert(count_equal::count <= sa);
     67     count_equal::count = 0;
     68     assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 5, count_equal()) == Iter(ia+5));
     69     assert(count_equal::count <= sa);
     70     count_equal::count = 0;
     71     assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 5, count_equal()) == Iter(ia+sa));
     72     assert(count_equal::count <= sa);
     73     count_equal::count = 0;
     74     assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 5, count_equal()) == Iter(ia+sa));
     75     assert(count_equal::count <= sa);
     76     count_equal::count = 0;
     77 
     78     int ib[] = {0, 0, 1, 1, 2, 2};
     79     const unsigned sb = sizeof(ib)/sizeof(ib[0]);
     80     assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 0, count_equal()) == Iter(ib));
     81     assert(count_equal::count <= sb);
     82     count_equal::count = 0;
     83     assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 0, count_equal()) == Iter(ib+0));
     84     assert(count_equal::count <= sb);
     85     count_equal::count = 0;
     86     assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 0, count_equal()) == Iter(ib+0));
     87     assert(count_equal::count <= sb);
     88     count_equal::count = 0;
     89     assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 0, count_equal()) == Iter(ib+sb));
     90     assert(count_equal::count <= sb);
     91     count_equal::count = 0;
     92     assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 0, count_equal()) == Iter(ib+sb));
     93     assert(count_equal::count <= sb);
     94     count_equal::count = 0;
     95     assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 1, count_equal()) == Iter(ib));
     96     assert(count_equal::count <= sb);
     97     count_equal::count = 0;
     98     assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 1, count_equal()) == Iter(ib+2));
     99     assert(count_equal::count <= sb);
    100     count_equal::count = 0;
    101     assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 1, count_equal()) == Iter(ib+2));
    102     assert(count_equal::count <= sb);
    103     count_equal::count = 0;
    104     assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 1, count_equal()) == Iter(ib+sb));
    105     assert(count_equal::count <= sb);
    106     count_equal::count = 0;
    107     assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 1, count_equal()) == Iter(ib+sb));
    108     assert(count_equal::count <= sb);
    109     count_equal::count = 0;
    110     assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 2, count_equal()) == Iter(ib));
    111     assert(count_equal::count <= sb);
    112     count_equal::count = 0;
    113     assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 2, count_equal()) == Iter(ib+4));
    114     assert(count_equal::count <= sb);
    115     count_equal::count = 0;
    116     assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 2, count_equal()) == Iter(ib+4));
    117     assert(count_equal::count <= sb);
    118     count_equal::count = 0;
    119     assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 2, count_equal()) == Iter(ib+sb));
    120     assert(count_equal::count <= sb);
    121     count_equal::count = 0;
    122     assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 2, count_equal()) == Iter(ib+sb));
    123     assert(count_equal::count <= sb);
    124     count_equal::count = 0;
    125 
    126     int ic[] = {0, 0, 0};
    127     const unsigned sc = sizeof(ic)/sizeof(ic[0]);
    128     assert(std::search_n(Iter(ic), Iter(ic+sc), 0, 0, count_equal()) == Iter(ic));
    129     assert(count_equal::count <= sc);
    130     count_equal::count = 0;
    131     assert(std::search_n(Iter(ic), Iter(ic+sc), 1, 0, count_equal()) == Iter(ic));
    132     assert(count_equal::count <= sc);
    133     count_equal::count = 0;
    134     assert(std::search_n(Iter(ic), Iter(ic+sc), 2, 0, count_equal()) == Iter(ic));
    135     assert(count_equal::count <= sc);
    136     count_equal::count = 0;
    137     assert(std::search_n(Iter(ic), Iter(ic+sc), 3, 0, count_equal()) == Iter(ic));
    138     assert(count_equal::count <= sc);
    139     count_equal::count = 0;
    140     assert(std::search_n(Iter(ic), Iter(ic+sc), 4, 0, count_equal()) == Iter(ic+sc));
    141     assert(count_equal::count <= sc);
    142     count_equal::count = 0;
    143 
    144     // Check that we properly convert the size argument to an integral.
    145     std::search_n(Iter(ic), Iter(ic+sc), UserDefinedIntegral<unsigned>(4), 0, count_equal());
    146     count_equal::count = 0;
    147 }
    148 
    149 int main()
    150 {
    151     test<forward_iterator<const int*> >();
    152     test<bidirectional_iterator<const int*> >();
    153     test<random_access_iterator<const int*> >();
    154 }
    155