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