Home | History | Annotate | Download | only in string_replace
      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 // template<class InputIterator>
     13 //   basic_string&
     14 //   replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
     15 
     16 #include <string>
     17 #include <iterator>
     18 #include <cassert>
     19 
     20 #include "min_allocator.h"
     21 #include "test_iterators.h"
     22 
     23 template <class S, class It>
     24 void
     25 test(S s, typename S::size_type pos1, typename S::size_type n1, It f, It l, S expected)
     26 {
     27     typename S::size_type old_size = s.size();
     28     typename S::const_iterator first = s.begin() + pos1;
     29     typename S::const_iterator last = s.begin() + pos1 + n1;
     30     typename S::size_type xlen = last - first;
     31     s.replace(first, last, f, l);
     32     LIBCPP_ASSERT(s.__invariants());
     33     assert(s == expected);
     34     typename S::size_type rlen = std::distance(f, l);
     35     assert(s.size() == old_size - xlen + rlen);
     36 }
     37 
     38 #ifndef TEST_HAS_NO_EXCEPTIONS
     39 template <class S, class It>
     40 void
     41 test_exceptions(S s, typename S::size_type pos1, typename S::size_type n1, It f, It l)
     42 {
     43     typename S::const_iterator first = s.begin() + pos1;
     44     typename S::const_iterator last = s.begin() + pos1 + n1;
     45 	S aCopy = s;
     46 	try {
     47 	    s.replace(first, last, f, l);
     48 	    assert(false);
     49 	    }
     50 	catch (...) {}
     51     LIBCPP_ASSERT(s.__invariants());
     52     assert(s == aCopy);
     53 }
     54 #endif
     55 
     56 const char* str = "12345678901234567890";
     57 
     58 template <class S>
     59 void test0()
     60 {
     61     test(S(""), 0, 0, str, str+0, S(""));
     62     test(S(""), 0, 0, str, str+0, S(""));
     63     test(S(""), 0, 0, str, str+1, S("1"));
     64     test(S(""), 0, 0, str, str+2, S("12"));
     65     test(S(""), 0, 0, str, str+4, S("1234"));
     66     test(S(""), 0, 0, str, str+5, S("12345"));
     67     test(S(""), 0, 0, str, str+0, S(""));
     68     test(S(""), 0, 0, str, str+1, S("1"));
     69     test(S(""), 0, 0, str, str+5, S("12345"));
     70     test(S(""), 0, 0, str, str+9, S("123456789"));
     71     test(S(""), 0, 0, str, str+10, S("1234567890"));
     72     test(S(""), 0, 0, str, str+0, S(""));
     73     test(S(""), 0, 0, str, str+1, S("1"));
     74     test(S(""), 0, 0, str, str+10, S("1234567890"));
     75     test(S(""), 0, 0, str, str+19, S("1234567890123456789"));
     76     test(S(""), 0, 0, str, str+20, S("12345678901234567890"));
     77     test(S("abcde"), 0, 0, str, str+0, S("abcde"));
     78     test(S("abcde"), 0, 0, str, str+0, S("abcde"));
     79     test(S("abcde"), 0, 0, str, str+1, S("1abcde"));
     80     test(S("abcde"), 0, 0, str, str+2, S("12abcde"));
     81     test(S("abcde"), 0, 0, str, str+4, S("1234abcde"));
     82     test(S("abcde"), 0, 0, str, str+5, S("12345abcde"));
     83     test(S("abcde"), 0, 0, str, str+0, S("abcde"));
     84     test(S("abcde"), 0, 0, str, str+1, S("1abcde"));
     85     test(S("abcde"), 0, 0, str, str+5, S("12345abcde"));
     86     test(S("abcde"), 0, 0, str, str+9, S("123456789abcde"));
     87     test(S("abcde"), 0, 0, str, str+10, S("1234567890abcde"));
     88     test(S("abcde"), 0, 0, str, str+0, S("abcde"));
     89     test(S("abcde"), 0, 0, str, str+1, S("1abcde"));
     90     test(S("abcde"), 0, 0, str, str+10, S("1234567890abcde"));
     91     test(S("abcde"), 0, 0, str, str+19, S("1234567890123456789abcde"));
     92     test(S("abcde"), 0, 0, str, str+20, S("12345678901234567890abcde"));
     93     test(S("abcde"), 0, 1, str, str+0, S("bcde"));
     94     test(S("abcde"), 0, 1, str, str+0, S("bcde"));
     95     test(S("abcde"), 0, 1, str, str+1, S("1bcde"));
     96     test(S("abcde"), 0, 1, str, str+2, S("12bcde"));
     97     test(S("abcde"), 0, 1, str, str+4, S("1234bcde"));
     98     test(S("abcde"), 0, 1, str, str+5, S("12345bcde"));
     99     test(S("abcde"), 0, 1, str, str+0, S("bcde"));
    100     test(S("abcde"), 0, 1, str, str+1, S("1bcde"));
    101     test(S("abcde"), 0, 1, str, str+5, S("12345bcde"));
    102     test(S("abcde"), 0, 1, str, str+9, S("123456789bcde"));
    103     test(S("abcde"), 0, 1, str, str+10, S("1234567890bcde"));
    104     test(S("abcde"), 0, 1, str, str+0, S("bcde"));
    105     test(S("abcde"), 0, 1, str, str+1, S("1bcde"));
    106     test(S("abcde"), 0, 1, str, str+10, S("1234567890bcde"));
    107     test(S("abcde"), 0, 1, str, str+19, S("1234567890123456789bcde"));
    108     test(S("abcde"), 0, 1, str, str+20, S("12345678901234567890bcde"));
    109     test(S("abcde"), 0, 2, str, str+0, S("cde"));
    110     test(S("abcde"), 0, 2, str, str+0, S("cde"));
    111     test(S("abcde"), 0, 2, str, str+1, S("1cde"));
    112     test(S("abcde"), 0, 2, str, str+2, S("12cde"));
    113     test(S("abcde"), 0, 2, str, str+4, S("1234cde"));
    114     test(S("abcde"), 0, 2, str, str+5, S("12345cde"));
    115     test(S("abcde"), 0, 2, str, str+0, S("cde"));
    116     test(S("abcde"), 0, 2, str, str+1, S("1cde"));
    117     test(S("abcde"), 0, 2, str, str+5, S("12345cde"));
    118     test(S("abcde"), 0, 2, str, str+9, S("123456789cde"));
    119     test(S("abcde"), 0, 2, str, str+10, S("1234567890cde"));
    120     test(S("abcde"), 0, 2, str, str+0, S("cde"));
    121     test(S("abcde"), 0, 2, str, str+1, S("1cde"));
    122     test(S("abcde"), 0, 2, str, str+10, S("1234567890cde"));
    123     test(S("abcde"), 0, 2, str, str+19, S("1234567890123456789cde"));
    124     test(S("abcde"), 0, 2, str, str+20, S("12345678901234567890cde"));
    125     test(S("abcde"), 0, 4, str, str+0, S("e"));
    126     test(S("abcde"), 0, 4, str, str+0, S("e"));
    127     test(S("abcde"), 0, 4, str, str+1, S("1e"));
    128     test(S("abcde"), 0, 4, str, str+2, S("12e"));
    129     test(S("abcde"), 0, 4, str, str+4, S("1234e"));
    130     test(S("abcde"), 0, 4, str, str+5, S("12345e"));
    131     test(S("abcde"), 0, 4, str, str+0, S("e"));
    132     test(S("abcde"), 0, 4, str, str+1, S("1e"));
    133     test(S("abcde"), 0, 4, str, str+5, S("12345e"));
    134     test(S("abcde"), 0, 4, str, str+9, S("123456789e"));
    135     test(S("abcde"), 0, 4, str, str+10, S("1234567890e"));
    136     test(S("abcde"), 0, 4, str, str+0, S("e"));
    137     test(S("abcde"), 0, 4, str, str+1, S("1e"));
    138     test(S("abcde"), 0, 4, str, str+10, S("1234567890e"));
    139     test(S("abcde"), 0, 4, str, str+19, S("1234567890123456789e"));
    140     test(S("abcde"), 0, 4, str, str+20, S("12345678901234567890e"));
    141     test(S("abcde"), 0, 5, str, str+0, S(""));
    142     test(S("abcde"), 0, 5, str, str+0, S(""));
    143     test(S("abcde"), 0, 5, str, str+1, S("1"));
    144     test(S("abcde"), 0, 5, str, str+2, S("12"));
    145     test(S("abcde"), 0, 5, str, str+4, S("1234"));
    146     test(S("abcde"), 0, 5, str, str+5, S("12345"));
    147     test(S("abcde"), 0, 5, str, str+0, S(""));
    148     test(S("abcde"), 0, 5, str, str+1, S("1"));
    149     test(S("abcde"), 0, 5, str, str+5, S("12345"));
    150     test(S("abcde"), 0, 5, str, str+9, S("123456789"));
    151     test(S("abcde"), 0, 5, str, str+10, S("1234567890"));
    152     test(S("abcde"), 0, 5, str, str+0, S(""));
    153     test(S("abcde"), 0, 5, str, str+1, S("1"));
    154     test(S("abcde"), 0, 5, str, str+10, S("1234567890"));
    155     test(S("abcde"), 0, 5, str, str+19, S("1234567890123456789"));
    156     test(S("abcde"), 0, 5, str, str+20, S("12345678901234567890"));
    157     test(S("abcde"), 1, 0, str, str+0, S("abcde"));
    158     test(S("abcde"), 1, 0, str, str+0, S("abcde"));
    159     test(S("abcde"), 1, 0, str, str+1, S("a1bcde"));
    160     test(S("abcde"), 1, 0, str, str+2, S("a12bcde"));
    161 }
    162 
    163 template <class S>
    164 void test1()
    165 {
    166     test(S("abcde"), 1, 0, str, str+4, S("a1234bcde"));
    167     test(S("abcde"), 1, 0, str, str+5, S("a12345bcde"));
    168     test(S("abcde"), 1, 0, str, str+0, S("abcde"));
    169     test(S("abcde"), 1, 0, str, str+1, S("a1bcde"));
    170     test(S("abcde"), 1, 0, str, str+5, S("a12345bcde"));
    171     test(S("abcde"), 1, 0, str, str+9, S("a123456789bcde"));
    172     test(S("abcde"), 1, 0, str, str+10, S("a1234567890bcde"));
    173     test(S("abcde"), 1, 0, str, str+0, S("abcde"));
    174     test(S("abcde"), 1, 0, str, str+1, S("a1bcde"));
    175     test(S("abcde"), 1, 0, str, str+10, S("a1234567890bcde"));
    176     test(S("abcde"), 1, 0, str, str+19, S("a1234567890123456789bcde"));
    177     test(S("abcde"), 1, 0, str, str+20, S("a12345678901234567890bcde"));
    178     test(S("abcde"), 1, 1, str, str+0, S("acde"));
    179     test(S("abcde"), 1, 1, str, str+0, S("acde"));
    180     test(S("abcde"), 1, 1, str, str+1, S("a1cde"));
    181     test(S("abcde"), 1, 1, str, str+2, S("a12cde"));
    182     test(S("abcde"), 1, 1, str, str+4, S("a1234cde"));
    183     test(S("abcde"), 1, 1, str, str+5, S("a12345cde"));
    184     test(S("abcde"), 1, 1, str, str+0, S("acde"));
    185     test(S("abcde"), 1, 1, str, str+1, S("a1cde"));
    186     test(S("abcde"), 1, 1, str, str+5, S("a12345cde"));
    187     test(S("abcde"), 1, 1, str, str+9, S("a123456789cde"));
    188     test(S("abcde"), 1, 1, str, str+10, S("a1234567890cde"));
    189     test(S("abcde"), 1, 1, str, str+0, S("acde"));
    190     test(S("abcde"), 1, 1, str, str+1, S("a1cde"));
    191     test(S("abcde"), 1, 1, str, str+10, S("a1234567890cde"));
    192     test(S("abcde"), 1, 1, str, str+19, S("a1234567890123456789cde"));
    193     test(S("abcde"), 1, 1, str, str+20, S("a12345678901234567890cde"));
    194     test(S("abcde"), 1, 2, str, str+0, S("ade"));
    195     test(S("abcde"), 1, 2, str, str+0, S("ade"));
    196     test(S("abcde"), 1, 2, str, str+1, S("a1de"));
    197     test(S("abcde"), 1, 2, str, str+2, S("a12de"));
    198     test(S("abcde"), 1, 2, str, str+4, S("a1234de"));
    199     test(S("abcde"), 1, 2, str, str+5, S("a12345de"));
    200     test(S("abcde"), 1, 2, str, str+0, S("ade"));
    201     test(S("abcde"), 1, 2, str, str+1, S("a1de"));
    202     test(S("abcde"), 1, 2, str, str+5, S("a12345de"));
    203     test(S("abcde"), 1, 2, str, str+9, S("a123456789de"));
    204     test(S("abcde"), 1, 2, str, str+10, S("a1234567890de"));
    205     test(S("abcde"), 1, 2, str, str+0, S("ade"));
    206     test(S("abcde"), 1, 2, str, str+1, S("a1de"));
    207     test(S("abcde"), 1, 2, str, str+10, S("a1234567890de"));
    208     test(S("abcde"), 1, 2, str, str+19, S("a1234567890123456789de"));
    209     test(S("abcde"), 1, 2, str, str+20, S("a12345678901234567890de"));
    210     test(S("abcde"), 1, 3, str, str+0, S("ae"));
    211     test(S("abcde"), 1, 3, str, str+0, S("ae"));
    212     test(S("abcde"), 1, 3, str, str+1, S("a1e"));
    213     test(S("abcde"), 1, 3, str, str+2, S("a12e"));
    214     test(S("abcde"), 1, 3, str, str+4, S("a1234e"));
    215     test(S("abcde"), 1, 3, str, str+5, S("a12345e"));
    216     test(S("abcde"), 1, 3, str, str+0, S("ae"));
    217     test(S("abcde"), 1, 3, str, str+1, S("a1e"));
    218     test(S("abcde"), 1, 3, str, str+5, S("a12345e"));
    219     test(S("abcde"), 1, 3, str, str+9, S("a123456789e"));
    220     test(S("abcde"), 1, 3, str, str+10, S("a1234567890e"));
    221     test(S("abcde"), 1, 3, str, str+0, S("ae"));
    222     test(S("abcde"), 1, 3, str, str+1, S("a1e"));
    223     test(S("abcde"), 1, 3, str, str+10, S("a1234567890e"));
    224     test(S("abcde"), 1, 3, str, str+19, S("a1234567890123456789e"));
    225     test(S("abcde"), 1, 3, str, str+20, S("a12345678901234567890e"));
    226     test(S("abcde"), 1, 4, str, str+0, S("a"));
    227     test(S("abcde"), 1, 4, str, str+0, S("a"));
    228     test(S("abcde"), 1, 4, str, str+1, S("a1"));
    229     test(S("abcde"), 1, 4, str, str+2, S("a12"));
    230     test(S("abcde"), 1, 4, str, str+4, S("a1234"));
    231     test(S("abcde"), 1, 4, str, str+5, S("a12345"));
    232     test(S("abcde"), 1, 4, str, str+0, S("a"));
    233     test(S("abcde"), 1, 4, str, str+1, S("a1"));
    234     test(S("abcde"), 1, 4, str, str+5, S("a12345"));
    235     test(S("abcde"), 1, 4, str, str+9, S("a123456789"));
    236     test(S("abcde"), 1, 4, str, str+10, S("a1234567890"));
    237     test(S("abcde"), 1, 4, str, str+0, S("a"));
    238     test(S("abcde"), 1, 4, str, str+1, S("a1"));
    239     test(S("abcde"), 1, 4, str, str+10, S("a1234567890"));
    240     test(S("abcde"), 1, 4, str, str+19, S("a1234567890123456789"));
    241     test(S("abcde"), 1, 4, str, str+20, S("a12345678901234567890"));
    242     test(S("abcde"), 2, 0, str, str+0, S("abcde"));
    243     test(S("abcde"), 2, 0, str, str+0, S("abcde"));
    244     test(S("abcde"), 2, 0, str, str+1, S("ab1cde"));
    245     test(S("abcde"), 2, 0, str, str+2, S("ab12cde"));
    246     test(S("abcde"), 2, 0, str, str+4, S("ab1234cde"));
    247     test(S("abcde"), 2, 0, str, str+5, S("ab12345cde"));
    248     test(S("abcde"), 2, 0, str, str+0, S("abcde"));
    249     test(S("abcde"), 2, 0, str, str+1, S("ab1cde"));
    250     test(S("abcde"), 2, 0, str, str+5, S("ab12345cde"));
    251     test(S("abcde"), 2, 0, str, str+9, S("ab123456789cde"));
    252     test(S("abcde"), 2, 0, str, str+10, S("ab1234567890cde"));
    253     test(S("abcde"), 2, 0, str, str+0, S("abcde"));
    254     test(S("abcde"), 2, 0, str, str+1, S("ab1cde"));
    255     test(S("abcde"), 2, 0, str, str+10, S("ab1234567890cde"));
    256     test(S("abcde"), 2, 0, str, str+19, S("ab1234567890123456789cde"));
    257     test(S("abcde"), 2, 0, str, str+20, S("ab12345678901234567890cde"));
    258     test(S("abcde"), 2, 1, str, str+0, S("abde"));
    259     test(S("abcde"), 2, 1, str, str+0, S("abde"));
    260     test(S("abcde"), 2, 1, str, str+1, S("ab1de"));
    261     test(S("abcde"), 2, 1, str, str+2, S("ab12de"));
    262     test(S("abcde"), 2, 1, str, str+4, S("ab1234de"));
    263     test(S("abcde"), 2, 1, str, str+5, S("ab12345de"));
    264     test(S("abcde"), 2, 1, str, str+0, S("abde"));
    265     test(S("abcde"), 2, 1, str, str+1, S("ab1de"));
    266 }
    267 
    268 template <class S>
    269 void test2()
    270 {
    271     test(S("abcde"), 2, 1, str, str+5, S("ab12345de"));
    272     test(S("abcde"), 2, 1, str, str+9, S("ab123456789de"));
    273     test(S("abcde"), 2, 1, str, str+10, S("ab1234567890de"));
    274     test(S("abcde"), 2, 1, str, str+0, S("abde"));
    275     test(S("abcde"), 2, 1, str, str+1, S("ab1de"));
    276     test(S("abcde"), 2, 1, str, str+10, S("ab1234567890de"));
    277     test(S("abcde"), 2, 1, str, str+19, S("ab1234567890123456789de"));
    278     test(S("abcde"), 2, 1, str, str+20, S("ab12345678901234567890de"));
    279     test(S("abcde"), 2, 2, str, str+0, S("abe"));
    280     test(S("abcde"), 2, 2, str, str+0, S("abe"));
    281     test(S("abcde"), 2, 2, str, str+1, S("ab1e"));
    282     test(S("abcde"), 2, 2, str, str+2, S("ab12e"));
    283     test(S("abcde"), 2, 2, str, str+4, S("ab1234e"));
    284     test(S("abcde"), 2, 2, str, str+5, S("ab12345e"));
    285     test(S("abcde"), 2, 2, str, str+0, S("abe"));
    286     test(S("abcde"), 2, 2, str, str+1, S("ab1e"));
    287     test(S("abcde"), 2, 2, str, str+5, S("ab12345e"));
    288     test(S("abcde"), 2, 2, str, str+9, S("ab123456789e"));
    289     test(S("abcde"), 2, 2, str, str+10, S("ab1234567890e"));
    290     test(S("abcde"), 2, 2, str, str+0, S("abe"));
    291     test(S("abcde"), 2, 2, str, str+1, S("ab1e"));
    292     test(S("abcde"), 2, 2, str, str+10, S("ab1234567890e"));
    293     test(S("abcde"), 2, 2, str, str+19, S("ab1234567890123456789e"));
    294     test(S("abcde"), 2, 2, str, str+20, S("ab12345678901234567890e"));
    295     test(S("abcde"), 2, 3, str, str+0, S("ab"));
    296     test(S("abcde"), 2, 3, str, str+0, S("ab"));
    297     test(S("abcde"), 2, 3, str, str+1, S("ab1"));
    298     test(S("abcde"), 2, 3, str, str+2, S("ab12"));
    299     test(S("abcde"), 2, 3, str, str+4, S("ab1234"));
    300     test(S("abcde"), 2, 3, str, str+5, S("ab12345"));
    301     test(S("abcde"), 2, 3, str, str+0, S("ab"));
    302     test(S("abcde"), 2, 3, str, str+1, S("ab1"));
    303     test(S("abcde"), 2, 3, str, str+5, S("ab12345"));
    304     test(S("abcde"), 2, 3, str, str+9, S("ab123456789"));
    305     test(S("abcde"), 2, 3, str, str+10, S("ab1234567890"));
    306     test(S("abcde"), 2, 3, str, str+0, S("ab"));
    307     test(S("abcde"), 2, 3, str, str+1, S("ab1"));
    308     test(S("abcde"), 2, 3, str, str+10, S("ab1234567890"));
    309     test(S("abcde"), 2, 3, str, str+19, S("ab1234567890123456789"));
    310     test(S("abcde"), 2, 3, str, str+20, S("ab12345678901234567890"));
    311     test(S("abcde"), 4, 0, str, str+0, S("abcde"));
    312     test(S("abcde"), 4, 0, str, str+0, S("abcde"));
    313     test(S("abcde"), 4, 0, str, str+1, S("abcd1e"));
    314     test(S("abcde"), 4, 0, str, str+2, S("abcd12e"));
    315     test(S("abcde"), 4, 0, str, str+4, S("abcd1234e"));
    316     test(S("abcde"), 4, 0, str, str+5, S("abcd12345e"));
    317     test(S("abcde"), 4, 0, str, str+0, S("abcde"));
    318     test(S("abcde"), 4, 0, str, str+1, S("abcd1e"));
    319     test(S("abcde"), 4, 0, str, str+5, S("abcd12345e"));
    320     test(S("abcde"), 4, 0, str, str+9, S("abcd123456789e"));
    321     test(S("abcde"), 4, 0, str, str+10, S("abcd1234567890e"));
    322     test(S("abcde"), 4, 0, str, str+0, S("abcde"));
    323     test(S("abcde"), 4, 0, str, str+1, S("abcd1e"));
    324     test(S("abcde"), 4, 0, str, str+10, S("abcd1234567890e"));
    325     test(S("abcde"), 4, 0, str, str+19, S("abcd1234567890123456789e"));
    326     test(S("abcde"), 4, 0, str, str+20, S("abcd12345678901234567890e"));
    327     test(S("abcde"), 4, 1, str, str+0, S("abcd"));
    328     test(S("abcde"), 4, 1, str, str+0, S("abcd"));
    329     test(S("abcde"), 4, 1, str, str+1, S("abcd1"));
    330     test(S("abcde"), 4, 1, str, str+2, S("abcd12"));
    331     test(S("abcde"), 4, 1, str, str+4, S("abcd1234"));
    332     test(S("abcde"), 4, 1, str, str+5, S("abcd12345"));
    333     test(S("abcde"), 4, 1, str, str+0, S("abcd"));
    334     test(S("abcde"), 4, 1, str, str+1, S("abcd1"));
    335     test(S("abcde"), 4, 1, str, str+5, S("abcd12345"));
    336     test(S("abcde"), 4, 1, str, str+9, S("abcd123456789"));
    337     test(S("abcde"), 4, 1, str, str+10, S("abcd1234567890"));
    338     test(S("abcde"), 4, 1, str, str+0, S("abcd"));
    339     test(S("abcde"), 4, 1, str, str+1, S("abcd1"));
    340     test(S("abcde"), 4, 1, str, str+10, S("abcd1234567890"));
    341     test(S("abcde"), 4, 1, str, str+19, S("abcd1234567890123456789"));
    342     test(S("abcde"), 4, 1, str, str+20, S("abcd12345678901234567890"));
    343     test(S("abcde"), 5, 0, str, str+0, S("abcde"));
    344     test(S("abcde"), 5, 0, str, str+0, S("abcde"));
    345     test(S("abcde"), 5, 0, str, str+1, S("abcde1"));
    346     test(S("abcde"), 5, 0, str, str+2, S("abcde12"));
    347     test(S("abcde"), 5, 0, str, str+4, S("abcde1234"));
    348     test(S("abcde"), 5, 0, str, str+5, S("abcde12345"));
    349     test(S("abcde"), 5, 0, str, str+0, S("abcde"));
    350     test(S("abcde"), 5, 0, str, str+1, S("abcde1"));
    351     test(S("abcde"), 5, 0, str, str+5, S("abcde12345"));
    352     test(S("abcde"), 5, 0, str, str+9, S("abcde123456789"));
    353     test(S("abcde"), 5, 0, str, str+10, S("abcde1234567890"));
    354     test(S("abcde"), 5, 0, str, str+0, S("abcde"));
    355     test(S("abcde"), 5, 0, str, str+1, S("abcde1"));
    356     test(S("abcde"), 5, 0, str, str+10, S("abcde1234567890"));
    357     test(S("abcde"), 5, 0, str, str+19, S("abcde1234567890123456789"));
    358     test(S("abcde"), 5, 0, str, str+20, S("abcde12345678901234567890"));
    359     test(S("abcdefghij"), 0, 0, str, str+0, S("abcdefghij"));
    360     test(S("abcdefghij"), 0, 0, str, str+0, S("abcdefghij"));
    361     test(S("abcdefghij"), 0, 0, str, str+1, S("1abcdefghij"));
    362     test(S("abcdefghij"), 0, 0, str, str+2, S("12abcdefghij"));
    363     test(S("abcdefghij"), 0, 0, str, str+4, S("1234abcdefghij"));
    364     test(S("abcdefghij"), 0, 0, str, str+5, S("12345abcdefghij"));
    365     test(S("abcdefghij"), 0, 0, str, str+0, S("abcdefghij"));
    366     test(S("abcdefghij"), 0, 0, str, str+1, S("1abcdefghij"));
    367     test(S("abcdefghij"), 0, 0, str, str+5, S("12345abcdefghij"));
    368     test(S("abcdefghij"), 0, 0, str, str+9, S("123456789abcdefghij"));
    369     test(S("abcdefghij"), 0, 0, str, str+10, S("1234567890abcdefghij"));
    370     test(S("abcdefghij"), 0, 0, str, str+0, S("abcdefghij"));
    371 }
    372 
    373 template <class S>
    374 void test3()
    375 {
    376     test(S("abcdefghij"), 0, 0, str, str+1, S("1abcdefghij"));
    377     test(S("abcdefghij"), 0, 0, str, str+10, S("1234567890abcdefghij"));
    378     test(S("abcdefghij"), 0, 0, str, str+19, S("1234567890123456789abcdefghij"));
    379     test(S("abcdefghij"), 0, 0, str, str+20, S("12345678901234567890abcdefghij"));
    380     test(S("abcdefghij"), 0, 1, str, str+0, S("bcdefghij"));
    381     test(S("abcdefghij"), 0, 1, str, str+0, S("bcdefghij"));
    382     test(S("abcdefghij"), 0, 1, str, str+1, S("1bcdefghij"));
    383     test(S("abcdefghij"), 0, 1, str, str+2, S("12bcdefghij"));
    384     test(S("abcdefghij"), 0, 1, str, str+4, S("1234bcdefghij"));
    385     test(S("abcdefghij"), 0, 1, str, str+5, S("12345bcdefghij"));
    386     test(S("abcdefghij"), 0, 1, str, str+0, S("bcdefghij"));
    387     test(S("abcdefghij"), 0, 1, str, str+1, S("1bcdefghij"));
    388     test(S("abcdefghij"), 0, 1, str, str+5, S("12345bcdefghij"));
    389     test(S("abcdefghij"), 0, 1, str, str+9, S("123456789bcdefghij"));
    390     test(S("abcdefghij"), 0, 1, str, str+10, S("1234567890bcdefghij"));
    391     test(S("abcdefghij"), 0, 1, str, str+0, S("bcdefghij"));
    392     test(S("abcdefghij"), 0, 1, str, str+1, S("1bcdefghij"));
    393     test(S("abcdefghij"), 0, 1, str, str+10, S("1234567890bcdefghij"));
    394     test(S("abcdefghij"), 0, 1, str, str+19, S("1234567890123456789bcdefghij"));
    395     test(S("abcdefghij"), 0, 1, str, str+20, S("12345678901234567890bcdefghij"));
    396     test(S("abcdefghij"), 0, 5, str, str+0, S("fghij"));
    397     test(S("abcdefghij"), 0, 5, str, str+0, S("fghij"));
    398     test(S("abcdefghij"), 0, 5, str, str+1, S("1fghij"));
    399     test(S("abcdefghij"), 0, 5, str, str+2, S("12fghij"));
    400     test(S("abcdefghij"), 0, 5, str, str+4, S("1234fghij"));
    401     test(S("abcdefghij"), 0, 5, str, str+5, S("12345fghij"));
    402     test(S("abcdefghij"), 0, 5, str, str+0, S("fghij"));
    403     test(S("abcdefghij"), 0, 5, str, str+1, S("1fghij"));
    404     test(S("abcdefghij"), 0, 5, str, str+5, S("12345fghij"));
    405     test(S("abcdefghij"), 0, 5, str, str+9, S("123456789fghij"));
    406     test(S("abcdefghij"), 0, 5, str, str+10, S("1234567890fghij"));
    407     test(S("abcdefghij"), 0, 5, str, str+0, S("fghij"));
    408     test(S("abcdefghij"), 0, 5, str, str+1, S("1fghij"));
    409     test(S("abcdefghij"), 0, 5, str, str+10, S("1234567890fghij"));
    410     test(S("abcdefghij"), 0, 5, str, str+19, S("1234567890123456789fghij"));
    411     test(S("abcdefghij"), 0, 5, str, str+20, S("12345678901234567890fghij"));
    412     test(S("abcdefghij"), 0, 9, str, str+0, S("j"));
    413     test(S("abcdefghij"), 0, 9, str, str+0, S("j"));
    414     test(S("abcdefghij"), 0, 9, str, str+1, S("1j"));
    415     test(S("abcdefghij"), 0, 9, str, str+2, S("12j"));
    416     test(S("abcdefghij"), 0, 9, str, str+4, S("1234j"));
    417     test(S("abcdefghij"), 0, 9, str, str+5, S("12345j"));
    418     test(S("abcdefghij"), 0, 9, str, str+0, S("j"));
    419     test(S("abcdefghij"), 0, 9, str, str+1, S("1j"));
    420     test(S("abcdefghij"), 0, 9, str, str+5, S("12345j"));
    421     test(S("abcdefghij"), 0, 9, str, str+9, S("123456789j"));
    422     test(S("abcdefghij"), 0, 9, str, str+10, S("1234567890j"));
    423     test(S("abcdefghij"), 0, 9, str, str+0, S("j"));
    424     test(S("abcdefghij"), 0, 9, str, str+1, S("1j"));
    425     test(S("abcdefghij"), 0, 9, str, str+10, S("1234567890j"));
    426     test(S("abcdefghij"), 0, 9, str, str+19, S("1234567890123456789j"));
    427     test(S("abcdefghij"), 0, 9, str, str+20, S("12345678901234567890j"));
    428     test(S("abcdefghij"), 0, 10, str, str+0, S(""));
    429     test(S("abcdefghij"), 0, 10, str, str+0, S(""));
    430     test(S("abcdefghij"), 0, 10, str, str+1, S("1"));
    431     test(S("abcdefghij"), 0, 10, str, str+2, S("12"));
    432     test(S("abcdefghij"), 0, 10, str, str+4, S("1234"));
    433     test(S("abcdefghij"), 0, 10, str, str+5, S("12345"));
    434     test(S("abcdefghij"), 0, 10, str, str+0, S(""));
    435     test(S("abcdefghij"), 0, 10, str, str+1, S("1"));
    436     test(S("abcdefghij"), 0, 10, str, str+5, S("12345"));
    437     test(S("abcdefghij"), 0, 10, str, str+9, S("123456789"));
    438     test(S("abcdefghij"), 0, 10, str, str+10, S("1234567890"));
    439     test(S("abcdefghij"), 0, 10, str, str+0, S(""));
    440     test(S("abcdefghij"), 0, 10, str, str+1, S("1"));
    441     test(S("abcdefghij"), 0, 10, str, str+10, S("1234567890"));
    442     test(S("abcdefghij"), 0, 10, str, str+19, S("1234567890123456789"));
    443     test(S("abcdefghij"), 0, 10, str, str+20, S("12345678901234567890"));
    444     test(S("abcdefghij"), 1, 0, str, str+0, S("abcdefghij"));
    445     test(S("abcdefghij"), 1, 0, str, str+0, S("abcdefghij"));
    446     test(S("abcdefghij"), 1, 0, str, str+1, S("a1bcdefghij"));
    447     test(S("abcdefghij"), 1, 0, str, str+2, S("a12bcdefghij"));
    448     test(S("abcdefghij"), 1, 0, str, str+4, S("a1234bcdefghij"));
    449     test(S("abcdefghij"), 1, 0, str, str+5, S("a12345bcdefghij"));
    450     test(S("abcdefghij"), 1, 0, str, str+0, S("abcdefghij"));
    451     test(S("abcdefghij"), 1, 0, str, str+1, S("a1bcdefghij"));
    452     test(S("abcdefghij"), 1, 0, str, str+5, S("a12345bcdefghij"));
    453     test(S("abcdefghij"), 1, 0, str, str+9, S("a123456789bcdefghij"));
    454     test(S("abcdefghij"), 1, 0, str, str+10, S("a1234567890bcdefghij"));
    455     test(S("abcdefghij"), 1, 0, str, str+0, S("abcdefghij"));
    456     test(S("abcdefghij"), 1, 0, str, str+1, S("a1bcdefghij"));
    457     test(S("abcdefghij"), 1, 0, str, str+10, S("a1234567890bcdefghij"));
    458     test(S("abcdefghij"), 1, 0, str, str+19, S("a1234567890123456789bcdefghij"));
    459     test(S("abcdefghij"), 1, 0, str, str+20, S("a12345678901234567890bcdefghij"));
    460     test(S("abcdefghij"), 1, 1, str, str+0, S("acdefghij"));
    461     test(S("abcdefghij"), 1, 1, str, str+0, S("acdefghij"));
    462     test(S("abcdefghij"), 1, 1, str, str+1, S("a1cdefghij"));
    463     test(S("abcdefghij"), 1, 1, str, str+2, S("a12cdefghij"));
    464     test(S("abcdefghij"), 1, 1, str, str+4, S("a1234cdefghij"));
    465     test(S("abcdefghij"), 1, 1, str, str+5, S("a12345cdefghij"));
    466     test(S("abcdefghij"), 1, 1, str, str+0, S("acdefghij"));
    467     test(S("abcdefghij"), 1, 1, str, str+1, S("a1cdefghij"));
    468     test(S("abcdefghij"), 1, 1, str, str+5, S("a12345cdefghij"));
    469     test(S("abcdefghij"), 1, 1, str, str+9, S("a123456789cdefghij"));
    470     test(S("abcdefghij"), 1, 1, str, str+10, S("a1234567890cdefghij"));
    471     test(S("abcdefghij"), 1, 1, str, str+0, S("acdefghij"));
    472     test(S("abcdefghij"), 1, 1, str, str+1, S("a1cdefghij"));
    473     test(S("abcdefghij"), 1, 1, str, str+10, S("a1234567890cdefghij"));
    474     test(S("abcdefghij"), 1, 1, str, str+19, S("a1234567890123456789cdefghij"));
    475     test(S("abcdefghij"), 1, 1, str, str+20, S("a12345678901234567890cdefghij"));
    476 }
    477 
    478 template <class S>
    479 void test4()
    480 {
    481     test(S("abcdefghij"), 1, 4, str, str+0, S("afghij"));
    482     test(S("abcdefghij"), 1, 4, str, str+0, S("afghij"));
    483     test(S("abcdefghij"), 1, 4, str, str+1, S("a1fghij"));
    484     test(S("abcdefghij"), 1, 4, str, str+2, S("a12fghij"));
    485     test(S("abcdefghij"), 1, 4, str, str+4, S("a1234fghij"));
    486     test(S("abcdefghij"), 1, 4, str, str+5, S("a12345fghij"));
    487     test(S("abcdefghij"), 1, 4, str, str+0, S("afghij"));
    488     test(S("abcdefghij"), 1, 4, str, str+1, S("a1fghij"));
    489     test(S("abcdefghij"), 1, 4, str, str+5, S("a12345fghij"));
    490     test(S("abcdefghij"), 1, 4, str, str+9, S("a123456789fghij"));
    491     test(S("abcdefghij"), 1, 4, str, str+10, S("a1234567890fghij"));
    492     test(S("abcdefghij"), 1, 4, str, str+0, S("afghij"));
    493     test(S("abcdefghij"), 1, 4, str, str+1, S("a1fghij"));
    494     test(S("abcdefghij"), 1, 4, str, str+10, S("a1234567890fghij"));
    495     test(S("abcdefghij"), 1, 4, str, str+19, S("a1234567890123456789fghij"));
    496     test(S("abcdefghij"), 1, 4, str, str+20, S("a12345678901234567890fghij"));
    497     test(S("abcdefghij"), 1, 8, str, str+0, S("aj"));
    498     test(S("abcdefghij"), 1, 8, str, str+0, S("aj"));
    499     test(S("abcdefghij"), 1, 8, str, str+1, S("a1j"));
    500     test(S("abcdefghij"), 1, 8, str, str+2, S("a12j"));
    501     test(S("abcdefghij"), 1, 8, str, str+4, S("a1234j"));
    502     test(S("abcdefghij"), 1, 8, str, str+5, S("a12345j"));
    503     test(S("abcdefghij"), 1, 8, str, str+0, S("aj"));
    504     test(S("abcdefghij"), 1, 8, str, str+1, S("a1j"));
    505     test(S("abcdefghij"), 1, 8, str, str+5, S("a12345j"));
    506     test(S("abcdefghij"), 1, 8, str, str+9, S("a123456789j"));
    507     test(S("abcdefghij"), 1, 8, str, str+10, S("a1234567890j"));
    508     test(S("abcdefghij"), 1, 8, str, str+0, S("aj"));
    509     test(S("abcdefghij"), 1, 8, str, str+1, S("a1j"));
    510     test(S("abcdefghij"), 1, 8, str, str+10, S("a1234567890j"));
    511     test(S("abcdefghij"), 1, 8, str, str+19, S("a1234567890123456789j"));
    512     test(S("abcdefghij"), 1, 8, str, str+20, S("a12345678901234567890j"));
    513     test(S("abcdefghij"), 1, 9, str, str+0, S("a"));
    514     test(S("abcdefghij"), 1, 9, str, str+0, S("a"));
    515     test(S("abcdefghij"), 1, 9, str, str+1, S("a1"));
    516     test(S("abcdefghij"), 1, 9, str, str+2, S("a12"));
    517     test(S("abcdefghij"), 1, 9, str, str+4, S("a1234"));
    518     test(S("abcdefghij"), 1, 9, str, str+5, S("a12345"));
    519     test(S("abcdefghij"), 1, 9, str, str+0, S("a"));
    520     test(S("abcdefghij"), 1, 9, str, str+1, S("a1"));
    521     test(S("abcdefghij"), 1, 9, str, str+5, S("a12345"));
    522     test(S("abcdefghij"), 1, 9, str, str+9, S("a123456789"));
    523     test(S("abcdefghij"), 1, 9, str, str+10, S("a1234567890"));
    524     test(S("abcdefghij"), 1, 9, str, str+0, S("a"));
    525     test(S("abcdefghij"), 1, 9, str, str+1, S("a1"));
    526     test(S("abcdefghij"), 1, 9, str, str+10, S("a1234567890"));
    527     test(S("abcdefghij"), 1, 9, str, str+19, S("a1234567890123456789"));
    528     test(S("abcdefghij"), 1, 9, str, str+20, S("a12345678901234567890"));
    529     test(S("abcdefghij"), 5, 0, str, str+0, S("abcdefghij"));
    530     test(S("abcdefghij"), 5, 0, str, str+0, S("abcdefghij"));
    531     test(S("abcdefghij"), 5, 0, str, str+1, S("abcde1fghij"));
    532     test(S("abcdefghij"), 5, 0, str, str+2, S("abcde12fghij"));
    533     test(S("abcdefghij"), 5, 0, str, str+4, S("abcde1234fghij"));
    534     test(S("abcdefghij"), 5, 0, str, str+5, S("abcde12345fghij"));
    535     test(S("abcdefghij"), 5, 0, str, str+0, S("abcdefghij"));
    536     test(S("abcdefghij"), 5, 0, str, str+1, S("abcde1fghij"));
    537     test(S("abcdefghij"), 5, 0, str, str+5, S("abcde12345fghij"));
    538     test(S("abcdefghij"), 5, 0, str, str+9, S("abcde123456789fghij"));
    539     test(S("abcdefghij"), 5, 0, str, str+10, S("abcde1234567890fghij"));
    540     test(S("abcdefghij"), 5, 0, str, str+0, S("abcdefghij"));
    541     test(S("abcdefghij"), 5, 0, str, str+1, S("abcde1fghij"));
    542     test(S("abcdefghij"), 5, 0, str, str+10, S("abcde1234567890fghij"));
    543     test(S("abcdefghij"), 5, 0, str, str+19, S("abcde1234567890123456789fghij"));
    544     test(S("abcdefghij"), 5, 0, str, str+20, S("abcde12345678901234567890fghij"));
    545     test(S("abcdefghij"), 5, 1, str, str+0, S("abcdeghij"));
    546     test(S("abcdefghij"), 5, 1, str, str+0, S("abcdeghij"));
    547     test(S("abcdefghij"), 5, 1, str, str+1, S("abcde1ghij"));
    548     test(S("abcdefghij"), 5, 1, str, str+2, S("abcde12ghij"));
    549     test(S("abcdefghij"), 5, 1, str, str+4, S("abcde1234ghij"));
    550     test(S("abcdefghij"), 5, 1, str, str+5, S("abcde12345ghij"));
    551     test(S("abcdefghij"), 5, 1, str, str+0, S("abcdeghij"));
    552     test(S("abcdefghij"), 5, 1, str, str+1, S("abcde1ghij"));
    553     test(S("abcdefghij"), 5, 1, str, str+5, S("abcde12345ghij"));
    554     test(S("abcdefghij"), 5, 1, str, str+9, S("abcde123456789ghij"));
    555     test(S("abcdefghij"), 5, 1, str, str+10, S("abcde1234567890ghij"));
    556     test(S("abcdefghij"), 5, 1, str, str+0, S("abcdeghij"));
    557     test(S("abcdefghij"), 5, 1, str, str+1, S("abcde1ghij"));
    558     test(S("abcdefghij"), 5, 1, str, str+10, S("abcde1234567890ghij"));
    559     test(S("abcdefghij"), 5, 1, str, str+19, S("abcde1234567890123456789ghij"));
    560     test(S("abcdefghij"), 5, 1, str, str+20, S("abcde12345678901234567890ghij"));
    561     test(S("abcdefghij"), 5, 2, str, str+0, S("abcdehij"));
    562     test(S("abcdefghij"), 5, 2, str, str+0, S("abcdehij"));
    563     test(S("abcdefghij"), 5, 2, str, str+1, S("abcde1hij"));
    564     test(S("abcdefghij"), 5, 2, str, str+2, S("abcde12hij"));
    565     test(S("abcdefghij"), 5, 2, str, str+4, S("abcde1234hij"));
    566     test(S("abcdefghij"), 5, 2, str, str+5, S("abcde12345hij"));
    567     test(S("abcdefghij"), 5, 2, str, str+0, S("abcdehij"));
    568     test(S("abcdefghij"), 5, 2, str, str+1, S("abcde1hij"));
    569     test(S("abcdefghij"), 5, 2, str, str+5, S("abcde12345hij"));
    570     test(S("abcdefghij"), 5, 2, str, str+9, S("abcde123456789hij"));
    571     test(S("abcdefghij"), 5, 2, str, str+10, S("abcde1234567890hij"));
    572     test(S("abcdefghij"), 5, 2, str, str+0, S("abcdehij"));
    573     test(S("abcdefghij"), 5, 2, str, str+1, S("abcde1hij"));
    574     test(S("abcdefghij"), 5, 2, str, str+10, S("abcde1234567890hij"));
    575     test(S("abcdefghij"), 5, 2, str, str+19, S("abcde1234567890123456789hij"));
    576     test(S("abcdefghij"), 5, 2, str, str+20, S("abcde12345678901234567890hij"));
    577     test(S("abcdefghij"), 5, 4, str, str+0, S("abcdej"));
    578     test(S("abcdefghij"), 5, 4, str, str+0, S("abcdej"));
    579     test(S("abcdefghij"), 5, 4, str, str+1, S("abcde1j"));
    580     test(S("abcdefghij"), 5, 4, str, str+2, S("abcde12j"));
    581 }
    582 
    583 template <class S>
    584 void test5()
    585 {
    586     test(S("abcdefghij"), 5, 4, str, str+4, S("abcde1234j"));
    587     test(S("abcdefghij"), 5, 4, str, str+5, S("abcde12345j"));
    588     test(S("abcdefghij"), 5, 4, str, str+0, S("abcdej"));
    589     test(S("abcdefghij"), 5, 4, str, str+1, S("abcde1j"));
    590     test(S("abcdefghij"), 5, 4, str, str+5, S("abcde12345j"));
    591     test(S("abcdefghij"), 5, 4, str, str+9, S("abcde123456789j"));
    592     test(S("abcdefghij"), 5, 4, str, str+10, S("abcde1234567890j"));
    593     test(S("abcdefghij"), 5, 4, str, str+0, S("abcdej"));
    594     test(S("abcdefghij"), 5, 4, str, str+1, S("abcde1j"));
    595     test(S("abcdefghij"), 5, 4, str, str+10, S("abcde1234567890j"));
    596     test(S("abcdefghij"), 5, 4, str, str+19, S("abcde1234567890123456789j"));
    597     test(S("abcdefghij"), 5, 4, str, str+20, S("abcde12345678901234567890j"));
    598     test(S("abcdefghij"), 5, 5, str, str+0, S("abcde"));
    599     test(S("abcdefghij"), 5, 5, str, str+0, S("abcde"));
    600     test(S("abcdefghij"), 5, 5, str, str+1, S("abcde1"));
    601     test(S("abcdefghij"), 5, 5, str, str+2, S("abcde12"));
    602     test(S("abcdefghij"), 5, 5, str, str+4, S("abcde1234"));
    603     test(S("abcdefghij"), 5, 5, str, str+5, S("abcde12345"));
    604     test(S("abcdefghij"), 5, 5, str, str+0, S("abcde"));
    605     test(S("abcdefghij"), 5, 5, str, str+1, S("abcde1"));
    606     test(S("abcdefghij"), 5, 5, str, str+5, S("abcde12345"));
    607     test(S("abcdefghij"), 5, 5, str, str+9, S("abcde123456789"));
    608     test(S("abcdefghij"), 5, 5, str, str+10, S("abcde1234567890"));
    609     test(S("abcdefghij"), 5, 5, str, str+0, S("abcde"));
    610     test(S("abcdefghij"), 5, 5, str, str+1, S("abcde1"));
    611     test(S("abcdefghij"), 5, 5, str, str+10, S("abcde1234567890"));
    612     test(S("abcdefghij"), 5, 5, str, str+19, S("abcde1234567890123456789"));
    613     test(S("abcdefghij"), 5, 5, str, str+20, S("abcde12345678901234567890"));
    614     test(S("abcdefghij"), 9, 0, str, str+0, S("abcdefghij"));
    615     test(S("abcdefghij"), 9, 0, str, str+0, S("abcdefghij"));
    616     test(S("abcdefghij"), 9, 0, str, str+1, S("abcdefghi1j"));
    617     test(S("abcdefghij"), 9, 0, str, str+2, S("abcdefghi12j"));
    618     test(S("abcdefghij"), 9, 0, str, str+4, S("abcdefghi1234j"));
    619     test(S("abcdefghij"), 9, 0, str, str+5, S("abcdefghi12345j"));
    620     test(S("abcdefghij"), 9, 0, str, str+0, S("abcdefghij"));
    621     test(S("abcdefghij"), 9, 0, str, str+1, S("abcdefghi1j"));
    622     test(S("abcdefghij"), 9, 0, str, str+5, S("abcdefghi12345j"));
    623     test(S("abcdefghij"), 9, 0, str, str+9, S("abcdefghi123456789j"));
    624     test(S("abcdefghij"), 9, 0, str, str+10, S("abcdefghi1234567890j"));
    625     test(S("abcdefghij"), 9, 0, str, str+0, S("abcdefghij"));
    626     test(S("abcdefghij"), 9, 0, str, str+1, S("abcdefghi1j"));
    627     test(S("abcdefghij"), 9, 0, str, str+10, S("abcdefghi1234567890j"));
    628     test(S("abcdefghij"), 9, 0, str, str+19, S("abcdefghi1234567890123456789j"));
    629     test(S("abcdefghij"), 9, 0, str, str+20, S("abcdefghi12345678901234567890j"));
    630     test(S("abcdefghij"), 9, 1, str, str+0, S("abcdefghi"));
    631     test(S("abcdefghij"), 9, 1, str, str+0, S("abcdefghi"));
    632     test(S("abcdefghij"), 9, 1, str, str+1, S("abcdefghi1"));
    633     test(S("abcdefghij"), 9, 1, str, str+2, S("abcdefghi12"));
    634     test(S("abcdefghij"), 9, 1, str, str+4, S("abcdefghi1234"));
    635     test(S("abcdefghij"), 9, 1, str, str+5, S("abcdefghi12345"));
    636     test(S("abcdefghij"), 9, 1, str, str+0, S("abcdefghi"));
    637     test(S("abcdefghij"), 9, 1, str, str+1, S("abcdefghi1"));
    638     test(S("abcdefghij"), 9, 1, str, str+5, S("abcdefghi12345"));
    639     test(S("abcdefghij"), 9, 1, str, str+9, S("abcdefghi123456789"));
    640     test(S("abcdefghij"), 9, 1, str, str+10, S("abcdefghi1234567890"));
    641     test(S("abcdefghij"), 9, 1, str, str+0, S("abcdefghi"));
    642     test(S("abcdefghij"), 9, 1, str, str+1, S("abcdefghi1"));
    643     test(S("abcdefghij"), 9, 1, str, str+10, S("abcdefghi1234567890"));
    644     test(S("abcdefghij"), 9, 1, str, str+19, S("abcdefghi1234567890123456789"));
    645     test(S("abcdefghij"), 9, 1, str, str+20, S("abcdefghi12345678901234567890"));
    646     test(S("abcdefghij"), 10, 0, str, str+0, S("abcdefghij"));
    647     test(S("abcdefghij"), 10, 0, str, str+0, S("abcdefghij"));
    648     test(S("abcdefghij"), 10, 0, str, str+1, S("abcdefghij1"));
    649     test(S("abcdefghij"), 10, 0, str, str+2, S("abcdefghij12"));
    650     test(S("abcdefghij"), 10, 0, str, str+4, S("abcdefghij1234"));
    651     test(S("abcdefghij"), 10, 0, str, str+5, S("abcdefghij12345"));
    652     test(S("abcdefghij"), 10, 0, str, str+0, S("abcdefghij"));
    653     test(S("abcdefghij"), 10, 0, str, str+1, S("abcdefghij1"));
    654     test(S("abcdefghij"), 10, 0, str, str+5, S("abcdefghij12345"));
    655     test(S("abcdefghij"), 10, 0, str, str+9, S("abcdefghij123456789"));
    656     test(S("abcdefghij"), 10, 0, str, str+10, S("abcdefghij1234567890"));
    657     test(S("abcdefghij"), 10, 0, str, str+0, S("abcdefghij"));
    658     test(S("abcdefghij"), 10, 0, str, str+1, S("abcdefghij1"));
    659     test(S("abcdefghij"), 10, 0, str, str+10, S("abcdefghij1234567890"));
    660     test(S("abcdefghij"), 10, 0, str, str+19, S("abcdefghij1234567890123456789"));
    661     test(S("abcdefghij"), 10, 0, str, str+20, S("abcdefghij12345678901234567890"));
    662     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+0, S("abcdefghijklmnopqrst"));
    663     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+0, S("abcdefghijklmnopqrst"));
    664     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+1, S("1abcdefghijklmnopqrst"));
    665     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+2, S("12abcdefghijklmnopqrst"));
    666     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+4, S("1234abcdefghijklmnopqrst"));
    667     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+5, S("12345abcdefghijklmnopqrst"));
    668     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+0, S("abcdefghijklmnopqrst"));
    669     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+1, S("1abcdefghijklmnopqrst"));
    670     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+5, S("12345abcdefghijklmnopqrst"));
    671     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+9, S("123456789abcdefghijklmnopqrst"));
    672     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+10, S("1234567890abcdefghijklmnopqrst"));
    673     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+0, S("abcdefghijklmnopqrst"));
    674     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+1, S("1abcdefghijklmnopqrst"));
    675     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+10, S("1234567890abcdefghijklmnopqrst"));
    676     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+19, S("1234567890123456789abcdefghijklmnopqrst"));
    677     test(S("abcdefghijklmnopqrst"), 0, 0, str, str+20, S("12345678901234567890abcdefghijklmnopqrst"));
    678     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+0, S("bcdefghijklmnopqrst"));
    679     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+0, S("bcdefghijklmnopqrst"));
    680     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+1, S("1bcdefghijklmnopqrst"));
    681     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+2, S("12bcdefghijklmnopqrst"));
    682     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+4, S("1234bcdefghijklmnopqrst"));
    683     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+5, S("12345bcdefghijklmnopqrst"));
    684     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+0, S("bcdefghijklmnopqrst"));
    685     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+1, S("1bcdefghijklmnopqrst"));
    686 }
    687 
    688 template <class S>
    689 void test6()
    690 {
    691     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+5, S("12345bcdefghijklmnopqrst"));
    692     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+9, S("123456789bcdefghijklmnopqrst"));
    693     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+10, S("1234567890bcdefghijklmnopqrst"));
    694     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+0, S("bcdefghijklmnopqrst"));
    695     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+1, S("1bcdefghijklmnopqrst"));
    696     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+10, S("1234567890bcdefghijklmnopqrst"));
    697     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+19, S("1234567890123456789bcdefghijklmnopqrst"));
    698     test(S("abcdefghijklmnopqrst"), 0, 1, str, str+20, S("12345678901234567890bcdefghijklmnopqrst"));
    699     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+0, S("klmnopqrst"));
    700     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+0, S("klmnopqrst"));
    701     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+1, S("1klmnopqrst"));
    702     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+2, S("12klmnopqrst"));
    703     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+4, S("1234klmnopqrst"));
    704     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+5, S("12345klmnopqrst"));
    705     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+0, S("klmnopqrst"));
    706     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+1, S("1klmnopqrst"));
    707     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+5, S("12345klmnopqrst"));
    708     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+9, S("123456789klmnopqrst"));
    709     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+10, S("1234567890klmnopqrst"));
    710     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+0, S("klmnopqrst"));
    711     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+1, S("1klmnopqrst"));
    712     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+10, S("1234567890klmnopqrst"));
    713     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+19, S("1234567890123456789klmnopqrst"));
    714     test(S("abcdefghijklmnopqrst"), 0, 10, str, str+20, S("12345678901234567890klmnopqrst"));
    715     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+0, S("t"));
    716     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+0, S("t"));
    717     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+1, S("1t"));
    718     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+2, S("12t"));
    719     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+4, S("1234t"));
    720     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+5, S("12345t"));
    721     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+0, S("t"));
    722     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+1, S("1t"));
    723     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+5, S("12345t"));
    724     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+9, S("123456789t"));
    725     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+10, S("1234567890t"));
    726     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+0, S("t"));
    727     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+1, S("1t"));
    728     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+10, S("1234567890t"));
    729     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+19, S("1234567890123456789t"));
    730     test(S("abcdefghijklmnopqrst"), 0, 19, str, str+20, S("12345678901234567890t"));
    731     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+0, S(""));
    732     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+0, S(""));
    733     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+1, S("1"));
    734     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+2, S("12"));
    735     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+4, S("1234"));
    736     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+5, S("12345"));
    737     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+0, S(""));
    738     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+1, S("1"));
    739     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+5, S("12345"));
    740     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+9, S("123456789"));
    741     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+10, S("1234567890"));
    742     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+0, S(""));
    743     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+1, S("1"));
    744     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+10, S("1234567890"));
    745     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+19, S("1234567890123456789"));
    746     test(S("abcdefghijklmnopqrst"), 0, 20, str, str+20, S("12345678901234567890"));
    747     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+0, S("abcdefghijklmnopqrst"));
    748     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+0, S("abcdefghijklmnopqrst"));
    749     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+1, S("a1bcdefghijklmnopqrst"));
    750     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+2, S("a12bcdefghijklmnopqrst"));
    751     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+4, S("a1234bcdefghijklmnopqrst"));
    752     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+5, S("a12345bcdefghijklmnopqrst"));
    753     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+0, S("abcdefghijklmnopqrst"));
    754     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+1, S("a1bcdefghijklmnopqrst"));
    755     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+5, S("a12345bcdefghijklmnopqrst"));
    756     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+9, S("a123456789bcdefghijklmnopqrst"));
    757     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+10, S("a1234567890bcdefghijklmnopqrst"));
    758     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+0, S("abcdefghijklmnopqrst"));
    759     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+1, S("a1bcdefghijklmnopqrst"));
    760     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+10, S("a1234567890bcdefghijklmnopqrst"));
    761     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+19, S("a1234567890123456789bcdefghijklmnopqrst"));
    762     test(S("abcdefghijklmnopqrst"), 1, 0, str, str+20, S("a12345678901234567890bcdefghijklmnopqrst"));
    763     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+0, S("acdefghijklmnopqrst"));
    764     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+0, S("acdefghijklmnopqrst"));
    765     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+1, S("a1cdefghijklmnopqrst"));
    766     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+2, S("a12cdefghijklmnopqrst"));
    767     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+4, S("a1234cdefghijklmnopqrst"));
    768     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+5, S("a12345cdefghijklmnopqrst"));
    769     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+0, S("acdefghijklmnopqrst"));
    770     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+1, S("a1cdefghijklmnopqrst"));
    771     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+5, S("a12345cdefghijklmnopqrst"));
    772     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+9, S("a123456789cdefghijklmnopqrst"));
    773     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+10, S("a1234567890cdefghijklmnopqrst"));
    774     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+0, S("acdefghijklmnopqrst"));
    775     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+1, S("a1cdefghijklmnopqrst"));
    776     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+10, S("a1234567890cdefghijklmnopqrst"));
    777     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+19, S("a1234567890123456789cdefghijklmnopqrst"));
    778     test(S("abcdefghijklmnopqrst"), 1, 1, str, str+20, S("a12345678901234567890cdefghijklmnopqrst"));
    779     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+0, S("aklmnopqrst"));
    780     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+0, S("aklmnopqrst"));
    781     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+1, S("a1klmnopqrst"));
    782     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+2, S("a12klmnopqrst"));
    783     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+4, S("a1234klmnopqrst"));
    784     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+5, S("a12345klmnopqrst"));
    785     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+0, S("aklmnopqrst"));
    786     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+1, S("a1klmnopqrst"));
    787     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+5, S("a12345klmnopqrst"));
    788     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+9, S("a123456789klmnopqrst"));
    789     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+10, S("a1234567890klmnopqrst"));
    790     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+0, S("aklmnopqrst"));
    791 }
    792 
    793 template <class S>
    794 void test7()
    795 {
    796     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+1, S("a1klmnopqrst"));
    797     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+10, S("a1234567890klmnopqrst"));
    798     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+19, S("a1234567890123456789klmnopqrst"));
    799     test(S("abcdefghijklmnopqrst"), 1, 9, str, str+20, S("a12345678901234567890klmnopqrst"));
    800     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+0, S("at"));
    801     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+0, S("at"));
    802     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+1, S("a1t"));
    803     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+2, S("a12t"));
    804     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+4, S("a1234t"));
    805     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+5, S("a12345t"));
    806     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+0, S("at"));
    807     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+1, S("a1t"));
    808     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+5, S("a12345t"));
    809     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+9, S("a123456789t"));
    810     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+10, S("a1234567890t"));
    811     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+0, S("at"));
    812     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+1, S("a1t"));
    813     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+10, S("a1234567890t"));
    814     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+19, S("a1234567890123456789t"));
    815     test(S("abcdefghijklmnopqrst"), 1, 18, str, str+20, S("a12345678901234567890t"));
    816     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+0, S("a"));
    817     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+0, S("a"));
    818     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+1, S("a1"));
    819     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+2, S("a12"));
    820     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+4, S("a1234"));
    821     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+5, S("a12345"));
    822     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+0, S("a"));
    823     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+1, S("a1"));
    824     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+5, S("a12345"));
    825     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+9, S("a123456789"));
    826     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+10, S("a1234567890"));
    827     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+0, S("a"));
    828     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+1, S("a1"));
    829     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+10, S("a1234567890"));
    830     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+19, S("a1234567890123456789"));
    831     test(S("abcdefghijklmnopqrst"), 1, 19, str, str+20, S("a12345678901234567890"));
    832     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+0, S("abcdefghijklmnopqrst"));
    833     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+0, S("abcdefghijklmnopqrst"));
    834     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+1, S("abcdefghij1klmnopqrst"));
    835     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+2, S("abcdefghij12klmnopqrst"));
    836     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+4, S("abcdefghij1234klmnopqrst"));
    837     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+5, S("abcdefghij12345klmnopqrst"));
    838     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+0, S("abcdefghijklmnopqrst"));
    839     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+1, S("abcdefghij1klmnopqrst"));
    840     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+5, S("abcdefghij12345klmnopqrst"));
    841     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+9, S("abcdefghij123456789klmnopqrst"));
    842     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+10, S("abcdefghij1234567890klmnopqrst"));
    843     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+0, S("abcdefghijklmnopqrst"));
    844     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+1, S("abcdefghij1klmnopqrst"));
    845     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+10, S("abcdefghij1234567890klmnopqrst"));
    846     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+19, S("abcdefghij1234567890123456789klmnopqrst"));
    847     test(S("abcdefghijklmnopqrst"), 10, 0, str, str+20, S("abcdefghij12345678901234567890klmnopqrst"));
    848     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+0, S("abcdefghijlmnopqrst"));
    849     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+0, S("abcdefghijlmnopqrst"));
    850     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+1, S("abcdefghij1lmnopqrst"));
    851     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+2, S("abcdefghij12lmnopqrst"));
    852     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+4, S("abcdefghij1234lmnopqrst"));
    853     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+5, S("abcdefghij12345lmnopqrst"));
    854     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+0, S("abcdefghijlmnopqrst"));
    855     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+1, S("abcdefghij1lmnopqrst"));
    856     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+5, S("abcdefghij12345lmnopqrst"));
    857     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+9, S("abcdefghij123456789lmnopqrst"));
    858     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+10, S("abcdefghij1234567890lmnopqrst"));
    859     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+0, S("abcdefghijlmnopqrst"));
    860     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+1, S("abcdefghij1lmnopqrst"));
    861     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+10, S("abcdefghij1234567890lmnopqrst"));
    862     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+19, S("abcdefghij1234567890123456789lmnopqrst"));
    863     test(S("abcdefghijklmnopqrst"), 10, 1, str, str+20, S("abcdefghij12345678901234567890lmnopqrst"));
    864     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+0, S("abcdefghijpqrst"));
    865     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+0, S("abcdefghijpqrst"));
    866     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+1, S("abcdefghij1pqrst"));
    867     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+2, S("abcdefghij12pqrst"));
    868     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+4, S("abcdefghij1234pqrst"));
    869     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+5, S("abcdefghij12345pqrst"));
    870     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+0, S("abcdefghijpqrst"));
    871     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+1, S("abcdefghij1pqrst"));
    872     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+5, S("abcdefghij12345pqrst"));
    873     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+9, S("abcdefghij123456789pqrst"));
    874     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+10, S("abcdefghij1234567890pqrst"));
    875     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+0, S("abcdefghijpqrst"));
    876     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+1, S("abcdefghij1pqrst"));
    877     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+10, S("abcdefghij1234567890pqrst"));
    878     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+19, S("abcdefghij1234567890123456789pqrst"));
    879     test(S("abcdefghijklmnopqrst"), 10, 5, str, str+20, S("abcdefghij12345678901234567890pqrst"));
    880     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+0, S("abcdefghijt"));
    881     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+0, S("abcdefghijt"));
    882     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+1, S("abcdefghij1t"));
    883     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+2, S("abcdefghij12t"));
    884     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+4, S("abcdefghij1234t"));
    885     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+5, S("abcdefghij12345t"));
    886     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+0, S("abcdefghijt"));
    887     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+1, S("abcdefghij1t"));
    888     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+5, S("abcdefghij12345t"));
    889     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+9, S("abcdefghij123456789t"));
    890     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+10, S("abcdefghij1234567890t"));
    891     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+0, S("abcdefghijt"));
    892     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+1, S("abcdefghij1t"));
    893     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+10, S("abcdefghij1234567890t"));
    894     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+19, S("abcdefghij1234567890123456789t"));
    895     test(S("abcdefghijklmnopqrst"), 10, 9, str, str+20, S("abcdefghij12345678901234567890t"));
    896 }
    897 
    898 template <class S>
    899 void test8()
    900 {
    901     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+0, S("abcdefghij"));
    902     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+0, S("abcdefghij"));
    903     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+1, S("abcdefghij1"));
    904     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+2, S("abcdefghij12"));
    905     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+4, S("abcdefghij1234"));
    906     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+5, S("abcdefghij12345"));
    907     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+0, S("abcdefghij"));
    908     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+1, S("abcdefghij1"));
    909     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+5, S("abcdefghij12345"));
    910     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+9, S("abcdefghij123456789"));
    911     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+10, S("abcdefghij1234567890"));
    912     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+0, S("abcdefghij"));
    913     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+1, S("abcdefghij1"));
    914     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+10, S("abcdefghij1234567890"));
    915     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+19, S("abcdefghij1234567890123456789"));
    916     test(S("abcdefghijklmnopqrst"), 10, 10, str, str+20, S("abcdefghij12345678901234567890"));
    917     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+0, S("abcdefghijklmnopqrst"));
    918     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+0, S("abcdefghijklmnopqrst"));
    919     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+1, S("abcdefghijklmnopqrs1t"));
    920     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+2, S("abcdefghijklmnopqrs12t"));
    921     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+4, S("abcdefghijklmnopqrs1234t"));
    922     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+5, S("abcdefghijklmnopqrs12345t"));
    923     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+0, S("abcdefghijklmnopqrst"));
    924     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+1, S("abcdefghijklmnopqrs1t"));
    925     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+5, S("abcdefghijklmnopqrs12345t"));
    926     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+9, S("abcdefghijklmnopqrs123456789t"));
    927     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+10, S("abcdefghijklmnopqrs1234567890t"));
    928     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+0, S("abcdefghijklmnopqrst"));
    929     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+1, S("abcdefghijklmnopqrs1t"));
    930     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+10, S("abcdefghijklmnopqrs1234567890t"));
    931     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+19, S("abcdefghijklmnopqrs1234567890123456789t"));
    932     test(S("abcdefghijklmnopqrst"), 19, 0, str, str+20, S("abcdefghijklmnopqrs12345678901234567890t"));
    933     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+0, S("abcdefghijklmnopqrs"));
    934     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+0, S("abcdefghijklmnopqrs"));
    935     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+1, S("abcdefghijklmnopqrs1"));
    936     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+2, S("abcdefghijklmnopqrs12"));
    937     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+4, S("abcdefghijklmnopqrs1234"));
    938     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+5, S("abcdefghijklmnopqrs12345"));
    939     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+0, S("abcdefghijklmnopqrs"));
    940     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+1, S("abcdefghijklmnopqrs1"));
    941     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+5, S("abcdefghijklmnopqrs12345"));
    942     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+9, S("abcdefghijklmnopqrs123456789"));
    943     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+10, S("abcdefghijklmnopqrs1234567890"));
    944     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+0, S("abcdefghijklmnopqrs"));
    945     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+1, S("abcdefghijklmnopqrs1"));
    946     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+10, S("abcdefghijklmnopqrs1234567890"));
    947     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+19, S("abcdefghijklmnopqrs1234567890123456789"));
    948     test(S("abcdefghijklmnopqrst"), 19, 1, str, str+20, S("abcdefghijklmnopqrs12345678901234567890"));
    949     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+0, S("abcdefghijklmnopqrst"));
    950     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+0, S("abcdefghijklmnopqrst"));
    951     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+1, S("abcdefghijklmnopqrst1"));
    952     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+2, S("abcdefghijklmnopqrst12"));
    953     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+4, S("abcdefghijklmnopqrst1234"));
    954     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+5, S("abcdefghijklmnopqrst12345"));
    955     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+0, S("abcdefghijklmnopqrst"));
    956     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+1, S("abcdefghijklmnopqrst1"));
    957     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+5, S("abcdefghijklmnopqrst12345"));
    958     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+9, S("abcdefghijklmnopqrst123456789"));
    959     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+10, S("abcdefghijklmnopqrst1234567890"));
    960     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+0, S("abcdefghijklmnopqrst"));
    961     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+1, S("abcdefghijklmnopqrst1"));
    962     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+10, S("abcdefghijklmnopqrst1234567890"));
    963     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+19, S("abcdefghijklmnopqrst1234567890123456789"));
    964     test(S("abcdefghijklmnopqrst"), 20, 0, str, str+20, S("abcdefghijklmnopqrst12345678901234567890"));
    965 }
    966 
    967 int main()
    968 {
    969     {
    970     typedef std::string S;
    971     test0<S>();
    972     test1<S>();
    973     test2<S>();
    974     test3<S>();
    975     test4<S>();
    976     test5<S>();
    977     test6<S>();
    978     test7<S>();
    979     test8<S>();
    980     }
    981 #if TEST_STD_VER >= 11
    982     {
    983     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
    984     test0<S>();
    985     test1<S>();
    986     test2<S>();
    987     test3<S>();
    988     test4<S>();
    989     test5<S>();
    990     test6<S>();
    991     test7<S>();
    992     test8<S>();
    993     }
    994 #endif
    995 #ifndef TEST_HAS_NO_EXCEPTIONS
    996 	{ // test iterator operations that throw
    997     typedef std::string S;
    998     typedef ThrowingIterator<char> TIter;
    999     typedef input_iterator<TIter> IIter;
   1000     const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
   1001     test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter());
   1002     test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter());
   1003     test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter());
   1004 
   1005     test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, TIter(s, s+10, 4, TIter::TAIncrement), TIter());
   1006     test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, TIter(s, s+10, 5, TIter::TADereference), TIter());
   1007     test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, TIter(s, s+10, 6, TIter::TAComparison), TIter());
   1008 	}
   1009 #endif
   1010 
   1011 	{ // test replacing into self
   1012     typedef std::string S;
   1013 	S s_short = "123/";
   1014 	S s_long  = "Lorem ipsum dolor sit amet, consectetur/";
   1015 
   1016 	s_short.replace(s_short.begin(), s_short.begin(), s_short.begin(), s_short.end());
   1017 	assert(s_short == "123/123/");
   1018 	s_short.replace(s_short.begin(), s_short.begin(), s_short.begin(), s_short.end());
   1019 	assert(s_short == "123/123/123/123/");
   1020 	s_short.replace(s_short.begin(), s_short.begin(), s_short.begin(), s_short.end());
   1021 	assert(s_short == "123/123/123/123/123/123/123/123/");
   1022 
   1023 	s_long.replace(s_long.begin(), s_long.begin(), s_long.begin(), s_long.end());
   1024 	assert(s_long == "Lorem ipsum dolor sit amet, consectetur/Lorem ipsum dolor sit amet, consectetur/");
   1025 	}
   1026 
   1027 	{ // test assigning a different type
   1028     typedef std::string S;
   1029 	const uint8_t pc[] = "ABCD";
   1030 	uint8_t        p[] = "EFGH";
   1031 
   1032 	S s;
   1033 	s.replace(s.begin(), s.end(), pc, pc + 4);
   1034 	assert(s == "ABCD");
   1035 
   1036 	s.clear();
   1037 	s.replace(s.begin(), s.end(), p, p + 4);
   1038 	assert(s == "EFGH");
   1039 	}
   1040 }
   1041