Home | History | Annotate | Download | only in string_find
      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 // <string>
     11 
     12 // size_type find(const charT* s, size_type pos, size_type n) const;
     13 
     14 #include <string>
     15 #include <cassert>
     16 
     17 #include "min_allocator.h"
     18 
     19 template <class S>
     20 void
     21 test(const S& s, const typename S::value_type* str, typename S::size_type pos,
     22      typename S::size_type n, typename S::size_type x)
     23 {
     24     assert(s.find(str, pos, n) == x);
     25     if (x != S::npos)
     26         assert(pos <= x && x + n <= s.size());
     27 }
     28 
     29 template <class S>
     30 void test0()
     31 {
     32     test(S(""), "", 0, 0, 0);
     33     test(S(""), "abcde", 0, 0, 0);
     34     test(S(""), "abcde", 0, 1, S::npos);
     35     test(S(""), "abcde", 0, 2, S::npos);
     36     test(S(""), "abcde", 0, 4, S::npos);
     37     test(S(""), "abcde", 0, 5, S::npos);
     38     test(S(""), "abcdeabcde", 0, 0, 0);
     39     test(S(""), "abcdeabcde", 0, 1, S::npos);
     40     test(S(""), "abcdeabcde", 0, 5, S::npos);
     41     test(S(""), "abcdeabcde", 0, 9, S::npos);
     42     test(S(""), "abcdeabcde", 0, 10, S::npos);
     43     test(S(""), "abcdeabcdeabcdeabcde", 0, 0, 0);
     44     test(S(""), "abcdeabcdeabcdeabcde", 0, 1, S::npos);
     45     test(S(""), "abcdeabcdeabcdeabcde", 0, 10, S::npos);
     46     test(S(""), "abcdeabcdeabcdeabcde", 0, 19, S::npos);
     47     test(S(""), "abcdeabcdeabcdeabcde", 0, 20, S::npos);
     48     test(S(""), "", 1, 0, S::npos);
     49     test(S(""), "abcde", 1, 0, S::npos);
     50     test(S(""), "abcde", 1, 1, S::npos);
     51     test(S(""), "abcde", 1, 2, S::npos);
     52     test(S(""), "abcde", 1, 4, S::npos);
     53     test(S(""), "abcde", 1, 5, S::npos);
     54     test(S(""), "abcdeabcde", 1, 0, S::npos);
     55     test(S(""), "abcdeabcde", 1, 1, S::npos);
     56     test(S(""), "abcdeabcde", 1, 5, S::npos);
     57     test(S(""), "abcdeabcde", 1, 9, S::npos);
     58     test(S(""), "abcdeabcde", 1, 10, S::npos);
     59     test(S(""), "abcdeabcdeabcdeabcde", 1, 0, S::npos);
     60     test(S(""), "abcdeabcdeabcdeabcde", 1, 1, S::npos);
     61     test(S(""), "abcdeabcdeabcdeabcde", 1, 10, S::npos);
     62     test(S(""), "abcdeabcdeabcdeabcde", 1, 19, S::npos);
     63     test(S(""), "abcdeabcdeabcdeabcde", 1, 20, S::npos);
     64     test(S("abcde"), "", 0, 0, 0);
     65     test(S("abcde"), "abcde", 0, 0, 0);
     66     test(S("abcde"), "abcde", 0, 1, 0);
     67     test(S("abcde"), "abcde", 0, 2, 0);
     68     test(S("abcde"), "abcde", 0, 4, 0);
     69     test(S("abcde"), "abcde", 0, 5, 0);
     70     test(S("abcde"), "abcdeabcde", 0, 0, 0);
     71     test(S("abcde"), "abcdeabcde", 0, 1, 0);
     72     test(S("abcde"), "abcdeabcde", 0, 5, 0);
     73     test(S("abcde"), "abcdeabcde", 0, 9, S::npos);
     74     test(S("abcde"), "abcdeabcde", 0, 10, S::npos);
     75     test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 0, 0);
     76     test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 1, 0);
     77     test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 10, S::npos);
     78     test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 19, S::npos);
     79     test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 20, S::npos);
     80     test(S("abcde"), "", 1, 0, 1);
     81     test(S("abcde"), "abcde", 1, 0, 1);
     82     test(S("abcde"), "abcde", 1, 1, S::npos);
     83     test(S("abcde"), "abcde", 1, 2, S::npos);
     84     test(S("abcde"), "abcde", 1, 4, S::npos);
     85     test(S("abcde"), "abcde", 1, 5, S::npos);
     86     test(S("abcde"), "abcdeabcde", 1, 0, 1);
     87     test(S("abcde"), "abcdeabcde", 1, 1, S::npos);
     88     test(S("abcde"), "abcdeabcde", 1, 5, S::npos);
     89     test(S("abcde"), "abcdeabcde", 1, 9, S::npos);
     90     test(S("abcde"), "abcdeabcde", 1, 10, S::npos);
     91     test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 0, 1);
     92     test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 1, S::npos);
     93     test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 10, S::npos);
     94     test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos);
     95     test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos);
     96     test(S("abcde"), "", 2, 0, 2);
     97     test(S("abcde"), "abcde", 2, 0, 2);
     98     test(S("abcde"), "abcde", 2, 1, S::npos);
     99     test(S("abcde"), "abcde", 2, 2, S::npos);
    100     test(S("abcde"), "abcde", 2, 4, S::npos);
    101     test(S("abcde"), "abcde", 2, 5, S::npos);
    102     test(S("abcde"), "abcdeabcde", 2, 0, 2);
    103     test(S("abcde"), "abcdeabcde", 2, 1, S::npos);
    104     test(S("abcde"), "abcdeabcde", 2, 5, S::npos);
    105     test(S("abcde"), "abcdeabcde", 2, 9, S::npos);
    106     test(S("abcde"), "abcdeabcde", 2, 10, S::npos);
    107     test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 0, 2);
    108     test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 1, S::npos);
    109     test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 10, S::npos);
    110     test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 19, S::npos);
    111     test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 20, S::npos);
    112     test(S("abcde"), "", 4, 0, 4);
    113     test(S("abcde"), "abcde", 4, 0, 4);
    114     test(S("abcde"), "abcde", 4, 1, S::npos);
    115     test(S("abcde"), "abcde", 4, 2, S::npos);
    116     test(S("abcde"), "abcde", 4, 4, S::npos);
    117     test(S("abcde"), "abcde", 4, 5, S::npos);
    118     test(S("abcde"), "abcdeabcde", 4, 0, 4);
    119     test(S("abcde"), "abcdeabcde", 4, 1, S::npos);
    120     test(S("abcde"), "abcdeabcde", 4, 5, S::npos);
    121     test(S("abcde"), "abcdeabcde", 4, 9, S::npos);
    122     test(S("abcde"), "abcdeabcde", 4, 10, S::npos);
    123     test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 0, 4);
    124     test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 1, S::npos);
    125     test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 10, S::npos);
    126     test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 19, S::npos);
    127     test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 20, S::npos);
    128     test(S("abcde"), "", 5, 0, 5);
    129     test(S("abcde"), "abcde", 5, 0, 5);
    130     test(S("abcde"), "abcde", 5, 1, S::npos);
    131     test(S("abcde"), "abcde", 5, 2, S::npos);
    132 }
    133 
    134 template <class S>
    135 void test1()
    136 {
    137     test(S("abcde"), "abcde", 5, 4, S::npos);
    138     test(S("abcde"), "abcde", 5, 5, S::npos);
    139     test(S("abcde"), "abcdeabcde", 5, 0, 5);
    140     test(S("abcde"), "abcdeabcde", 5, 1, S::npos);
    141     test(S("abcde"), "abcdeabcde", 5, 5, S::npos);
    142     test(S("abcde"), "abcdeabcde", 5, 9, S::npos);
    143     test(S("abcde"), "abcdeabcde", 5, 10, S::npos);
    144     test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 0, 5);
    145     test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 1, S::npos);
    146     test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 10, S::npos);
    147     test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 19, S::npos);
    148     test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 20, S::npos);
    149     test(S("abcde"), "", 6, 0, S::npos);
    150     test(S("abcde"), "abcde", 6, 0, S::npos);
    151     test(S("abcde"), "abcde", 6, 1, S::npos);
    152     test(S("abcde"), "abcde", 6, 2, S::npos);
    153     test(S("abcde"), "abcde", 6, 4, S::npos);
    154     test(S("abcde"), "abcde", 6, 5, S::npos);
    155     test(S("abcde"), "abcdeabcde", 6, 0, S::npos);
    156     test(S("abcde"), "abcdeabcde", 6, 1, S::npos);
    157     test(S("abcde"), "abcdeabcde", 6, 5, S::npos);
    158     test(S("abcde"), "abcdeabcde", 6, 9, S::npos);
    159     test(S("abcde"), "abcdeabcde", 6, 10, S::npos);
    160     test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 0, S::npos);
    161     test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 1, S::npos);
    162     test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 10, S::npos);
    163     test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 19, S::npos);
    164     test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 20, S::npos);
    165     test(S("abcdeabcde"), "", 0, 0, 0);
    166     test(S("abcdeabcde"), "abcde", 0, 0, 0);
    167     test(S("abcdeabcde"), "abcde", 0, 1, 0);
    168     test(S("abcdeabcde"), "abcde", 0, 2, 0);
    169     test(S("abcdeabcde"), "abcde", 0, 4, 0);
    170     test(S("abcdeabcde"), "abcde", 0, 5, 0);
    171     test(S("abcdeabcde"), "abcdeabcde", 0, 0, 0);
    172     test(S("abcdeabcde"), "abcdeabcde", 0, 1, 0);
    173     test(S("abcdeabcde"), "abcdeabcde", 0, 5, 0);
    174     test(S("abcdeabcde"), "abcdeabcde", 0, 9, 0);
    175     test(S("abcdeabcde"), "abcdeabcde", 0, 10, 0);
    176     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0, 0);
    177     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 1, 0);
    178     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 10, 0);
    179     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 19, S::npos);
    180     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 20, S::npos);
    181     test(S("abcdeabcde"), "", 1, 0, 1);
    182     test(S("abcdeabcde"), "abcde", 1, 0, 1);
    183     test(S("abcdeabcde"), "abcde", 1, 1, 5);
    184     test(S("abcdeabcde"), "abcde", 1, 2, 5);
    185     test(S("abcdeabcde"), "abcde", 1, 4, 5);
    186     test(S("abcdeabcde"), "abcde", 1, 5, 5);
    187     test(S("abcdeabcde"), "abcdeabcde", 1, 0, 1);
    188     test(S("abcdeabcde"), "abcdeabcde", 1, 1, 5);
    189     test(S("abcdeabcde"), "abcdeabcde", 1, 5, 5);
    190     test(S("abcdeabcde"), "abcdeabcde", 1, 9, S::npos);
    191     test(S("abcdeabcde"), "abcdeabcde", 1, 10, S::npos);
    192     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 0, 1);
    193     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 1, 5);
    194     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 10, S::npos);
    195     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos);
    196     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos);
    197     test(S("abcdeabcde"), "", 5, 0, 5);
    198     test(S("abcdeabcde"), "abcde", 5, 0, 5);
    199     test(S("abcdeabcde"), "abcde", 5, 1, 5);
    200     test(S("abcdeabcde"), "abcde", 5, 2, 5);
    201     test(S("abcdeabcde"), "abcde", 5, 4, 5);
    202     test(S("abcdeabcde"), "abcde", 5, 5, 5);
    203     test(S("abcdeabcde"), "abcdeabcde", 5, 0, 5);
    204     test(S("abcdeabcde"), "abcdeabcde", 5, 1, 5);
    205     test(S("abcdeabcde"), "abcdeabcde", 5, 5, 5);
    206     test(S("abcdeabcde"), "abcdeabcde", 5, 9, S::npos);
    207     test(S("abcdeabcde"), "abcdeabcde", 5, 10, S::npos);
    208     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 0, 5);
    209     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 1, 5);
    210     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 10, S::npos);
    211     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 19, S::npos);
    212     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 20, S::npos);
    213     test(S("abcdeabcde"), "", 9, 0, 9);
    214     test(S("abcdeabcde"), "abcde", 9, 0, 9);
    215     test(S("abcdeabcde"), "abcde", 9, 1, S::npos);
    216     test(S("abcdeabcde"), "abcde", 9, 2, S::npos);
    217     test(S("abcdeabcde"), "abcde", 9, 4, S::npos);
    218     test(S("abcdeabcde"), "abcde", 9, 5, S::npos);
    219     test(S("abcdeabcde"), "abcdeabcde", 9, 0, 9);
    220     test(S("abcdeabcde"), "abcdeabcde", 9, 1, S::npos);
    221     test(S("abcdeabcde"), "abcdeabcde", 9, 5, S::npos);
    222     test(S("abcdeabcde"), "abcdeabcde", 9, 9, S::npos);
    223     test(S("abcdeabcde"), "abcdeabcde", 9, 10, S::npos);
    224     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 0, 9);
    225     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 1, S::npos);
    226     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 10, S::npos);
    227     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 19, S::npos);
    228     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 20, S::npos);
    229     test(S("abcdeabcde"), "", 10, 0, 10);
    230     test(S("abcdeabcde"), "abcde", 10, 0, 10);
    231     test(S("abcdeabcde"), "abcde", 10, 1, S::npos);
    232     test(S("abcdeabcde"), "abcde", 10, 2, S::npos);
    233     test(S("abcdeabcde"), "abcde", 10, 4, S::npos);
    234     test(S("abcdeabcde"), "abcde", 10, 5, S::npos);
    235     test(S("abcdeabcde"), "abcdeabcde", 10, 0, 10);
    236     test(S("abcdeabcde"), "abcdeabcde", 10, 1, S::npos);
    237 }
    238 
    239 template <class S>
    240 void test2()
    241 {
    242     test(S("abcdeabcde"), "abcdeabcde", 10, 5, S::npos);
    243     test(S("abcdeabcde"), "abcdeabcde", 10, 9, S::npos);
    244     test(S("abcdeabcde"), "abcdeabcde", 10, 10, S::npos);
    245     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 0, 10);
    246     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 1, S::npos);
    247     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 10, S::npos);
    248     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 19, S::npos);
    249     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 20, S::npos);
    250     test(S("abcdeabcde"), "", 11, 0, S::npos);
    251     test(S("abcdeabcde"), "abcde", 11, 0, S::npos);
    252     test(S("abcdeabcde"), "abcde", 11, 1, S::npos);
    253     test(S("abcdeabcde"), "abcde", 11, 2, S::npos);
    254     test(S("abcdeabcde"), "abcde", 11, 4, S::npos);
    255     test(S("abcdeabcde"), "abcde", 11, 5, S::npos);
    256     test(S("abcdeabcde"), "abcdeabcde", 11, 0, S::npos);
    257     test(S("abcdeabcde"), "abcdeabcde", 11, 1, S::npos);
    258     test(S("abcdeabcde"), "abcdeabcde", 11, 5, S::npos);
    259     test(S("abcdeabcde"), "abcdeabcde", 11, 9, S::npos);
    260     test(S("abcdeabcde"), "abcdeabcde", 11, 10, S::npos);
    261     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 0, S::npos);
    262     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 1, S::npos);
    263     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 10, S::npos);
    264     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 19, S::npos);
    265     test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 20, S::npos);
    266     test(S("abcdeabcdeabcdeabcde"), "", 0, 0, 0);
    267     test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 0, 0);
    268     test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 1, 0);
    269     test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 2, 0);
    270     test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 4, 0);
    271     test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 5, 0);
    272     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 0, 0);
    273     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 1, 0);
    274     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 5, 0);
    275     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 9, 0);
    276     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 10, 0);
    277     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0, 0);
    278     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 1, 0);
    279     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 10, 0);
    280     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 19, 0);
    281     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 20, 0);
    282     test(S("abcdeabcdeabcdeabcde"), "", 1, 0, 1);
    283     test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 0, 1);
    284     test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 1, 5);
    285     test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 2, 5);
    286     test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 4, 5);
    287     test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 5, 5);
    288     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 0, 1);
    289     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 1, 5);
    290     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 5, 5);
    291     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 9, 5);
    292     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 10, 5);
    293     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 0, 1);
    294     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 1, 5);
    295     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 10, 5);
    296     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos);
    297     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos);
    298     test(S("abcdeabcdeabcdeabcde"), "", 10, 0, 10);
    299     test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 0, 10);
    300     test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 1, 10);
    301     test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 2, 10);
    302     test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 4, 10);
    303     test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 5, 10);
    304     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 0, 10);
    305     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 1, 10);
    306     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 5, 10);
    307     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 9, 10);
    308     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 10, 10);
    309     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 0, 10);
    310     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 1, 10);
    311     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 10, 10);
    312     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 19, S::npos);
    313     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 20, S::npos);
    314     test(S("abcdeabcdeabcdeabcde"), "", 19, 0, 19);
    315     test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 0, 19);
    316     test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 1, S::npos);
    317     test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 2, S::npos);
    318     test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 4, S::npos);
    319     test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 5, S::npos);
    320     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 0, 19);
    321     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 1, S::npos);
    322     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 5, S::npos);
    323     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 9, S::npos);
    324     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 10, S::npos);
    325     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 0, 19);
    326     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 1, S::npos);
    327     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 10, S::npos);
    328     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 19, S::npos);
    329     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 20, S::npos);
    330     test(S("abcdeabcdeabcdeabcde"), "", 20, 0, 20);
    331     test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 0, 20);
    332     test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 1, S::npos);
    333     test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 2, S::npos);
    334     test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 4, S::npos);
    335     test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 5, S::npos);
    336     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 0, 20);
    337     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 1, S::npos);
    338     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 5, S::npos);
    339     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 9, S::npos);
    340     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 10, S::npos);
    341     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 0, 20);
    342 }
    343 
    344 template <class S>
    345 void test3()
    346 {
    347     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 1, S::npos);
    348     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 10, S::npos);
    349     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 19, S::npos);
    350     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 20, S::npos);
    351     test(S("abcdeabcdeabcdeabcde"), "", 21, 0, S::npos);
    352     test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 0, S::npos);
    353     test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 1, S::npos);
    354     test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 2, S::npos);
    355     test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 4, S::npos);
    356     test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 5, S::npos);
    357     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 0, S::npos);
    358     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 1, S::npos);
    359     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 5, S::npos);
    360     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 9, S::npos);
    361     test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 10, S::npos);
    362     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 0, S::npos);
    363     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 1, S::npos);
    364     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 10, S::npos);
    365     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 19, S::npos);
    366     test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 20, S::npos);
    367 }
    368 
    369 int main()
    370 {
    371     {
    372     typedef std::string S;
    373     test0<S>();
    374     test1<S>();
    375     test2<S>();
    376     test3<S>();
    377     }
    378 #if __cplusplus >= 201103L
    379     {
    380     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
    381     test0<S>();
    382     test1<S>();
    383     test2<S>();
    384     test3<S>();
    385     }
    386 #endif
    387 }
    388