1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <string>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
126e0a1f458e41c08112a130f50636ced03907e29eHoward Hinnant// basic_string<charT,traits,Allocator>&
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   replace(size_type pos1, size_type n1, const basic_string<charT,traits,Allocator>& str);
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <string>
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <stdexcept>
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <algorithm>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
20061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
229dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
249dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttest(S s, typename S::size_type pos1, typename S::size_type n1, S str, S expected)
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
269dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    typename S::size_type old_size = s.size();
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    S s0 = s;
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    try
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        s.replace(pos1, n1, str);
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(s.__invariants());
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(pos1 <= old_size);
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(s == expected);
349dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant        typename S::size_type xlen = std::min(n1, old_size - pos1);
359dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant        typename S::size_type rlen = str.size();
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(s.size() == old_size - xlen + rlen);
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    catch (std::out_of_range&)
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(pos1 > old_size);
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(s == s0);
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
459dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test0()
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S(""), S(""));
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345"), S("12345"));
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("1234567890"), S("1234567890"));
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 0, S("12345678901234567890"), S("12345678901234567890"));
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S(""), S(""));
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345"), S("12345"));
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("1234567890"), S("1234567890"));
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 0, 1, S("12345678901234567890"), S("12345678901234567890"));
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S(""), S("can't happen"));
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345"), S("can't happen"));
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("1234567890"), S("can't happen"));
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S(""), 1, 0, S("12345678901234567890"), S("can't happen"));
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S(""), S("abcde"));
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345"), S("12345abcde"));
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("1234567890"), S("1234567890abcde"));
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 0, S("12345678901234567890"), S("12345678901234567890abcde"));
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S(""), S("bcde"));
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345"), S("12345bcde"));
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("1234567890"), S("1234567890bcde"));
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 1, S("12345678901234567890"), S("12345678901234567890bcde"));
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S(""), S("cde"));
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345"), S("12345cde"));
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("1234567890"), S("1234567890cde"));
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 2, S("12345678901234567890"), S("12345678901234567890cde"));
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S(""), S("e"));
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345"), S("12345e"));
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("1234567890"), S("1234567890e"));
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 4, S("12345678901234567890"), S("12345678901234567890e"));
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S(""), S(""));
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345"), S("12345"));
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("1234567890"), S("1234567890"));
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 5, S("12345678901234567890"), S("12345678901234567890"));
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S(""), S(""));
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345"), S("12345"));
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("1234567890"), S("1234567890"));
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 0, 6, S("12345678901234567890"), S("12345678901234567890"));
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S(""), S("abcde"));
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345"), S("a12345bcde"));
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("1234567890"), S("a1234567890bcde"));
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 0, S("12345678901234567890"), S("a12345678901234567890bcde"));
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S(""), S("acde"));
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345"), S("a12345cde"));
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("1234567890"), S("a1234567890cde"));
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 1, S("12345678901234567890"), S("a12345678901234567890cde"));
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S(""), S("ade"));
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345"), S("a12345de"));
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("1234567890"), S("a1234567890de"));
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 2, S("12345678901234567890"), S("a12345678901234567890de"));
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S(""), S("ae"));
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345"), S("a12345e"));
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("1234567890"), S("a1234567890e"));
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 3, S("12345678901234567890"), S("a12345678901234567890e"));
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S(""), S("a"));
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345"), S("a12345"));
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("1234567890"), S("a1234567890"));
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 4, S("12345678901234567890"), S("a12345678901234567890"));
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S(""), S("a"));
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345"), S("a12345"));
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("1234567890"), S("a1234567890"));
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 1, 5, S("12345678901234567890"), S("a12345678901234567890"));
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S(""), S("abcde"));
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345"), S("ab12345cde"));
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("1234567890"), S("ab1234567890cde"));
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 0, S("12345678901234567890"), S("ab12345678901234567890cde"));
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S(""), S("abde"));
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345"), S("ab12345de"));
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("1234567890"), S("ab1234567890de"));
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 1, S("12345678901234567890"), S("ab12345678901234567890de"));
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S(""), S("abe"));
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345"), S("ab12345e"));
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("1234567890"), S("ab1234567890e"));
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 2, S("12345678901234567890"), S("ab12345678901234567890e"));
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S(""), S("ab"));
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345"), S("ab12345"));
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("1234567890"), S("ab1234567890"));
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 3, S("12345678901234567890"), S("ab12345678901234567890"));
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S(""), S("ab"));
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345"), S("ab12345"));
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("1234567890"), S("ab1234567890"));
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 2, 4, S("12345678901234567890"), S("ab12345678901234567890"));
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S(""), S("abcde"));
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345"), S("abcd12345e"));
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("1234567890"), S("abcd1234567890e"));
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 0, S("12345678901234567890"), S("abcd12345678901234567890e"));
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S(""), S("abcd"));
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345"), S("abcd12345"));
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("1234567890"), S("abcd1234567890"));
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 1, S("12345678901234567890"), S("abcd12345678901234567890"));
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S(""), S("abcd"));
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345"), S("abcd12345"));
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("1234567890"), S("abcd1234567890"));
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 4, 2, S("12345678901234567890"), S("abcd12345678901234567890"));
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S(""), S("abcde"));
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345"), S("abcde12345"));
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("1234567890"), S("abcde1234567890"));
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 0, S("12345678901234567890"), S("abcde12345678901234567890"));
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S(""), S("abcde"));
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345"), S("abcde12345"));
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("1234567890"), S("abcde1234567890"));
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 5, 1, S("12345678901234567890"), S("abcde12345678901234567890"));
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1509dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test1()
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S(""), S("can't happen"));
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345"), S("can't happen"));
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("1234567890"), S("can't happen"));
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcde"), 6, 0, S("12345678901234567890"), S("can't happen"));
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S(""), S("abcdefghij"));
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345"), S("12345abcdefghij"));
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("1234567890"), S("1234567890abcdefghij"));
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 0, S("12345678901234567890"), S("12345678901234567890abcdefghij"));
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S(""), S("bcdefghij"));
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345"), S("12345bcdefghij"));
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("1234567890"), S("1234567890bcdefghij"));
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 1, S("12345678901234567890"), S("12345678901234567890bcdefghij"));
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S(""), S("fghij"));
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345"), S("12345fghij"));
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("1234567890"), S("1234567890fghij"));
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 5, S("12345678901234567890"), S("12345678901234567890fghij"));
169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S(""), S("j"));
170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345"), S("12345j"));
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("1234567890"), S("1234567890j"));
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 9, S("12345678901234567890"), S("12345678901234567890j"));
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S(""), S(""));
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345"), S("12345"));
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("1234567890"), S("1234567890"));
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 10, S("12345678901234567890"), S("12345678901234567890"));
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S(""), S(""));
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345"), S("12345"));
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("1234567890"), S("1234567890"));
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 0, 11, S("12345678901234567890"), S("12345678901234567890"));
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S(""), S("abcdefghij"));
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345"), S("a12345bcdefghij"));
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("1234567890"), S("a1234567890bcdefghij"));
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 0, S("12345678901234567890"), S("a12345678901234567890bcdefghij"));
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S(""), S("acdefghij"));
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345"), S("a12345cdefghij"));
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("1234567890"), S("a1234567890cdefghij"));
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 1, S("12345678901234567890"), S("a12345678901234567890cdefghij"));
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S(""), S("afghij"));
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345"), S("a12345fghij"));
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("1234567890"), S("a1234567890fghij"));
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 4, S("12345678901234567890"), S("a12345678901234567890fghij"));
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S(""), S("aj"));
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345"), S("a12345j"));
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("1234567890"), S("a1234567890j"));
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 8, S("12345678901234567890"), S("a12345678901234567890j"));
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S(""), S("a"));
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345"), S("a12345"));
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("1234567890"), S("a1234567890"));
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 9, S("12345678901234567890"), S("a12345678901234567890"));
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S(""), S("a"));
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345"), S("a12345"));
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("1234567890"), S("a1234567890"));
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 1, 10, S("12345678901234567890"), S("a12345678901234567890"));
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S(""), S("abcdefghij"));
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345"), S("abcde12345fghij"));
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("1234567890"), S("abcde1234567890fghij"));
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 0, S("12345678901234567890"), S("abcde12345678901234567890fghij"));
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S(""), S("abcdeghij"));
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345"), S("abcde12345ghij"));
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("1234567890"), S("abcde1234567890ghij"));
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 1, S("12345678901234567890"), S("abcde12345678901234567890ghij"));
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S(""), S("abcdehij"));
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345"), S("abcde12345hij"));
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("1234567890"), S("abcde1234567890hij"));
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 2, S("12345678901234567890"), S("abcde12345678901234567890hij"));
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S(""), S("abcdej"));
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345"), S("abcde12345j"));
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("1234567890"), S("abcde1234567890j"));
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 4, S("12345678901234567890"), S("abcde12345678901234567890j"));
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S(""), S("abcde"));
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345"), S("abcde12345"));
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("1234567890"), S("abcde1234567890"));
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 5, S("12345678901234567890"), S("abcde12345678901234567890"));
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S(""), S("abcde"));
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345"), S("abcde12345"));
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("1234567890"), S("abcde1234567890"));
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 5, 6, S("12345678901234567890"), S("abcde12345678901234567890"));
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S(""), S("abcdefghij"));
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345"), S("abcdefghi12345j"));
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("1234567890"), S("abcdefghi1234567890j"));
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 0, S("12345678901234567890"), S("abcdefghi12345678901234567890j"));
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S(""), S("abcdefghi"));
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345"), S("abcdefghi12345"));
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("1234567890"), S("abcdefghi1234567890"));
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 1, S("12345678901234567890"), S("abcdefghi12345678901234567890"));
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S(""), S("abcdefghi"));
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345"), S("abcdefghi12345"));
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("1234567890"), S("abcdefghi1234567890"));
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 9, 2, S("12345678901234567890"), S("abcdefghi12345678901234567890"));
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S(""), S("abcdefghij"));
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345"), S("abcdefghij12345"));
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("1234567890"), S("abcdefghij1234567890"));
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 0, S("12345678901234567890"), S("abcdefghij12345678901234567890"));
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S(""), S("abcdefghij"));
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345"), S("abcdefghij12345"));
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("1234567890"), S("abcdefghij1234567890"));
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 10, 1, S("12345678901234567890"), S("abcdefghij12345678901234567890"));
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S(""), S("can't happen"));
250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345"), S("can't happen"));
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("1234567890"), S("can't happen"));
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghij"), 11, 0, S("12345678901234567890"), S("can't happen"));
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2559dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnanttemplate <class S>
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid test2()
257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S(""), S("abcdefghijklmnopqrst"));
259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345"), S("12345abcdefghijklmnopqrst"));
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("1234567890"), S("1234567890abcdefghijklmnopqrst"));
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 0, S("12345678901234567890"), S("12345678901234567890abcdefghijklmnopqrst"));
262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S(""), S("bcdefghijklmnopqrst"));
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345"), S("12345bcdefghijklmnopqrst"));
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("1234567890"), S("1234567890bcdefghijklmnopqrst"));
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 1, S("12345678901234567890"), S("12345678901234567890bcdefghijklmnopqrst"));
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S(""), S("klmnopqrst"));
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345"), S("12345klmnopqrst"));
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("1234567890"), S("1234567890klmnopqrst"));
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 10, S("12345678901234567890"), S("12345678901234567890klmnopqrst"));
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S(""), S("t"));
271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345"), S("12345t"));
272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("1234567890"), S("1234567890t"));
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 19, S("12345678901234567890"), S("12345678901234567890t"));
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S(""), S(""));
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345"), S("12345"));
276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("1234567890"), S("1234567890"));
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 20, S("12345678901234567890"), S("12345678901234567890"));
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S(""), S(""));
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345"), S("12345"));
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("1234567890"), S("1234567890"));
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 0, 21, S("12345678901234567890"), S("12345678901234567890"));
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S(""), S("abcdefghijklmnopqrst"));
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345"), S("a12345bcdefghijklmnopqrst"));
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("1234567890"), S("a1234567890bcdefghijklmnopqrst"));
285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 0, S("12345678901234567890"), S("a12345678901234567890bcdefghijklmnopqrst"));
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S(""), S("acdefghijklmnopqrst"));
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345"), S("a12345cdefghijklmnopqrst"));
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("1234567890"), S("a1234567890cdefghijklmnopqrst"));
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 1, S("12345678901234567890"), S("a12345678901234567890cdefghijklmnopqrst"));
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S(""), S("aklmnopqrst"));
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345"), S("a12345klmnopqrst"));
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("1234567890"), S("a1234567890klmnopqrst"));
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 9, S("12345678901234567890"), S("a12345678901234567890klmnopqrst"));
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S(""), S("at"));
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345"), S("a12345t"));
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("1234567890"), S("a1234567890t"));
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 18, S("12345678901234567890"), S("a12345678901234567890t"));
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S(""), S("a"));
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345"), S("a12345"));
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("1234567890"), S("a1234567890"));
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 19, S("12345678901234567890"), S("a12345678901234567890"));
302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S(""), S("a"));
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345"), S("a12345"));
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("1234567890"), S("a1234567890"));
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 1, 20, S("12345678901234567890"), S("a12345678901234567890"));
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S(""), S("abcdefghijklmnopqrst"));
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345"), S("abcdefghij12345klmnopqrst"));
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("1234567890"), S("abcdefghij1234567890klmnopqrst"));
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 0, S("12345678901234567890"), S("abcdefghij12345678901234567890klmnopqrst"));
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S(""), S("abcdefghijlmnopqrst"));
311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345"), S("abcdefghij12345lmnopqrst"));
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("1234567890"), S("abcdefghij1234567890lmnopqrst"));
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 1, S("12345678901234567890"), S("abcdefghij12345678901234567890lmnopqrst"));
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S(""), S("abcdefghijpqrst"));
315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345"), S("abcdefghij12345pqrst"));
316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("1234567890"), S("abcdefghij1234567890pqrst"));
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 5, S("12345678901234567890"), S("abcdefghij12345678901234567890pqrst"));
318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S(""), S("abcdefghijt"));
319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345"), S("abcdefghij12345t"));
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("1234567890"), S("abcdefghij1234567890t"));
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 9, S("12345678901234567890"), S("abcdefghij12345678901234567890t"));
322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S(""), S("abcdefghij"));
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345"), S("abcdefghij12345"));
324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("1234567890"), S("abcdefghij1234567890"));
325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 10, S("12345678901234567890"), S("abcdefghij12345678901234567890"));
326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S(""), S("abcdefghij"));
327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345"), S("abcdefghij12345"));
328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("1234567890"), S("abcdefghij1234567890"));
329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 10, 11, S("12345678901234567890"), S("abcdefghij12345678901234567890"));
330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S(""), S("abcdefghijklmnopqrst"));
331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345"), S("abcdefghijklmnopqrs12345t"));
332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("1234567890"), S("abcdefghijklmnopqrs1234567890t"));
333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 0, S("12345678901234567890"), S("abcdefghijklmnopqrs12345678901234567890t"));
334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S(""), S("abcdefghijklmnopqrs"));
335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345"), S("abcdefghijklmnopqrs12345"));
336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("1234567890"), S("abcdefghijklmnopqrs1234567890"));
337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 1, S("12345678901234567890"), S("abcdefghijklmnopqrs12345678901234567890"));
338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S(""), S("abcdefghijklmnopqrs"));
339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345"), S("abcdefghijklmnopqrs12345"));
340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("1234567890"), S("abcdefghijklmnopqrs1234567890"));
341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 19, 2, S("12345678901234567890"), S("abcdefghijklmnopqrs12345678901234567890"));
342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S(""), S("abcdefghijklmnopqrst"));
343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345"), S("abcdefghijklmnopqrst12345"));
344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 0, S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S(""), S("abcdefghijklmnopqrst"));
347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345"), S("abcdefghijklmnopqrst12345"));
348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("1234567890"), S("abcdefghijklmnopqrst1234567890"));
349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 20, 1, S("12345678901234567890"), S("abcdefghijklmnopqrst12345678901234567890"));
350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S(""), S("can't happen"));
351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345"), S("can't happen"));
352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("1234567890"), S("can't happen"));
353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test(S("abcdefghijklmnopqrst"), 21, 0, S("12345678901234567890"), S("can't happen"));
354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3589dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    {
3599dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    typedef std::string S;
3609dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test0<S>();
3619dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test1<S>();
3629dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test2<S>();
3639dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    }
3649dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant#if __cplusplus >= 201103L
3659dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    {
3669dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
3679dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test0<S>();
3689dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test1<S>();
3699dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    test2<S>();
3709dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant    }
3719dcdcdee2582575dd4a2e5857b9f32735763f9c7Howard Hinnant#endif
372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
373