]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/std/strings/basic.string/string.ops/string_compare/size_size_pointer_size.pass.cpp
Vendor import of libc++ trunk r290819:
[FreeBSD/FreeBSD.git] / test / std / strings / basic.string / string.ops / string_compare / size_size_pointer_size.pass.cpp
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // <string>
11
12 // int compare(size_type pos, size_type n1, const charT *s, size_type n2) const;
13
14 #include <string>
15 #include <stdexcept>
16 #include <cassert>
17
18 #include "min_allocator.h"
19
20 #include "test_macros.h"
21
22 int sign(int x)
23 {
24     if (x == 0)
25         return 0;
26     if (x < 0)
27         return -1;
28     return 1;
29 }
30
31 template <class S>
32 void
33 test(const S& s, typename S::size_type pos, typename S::size_type n1,
34      const typename S::value_type* str, typename S::size_type n2, int x)
35 {
36     if (pos <= s.size())
37         assert(sign(s.compare(pos, n1, str, n2)) == sign(x));
38 #ifndef TEST_HAS_NO_EXCEPTIONS
39     else
40     {
41         try
42         {
43             s.compare(pos, n1, str, n2);
44             assert(false);
45         }
46         catch (std::out_of_range&)
47         {
48             assert(pos > s.size());
49         }
50     }
51 #endif
52 }
53
54 template <class S>
55 void test0()
56 {
57     test(S(""), 0, 0, "", 0, 0);
58     test(S(""), 0, 0, "abcde", 0, 0);
59     test(S(""), 0, 0, "abcde", 1, -1);
60     test(S(""), 0, 0, "abcde", 2, -2);
61     test(S(""), 0, 0, "abcde", 4, -4);
62     test(S(""), 0, 0, "abcde", 5, -5);
63     test(S(""), 0, 0, "abcdefghij", 0, 0);
64     test(S(""), 0, 0, "abcdefghij", 1, -1);
65     test(S(""), 0, 0, "abcdefghij", 5, -5);
66     test(S(""), 0, 0, "abcdefghij", 9, -9);
67     test(S(""), 0, 0, "abcdefghij", 10, -10);
68     test(S(""), 0, 0, "abcdefghijklmnopqrst", 0, 0);
69     test(S(""), 0, 0, "abcdefghijklmnopqrst", 1, -1);
70     test(S(""), 0, 0, "abcdefghijklmnopqrst", 10, -10);
71     test(S(""), 0, 0, "abcdefghijklmnopqrst", 19, -19);
72     test(S(""), 0, 0, "abcdefghijklmnopqrst", 20, -20);
73     test(S(""), 0, 1, "", 0, 0);
74     test(S(""), 0, 1, "abcde", 0, 0);
75     test(S(""), 0, 1, "abcde", 1, -1);
76     test(S(""), 0, 1, "abcde", 2, -2);
77     test(S(""), 0, 1, "abcde", 4, -4);
78     test(S(""), 0, 1, "abcde", 5, -5);
79     test(S(""), 0, 1, "abcdefghij", 0, 0);
80     test(S(""), 0, 1, "abcdefghij", 1, -1);
81     test(S(""), 0, 1, "abcdefghij", 5, -5);
82     test(S(""), 0, 1, "abcdefghij", 9, -9);
83     test(S(""), 0, 1, "abcdefghij", 10, -10);
84     test(S(""), 0, 1, "abcdefghijklmnopqrst", 0, 0);
85     test(S(""), 0, 1, "abcdefghijklmnopqrst", 1, -1);
86     test(S(""), 0, 1, "abcdefghijklmnopqrst", 10, -10);
87     test(S(""), 0, 1, "abcdefghijklmnopqrst", 19, -19);
88     test(S(""), 0, 1, "abcdefghijklmnopqrst", 20, -20);
89     test(S(""), 1, 0, "", 0, 0);
90     test(S(""), 1, 0, "abcde", 0, 0);
91     test(S(""), 1, 0, "abcde", 1, 0);
92     test(S(""), 1, 0, "abcde", 2, 0);
93     test(S(""), 1, 0, "abcde", 4, 0);
94     test(S(""), 1, 0, "abcde", 5, 0);
95     test(S(""), 1, 0, "abcdefghij", 0, 0);
96     test(S(""), 1, 0, "abcdefghij", 1, 0);
97     test(S(""), 1, 0, "abcdefghij", 5, 0);
98     test(S(""), 1, 0, "abcdefghij", 9, 0);
99     test(S(""), 1, 0, "abcdefghij", 10, 0);
100     test(S(""), 1, 0, "abcdefghijklmnopqrst", 0, 0);
101     test(S(""), 1, 0, "abcdefghijklmnopqrst", 1, 0);
102     test(S(""), 1, 0, "abcdefghijklmnopqrst", 10, 0);
103     test(S(""), 1, 0, "abcdefghijklmnopqrst", 19, 0);
104     test(S(""), 1, 0, "abcdefghijklmnopqrst", 20, 0);
105     test(S("abcde"), 0, 0, "", 0, 0);
106     test(S("abcde"), 0, 0, "abcde", 0, 0);
107     test(S("abcde"), 0, 0, "abcde", 1, -1);
108     test(S("abcde"), 0, 0, "abcde", 2, -2);
109     test(S("abcde"), 0, 0, "abcde", 4, -4);
110     test(S("abcde"), 0, 0, "abcde", 5, -5);
111     test(S("abcde"), 0, 0, "abcdefghij", 0, 0);
112     test(S("abcde"), 0, 0, "abcdefghij", 1, -1);
113     test(S("abcde"), 0, 0, "abcdefghij", 5, -5);
114     test(S("abcde"), 0, 0, "abcdefghij", 9, -9);
115     test(S("abcde"), 0, 0, "abcdefghij", 10, -10);
116     test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 0, 0);
117     test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 1, -1);
118     test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 10, -10);
119     test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 19, -19);
120     test(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 20, -20);
121     test(S("abcde"), 0, 1, "", 0, 1);
122     test(S("abcde"), 0, 1, "abcde", 0, 1);
123     test(S("abcde"), 0, 1, "abcde", 1, 0);
124     test(S("abcde"), 0, 1, "abcde", 2, -1);
125     test(S("abcde"), 0, 1, "abcde", 4, -3);
126     test(S("abcde"), 0, 1, "abcde", 5, -4);
127     test(S("abcde"), 0, 1, "abcdefghij", 0, 1);
128     test(S("abcde"), 0, 1, "abcdefghij", 1, 0);
129     test(S("abcde"), 0, 1, "abcdefghij", 5, -4);
130     test(S("abcde"), 0, 1, "abcdefghij", 9, -8);
131     test(S("abcde"), 0, 1, "abcdefghij", 10, -9);
132     test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 0, 1);
133     test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 1, 0);
134     test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 10, -9);
135     test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 19, -18);
136     test(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 20, -19);
137     test(S("abcde"), 0, 2, "", 0, 2);
138     test(S("abcde"), 0, 2, "abcde", 0, 2);
139     test(S("abcde"), 0, 2, "abcde", 1, 1);
140     test(S("abcde"), 0, 2, "abcde", 2, 0);
141     test(S("abcde"), 0, 2, "abcde", 4, -2);
142     test(S("abcde"), 0, 2, "abcde", 5, -3);
143     test(S("abcde"), 0, 2, "abcdefghij", 0, 2);
144     test(S("abcde"), 0, 2, "abcdefghij", 1, 1);
145     test(S("abcde"), 0, 2, "abcdefghij", 5, -3);
146     test(S("abcde"), 0, 2, "abcdefghij", 9, -7);
147     test(S("abcde"), 0, 2, "abcdefghij", 10, -8);
148     test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 0, 2);
149     test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 1, 1);
150     test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 10, -8);
151     test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 19, -17);
152     test(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 20, -18);
153     test(S("abcde"), 0, 4, "", 0, 4);
154     test(S("abcde"), 0, 4, "abcde", 0, 4);
155     test(S("abcde"), 0, 4, "abcde", 1, 3);
156     test(S("abcde"), 0, 4, "abcde", 2, 2);
157 }
158
159 template <class S>
160 void test1()
161 {
162     test(S("abcde"), 0, 4, "abcde", 4, 0);
163     test(S("abcde"), 0, 4, "abcde", 5, -1);
164     test(S("abcde"), 0, 4, "abcdefghij", 0, 4);
165     test(S("abcde"), 0, 4, "abcdefghij", 1, 3);
166     test(S("abcde"), 0, 4, "abcdefghij", 5, -1);
167     test(S("abcde"), 0, 4, "abcdefghij", 9, -5);
168     test(S("abcde"), 0, 4, "abcdefghij", 10, -6);
169     test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 0, 4);
170     test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 1, 3);
171     test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 10, -6);
172     test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 19, -15);
173     test(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 20, -16);
174     test(S("abcde"), 0, 5, "", 0, 5);
175     test(S("abcde"), 0, 5, "abcde", 0, 5);
176     test(S("abcde"), 0, 5, "abcde", 1, 4);
177     test(S("abcde"), 0, 5, "abcde", 2, 3);
178     test(S("abcde"), 0, 5, "abcde", 4, 1);
179     test(S("abcde"), 0, 5, "abcde", 5, 0);
180     test(S("abcde"), 0, 5, "abcdefghij", 0, 5);
181     test(S("abcde"), 0, 5, "abcdefghij", 1, 4);
182     test(S("abcde"), 0, 5, "abcdefghij", 5, 0);
183     test(S("abcde"), 0, 5, "abcdefghij", 9, -4);
184     test(S("abcde"), 0, 5, "abcdefghij", 10, -5);
185     test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 0, 5);
186     test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 1, 4);
187     test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 10, -5);
188     test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 19, -14);
189     test(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 20, -15);
190     test(S("abcde"), 0, 6, "", 0, 5);
191     test(S("abcde"), 0, 6, "abcde", 0, 5);
192     test(S("abcde"), 0, 6, "abcde", 1, 4);
193     test(S("abcde"), 0, 6, "abcde", 2, 3);
194     test(S("abcde"), 0, 6, "abcde", 4, 1);
195     test(S("abcde"), 0, 6, "abcde", 5, 0);
196     test(S("abcde"), 0, 6, "abcdefghij", 0, 5);
197     test(S("abcde"), 0, 6, "abcdefghij", 1, 4);
198     test(S("abcde"), 0, 6, "abcdefghij", 5, 0);
199     test(S("abcde"), 0, 6, "abcdefghij", 9, -4);
200     test(S("abcde"), 0, 6, "abcdefghij", 10, -5);
201     test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 0, 5);
202     test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 1, 4);
203     test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 10, -5);
204     test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 19, -14);
205     test(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 20, -15);
206     test(S("abcde"), 1, 0, "", 0, 0);
207     test(S("abcde"), 1, 0, "abcde", 0, 0);
208     test(S("abcde"), 1, 0, "abcde", 1, -1);
209     test(S("abcde"), 1, 0, "abcde", 2, -2);
210     test(S("abcde"), 1, 0, "abcde", 4, -4);
211     test(S("abcde"), 1, 0, "abcde", 5, -5);
212     test(S("abcde"), 1, 0, "abcdefghij", 0, 0);
213     test(S("abcde"), 1, 0, "abcdefghij", 1, -1);
214     test(S("abcde"), 1, 0, "abcdefghij", 5, -5);
215     test(S("abcde"), 1, 0, "abcdefghij", 9, -9);
216     test(S("abcde"), 1, 0, "abcdefghij", 10, -10);
217     test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 0, 0);
218     test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 1, -1);
219     test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 10, -10);
220     test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 19, -19);
221     test(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 20, -20);
222     test(S("abcde"), 1, 1, "", 0, 1);
223     test(S("abcde"), 1, 1, "abcde", 0, 1);
224     test(S("abcde"), 1, 1, "abcde", 1, 1);
225     test(S("abcde"), 1, 1, "abcde", 2, 1);
226     test(S("abcde"), 1, 1, "abcde", 4, 1);
227     test(S("abcde"), 1, 1, "abcde", 5, 1);
228     test(S("abcde"), 1, 1, "abcdefghij", 0, 1);
229     test(S("abcde"), 1, 1, "abcdefghij", 1, 1);
230     test(S("abcde"), 1, 1, "abcdefghij", 5, 1);
231     test(S("abcde"), 1, 1, "abcdefghij", 9, 1);
232     test(S("abcde"), 1, 1, "abcdefghij", 10, 1);
233     test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 0, 1);
234     test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 1, 1);
235     test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 10, 1);
236     test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 19, 1);
237     test(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 20, 1);
238     test(S("abcde"), 1, 2, "", 0, 2);
239     test(S("abcde"), 1, 2, "abcde", 0, 2);
240     test(S("abcde"), 1, 2, "abcde", 1, 1);
241     test(S("abcde"), 1, 2, "abcde", 2, 1);
242     test(S("abcde"), 1, 2, "abcde", 4, 1);
243     test(S("abcde"), 1, 2, "abcde", 5, 1);
244     test(S("abcde"), 1, 2, "abcdefghij", 0, 2);
245     test(S("abcde"), 1, 2, "abcdefghij", 1, 1);
246     test(S("abcde"), 1, 2, "abcdefghij", 5, 1);
247     test(S("abcde"), 1, 2, "abcdefghij", 9, 1);
248     test(S("abcde"), 1, 2, "abcdefghij", 10, 1);
249     test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 0, 2);
250     test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 1, 1);
251     test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 10, 1);
252     test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 19, 1);
253     test(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 20, 1);
254     test(S("abcde"), 1, 3, "", 0, 3);
255     test(S("abcde"), 1, 3, "abcde", 0, 3);
256     test(S("abcde"), 1, 3, "abcde", 1, 1);
257     test(S("abcde"), 1, 3, "abcde", 2, 1);
258     test(S("abcde"), 1, 3, "abcde", 4, 1);
259     test(S("abcde"), 1, 3, "abcde", 5, 1);
260     test(S("abcde"), 1, 3, "abcdefghij", 0, 3);
261     test(S("abcde"), 1, 3, "abcdefghij", 1, 1);
262 }
263
264 template <class S>
265 void test2()
266 {
267     test(S("abcde"), 1, 3, "abcdefghij", 5, 1);
268     test(S("abcde"), 1, 3, "abcdefghij", 9, 1);
269     test(S("abcde"), 1, 3, "abcdefghij", 10, 1);
270     test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 0, 3);
271     test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 1, 1);
272     test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 10, 1);
273     test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 19, 1);
274     test(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 20, 1);
275     test(S("abcde"), 1, 4, "", 0, 4);
276     test(S("abcde"), 1, 4, "abcde", 0, 4);
277     test(S("abcde"), 1, 4, "abcde", 1, 1);
278     test(S("abcde"), 1, 4, "abcde", 2, 1);
279     test(S("abcde"), 1, 4, "abcde", 4, 1);
280     test(S("abcde"), 1, 4, "abcde", 5, 1);
281     test(S("abcde"), 1, 4, "abcdefghij", 0, 4);
282     test(S("abcde"), 1, 4, "abcdefghij", 1, 1);
283     test(S("abcde"), 1, 4, "abcdefghij", 5, 1);
284     test(S("abcde"), 1, 4, "abcdefghij", 9, 1);
285     test(S("abcde"), 1, 4, "abcdefghij", 10, 1);
286     test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 0, 4);
287     test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 1, 1);
288     test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 10, 1);
289     test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 19, 1);
290     test(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 20, 1);
291     test(S("abcde"), 1, 5, "", 0, 4);
292     test(S("abcde"), 1, 5, "abcde", 0, 4);
293     test(S("abcde"), 1, 5, "abcde", 1, 1);
294     test(S("abcde"), 1, 5, "abcde", 2, 1);
295     test(S("abcde"), 1, 5, "abcde", 4, 1);
296     test(S("abcde"), 1, 5, "abcde", 5, 1);
297     test(S("abcde"), 1, 5, "abcdefghij", 0, 4);
298     test(S("abcde"), 1, 5, "abcdefghij", 1, 1);
299     test(S("abcde"), 1, 5, "abcdefghij", 5, 1);
300     test(S("abcde"), 1, 5, "abcdefghij", 9, 1);
301     test(S("abcde"), 1, 5, "abcdefghij", 10, 1);
302     test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 0, 4);
303     test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 1, 1);
304     test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 10, 1);
305     test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 19, 1);
306     test(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 20, 1);
307     test(S("abcde"), 2, 0, "", 0, 0);
308     test(S("abcde"), 2, 0, "abcde", 0, 0);
309     test(S("abcde"), 2, 0, "abcde", 1, -1);
310     test(S("abcde"), 2, 0, "abcde", 2, -2);
311     test(S("abcde"), 2, 0, "abcde", 4, -4);
312     test(S("abcde"), 2, 0, "abcde", 5, -5);
313     test(S("abcde"), 2, 0, "abcdefghij", 0, 0);
314     test(S("abcde"), 2, 0, "abcdefghij", 1, -1);
315     test(S("abcde"), 2, 0, "abcdefghij", 5, -5);
316     test(S("abcde"), 2, 0, "abcdefghij", 9, -9);
317     test(S("abcde"), 2, 0, "abcdefghij", 10, -10);
318     test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 0, 0);
319     test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 1, -1);
320     test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 10, -10);
321     test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 19, -19);
322     test(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 20, -20);
323     test(S("abcde"), 2, 1, "", 0, 1);
324     test(S("abcde"), 2, 1, "abcde", 0, 1);
325     test(S("abcde"), 2, 1, "abcde", 1, 2);
326     test(S("abcde"), 2, 1, "abcde", 2, 2);
327     test(S("abcde"), 2, 1, "abcde", 4, 2);
328     test(S("abcde"), 2, 1, "abcde", 5, 2);
329     test(S("abcde"), 2, 1, "abcdefghij", 0, 1);
330     test(S("abcde"), 2, 1, "abcdefghij", 1, 2);
331     test(S("abcde"), 2, 1, "abcdefghij", 5, 2);
332     test(S("abcde"), 2, 1, "abcdefghij", 9, 2);
333     test(S("abcde"), 2, 1, "abcdefghij", 10, 2);
334     test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 0, 1);
335     test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 1, 2);
336     test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 10, 2);
337     test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 19, 2);
338     test(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 20, 2);
339     test(S("abcde"), 2, 2, "", 0, 2);
340     test(S("abcde"), 2, 2, "abcde", 0, 2);
341     test(S("abcde"), 2, 2, "abcde", 1, 2);
342     test(S("abcde"), 2, 2, "abcde", 2, 2);
343     test(S("abcde"), 2, 2, "abcde", 4, 2);
344     test(S("abcde"), 2, 2, "abcde", 5, 2);
345     test(S("abcde"), 2, 2, "abcdefghij", 0, 2);
346     test(S("abcde"), 2, 2, "abcdefghij", 1, 2);
347     test(S("abcde"), 2, 2, "abcdefghij", 5, 2);
348     test(S("abcde"), 2, 2, "abcdefghij", 9, 2);
349     test(S("abcde"), 2, 2, "abcdefghij", 10, 2);
350     test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 0, 2);
351     test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 1, 2);
352     test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 10, 2);
353     test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 19, 2);
354     test(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 20, 2);
355     test(S("abcde"), 2, 3, "", 0, 3);
356     test(S("abcde"), 2, 3, "abcde", 0, 3);
357     test(S("abcde"), 2, 3, "abcde", 1, 2);
358     test(S("abcde"), 2, 3, "abcde", 2, 2);
359     test(S("abcde"), 2, 3, "abcde", 4, 2);
360     test(S("abcde"), 2, 3, "abcde", 5, 2);
361     test(S("abcde"), 2, 3, "abcdefghij", 0, 3);
362     test(S("abcde"), 2, 3, "abcdefghij", 1, 2);
363     test(S("abcde"), 2, 3, "abcdefghij", 5, 2);
364     test(S("abcde"), 2, 3, "abcdefghij", 9, 2);
365     test(S("abcde"), 2, 3, "abcdefghij", 10, 2);
366     test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 0, 3);
367 }
368
369 template <class S>
370 void test3()
371 {
372     test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 1, 2);
373     test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 10, 2);
374     test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 19, 2);
375     test(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 20, 2);
376     test(S("abcde"), 2, 4, "", 0, 3);
377     test(S("abcde"), 2, 4, "abcde", 0, 3);
378     test(S("abcde"), 2, 4, "abcde", 1, 2);
379     test(S("abcde"), 2, 4, "abcde", 2, 2);
380     test(S("abcde"), 2, 4, "abcde", 4, 2);
381     test(S("abcde"), 2, 4, "abcde", 5, 2);
382     test(S("abcde"), 2, 4, "abcdefghij", 0, 3);
383     test(S("abcde"), 2, 4, "abcdefghij", 1, 2);
384     test(S("abcde"), 2, 4, "abcdefghij", 5, 2);
385     test(S("abcde"), 2, 4, "abcdefghij", 9, 2);
386     test(S("abcde"), 2, 4, "abcdefghij", 10, 2);
387     test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 0, 3);
388     test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 1, 2);
389     test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 10, 2);
390     test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 19, 2);
391     test(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 20, 2);
392     test(S("abcde"), 4, 0, "", 0, 0);
393     test(S("abcde"), 4, 0, "abcde", 0, 0);
394     test(S("abcde"), 4, 0, "abcde", 1, -1);
395     test(S("abcde"), 4, 0, "abcde", 2, -2);
396     test(S("abcde"), 4, 0, "abcde", 4, -4);
397     test(S("abcde"), 4, 0, "abcde", 5, -5);
398     test(S("abcde"), 4, 0, "abcdefghij", 0, 0);
399     test(S("abcde"), 4, 0, "abcdefghij", 1, -1);
400     test(S("abcde"), 4, 0, "abcdefghij", 5, -5);
401     test(S("abcde"), 4, 0, "abcdefghij", 9, -9);
402     test(S("abcde"), 4, 0, "abcdefghij", 10, -10);
403     test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 0, 0);
404     test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 1, -1);
405     test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 10, -10);
406     test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 19, -19);
407     test(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 20, -20);
408     test(S("abcde"), 4, 1, "", 0, 1);
409     test(S("abcde"), 4, 1, "abcde", 0, 1);
410     test(S("abcde"), 4, 1, "abcde", 1, 4);
411     test(S("abcde"), 4, 1, "abcde", 2, 4);
412     test(S("abcde"), 4, 1, "abcde", 4, 4);
413     test(S("abcde"), 4, 1, "abcde", 5, 4);
414     test(S("abcde"), 4, 1, "abcdefghij", 0, 1);
415     test(S("abcde"), 4, 1, "abcdefghij", 1, 4);
416     test(S("abcde"), 4, 1, "abcdefghij", 5, 4);
417     test(S("abcde"), 4, 1, "abcdefghij", 9, 4);
418     test(S("abcde"), 4, 1, "abcdefghij", 10, 4);
419     test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 0, 1);
420     test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 1, 4);
421     test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 10, 4);
422     test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 19, 4);
423     test(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 20, 4);
424     test(S("abcde"), 4, 2, "", 0, 1);
425     test(S("abcde"), 4, 2, "abcde", 0, 1);
426     test(S("abcde"), 4, 2, "abcde", 1, 4);
427     test(S("abcde"), 4, 2, "abcde", 2, 4);
428     test(S("abcde"), 4, 2, "abcde", 4, 4);
429     test(S("abcde"), 4, 2, "abcde", 5, 4);
430     test(S("abcde"), 4, 2, "abcdefghij", 0, 1);
431     test(S("abcde"), 4, 2, "abcdefghij", 1, 4);
432     test(S("abcde"), 4, 2, "abcdefghij", 5, 4);
433     test(S("abcde"), 4, 2, "abcdefghij", 9, 4);
434     test(S("abcde"), 4, 2, "abcdefghij", 10, 4);
435     test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 0, 1);
436     test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 1, 4);
437     test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 10, 4);
438     test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 19, 4);
439     test(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 20, 4);
440     test(S("abcde"), 5, 0, "", 0, 0);
441     test(S("abcde"), 5, 0, "abcde", 0, 0);
442     test(S("abcde"), 5, 0, "abcde", 1, -1);
443     test(S("abcde"), 5, 0, "abcde", 2, -2);
444     test(S("abcde"), 5, 0, "abcde", 4, -4);
445     test(S("abcde"), 5, 0, "abcde", 5, -5);
446     test(S("abcde"), 5, 0, "abcdefghij", 0, 0);
447     test(S("abcde"), 5, 0, "abcdefghij", 1, -1);
448     test(S("abcde"), 5, 0, "abcdefghij", 5, -5);
449     test(S("abcde"), 5, 0, "abcdefghij", 9, -9);
450     test(S("abcde"), 5, 0, "abcdefghij", 10, -10);
451     test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 0, 0);
452     test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 1, -1);
453     test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 10, -10);
454     test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 19, -19);
455     test(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 20, -20);
456     test(S("abcde"), 5, 1, "", 0, 0);
457     test(S("abcde"), 5, 1, "abcde", 0, 0);
458     test(S("abcde"), 5, 1, "abcde", 1, -1);
459     test(S("abcde"), 5, 1, "abcde", 2, -2);
460     test(S("abcde"), 5, 1, "abcde", 4, -4);
461     test(S("abcde"), 5, 1, "abcde", 5, -5);
462     test(S("abcde"), 5, 1, "abcdefghij", 0, 0);
463     test(S("abcde"), 5, 1, "abcdefghij", 1, -1);
464     test(S("abcde"), 5, 1, "abcdefghij", 5, -5);
465     test(S("abcde"), 5, 1, "abcdefghij", 9, -9);
466     test(S("abcde"), 5, 1, "abcdefghij", 10, -10);
467     test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 0, 0);
468     test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 1, -1);
469     test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 10, -10);
470     test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 19, -19);
471     test(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 20, -20);
472 }
473
474 template <class S>
475 void test4()
476 {
477     test(S("abcde"), 6, 0, "", 0, 0);
478     test(S("abcde"), 6, 0, "abcde", 0, 0);
479     test(S("abcde"), 6, 0, "abcde", 1, 0);
480     test(S("abcde"), 6, 0, "abcde", 2, 0);
481     test(S("abcde"), 6, 0, "abcde", 4, 0);
482     test(S("abcde"), 6, 0, "abcde", 5, 0);
483     test(S("abcde"), 6, 0, "abcdefghij", 0, 0);
484     test(S("abcde"), 6, 0, "abcdefghij", 1, 0);
485     test(S("abcde"), 6, 0, "abcdefghij", 5, 0);
486     test(S("abcde"), 6, 0, "abcdefghij", 9, 0);
487     test(S("abcde"), 6, 0, "abcdefghij", 10, 0);
488     test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 0, 0);
489     test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 1, 0);
490     test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 10, 0);
491     test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 19, 0);
492     test(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 20, 0);
493     test(S("abcdefghij"), 0, 0, "", 0, 0);
494     test(S("abcdefghij"), 0, 0, "abcde", 0, 0);
495     test(S("abcdefghij"), 0, 0, "abcde", 1, -1);
496     test(S("abcdefghij"), 0, 0, "abcde", 2, -2);
497     test(S("abcdefghij"), 0, 0, "abcde", 4, -4);
498     test(S("abcdefghij"), 0, 0, "abcde", 5, -5);
499     test(S("abcdefghij"), 0, 0, "abcdefghij", 0, 0);
500     test(S("abcdefghij"), 0, 0, "abcdefghij", 1, -1);
501     test(S("abcdefghij"), 0, 0, "abcdefghij", 5, -5);
502     test(S("abcdefghij"), 0, 0, "abcdefghij", 9, -9);
503     test(S("abcdefghij"), 0, 0, "abcdefghij", 10, -10);
504     test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 0, 0);
505     test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 1, -1);
506     test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 10, -10);
507     test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 19, -19);
508     test(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 20, -20);
509     test(S("abcdefghij"), 0, 1, "", 0, 1);
510     test(S("abcdefghij"), 0, 1, "abcde", 0, 1);
511     test(S("abcdefghij"), 0, 1, "abcde", 1, 0);
512     test(S("abcdefghij"), 0, 1, "abcde", 2, -1);
513     test(S("abcdefghij"), 0, 1, "abcde", 4, -3);
514     test(S("abcdefghij"), 0, 1, "abcde", 5, -4);
515     test(S("abcdefghij"), 0, 1, "abcdefghij", 0, 1);
516     test(S("abcdefghij"), 0, 1, "abcdefghij", 1, 0);
517     test(S("abcdefghij"), 0, 1, "abcdefghij", 5, -4);
518     test(S("abcdefghij"), 0, 1, "abcdefghij", 9, -8);
519     test(S("abcdefghij"), 0, 1, "abcdefghij", 10, -9);
520     test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 0, 1);
521     test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 1, 0);
522     test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 10, -9);
523     test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 19, -18);
524     test(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 20, -19);
525     test(S("abcdefghij"), 0, 5, "", 0, 5);
526     test(S("abcdefghij"), 0, 5, "abcde", 0, 5);
527     test(S("abcdefghij"), 0, 5, "abcde", 1, 4);
528     test(S("abcdefghij"), 0, 5, "abcde", 2, 3);
529     test(S("abcdefghij"), 0, 5, "abcde", 4, 1);
530     test(S("abcdefghij"), 0, 5, "abcde", 5, 0);
531     test(S("abcdefghij"), 0, 5, "abcdefghij", 0, 5);
532     test(S("abcdefghij"), 0, 5, "abcdefghij", 1, 4);
533     test(S("abcdefghij"), 0, 5, "abcdefghij", 5, 0);
534     test(S("abcdefghij"), 0, 5, "abcdefghij", 9, -4);
535     test(S("abcdefghij"), 0, 5, "abcdefghij", 10, -5);
536     test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 0, 5);
537     test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 1, 4);
538     test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 10, -5);
539     test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 19, -14);
540     test(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 20, -15);
541     test(S("abcdefghij"), 0, 9, "", 0, 9);
542     test(S("abcdefghij"), 0, 9, "abcde", 0, 9);
543     test(S("abcdefghij"), 0, 9, "abcde", 1, 8);
544     test(S("abcdefghij"), 0, 9, "abcde", 2, 7);
545     test(S("abcdefghij"), 0, 9, "abcde", 4, 5);
546     test(S("abcdefghij"), 0, 9, "abcde", 5, 4);
547     test(S("abcdefghij"), 0, 9, "abcdefghij", 0, 9);
548     test(S("abcdefghij"), 0, 9, "abcdefghij", 1, 8);
549     test(S("abcdefghij"), 0, 9, "abcdefghij", 5, 4);
550     test(S("abcdefghij"), 0, 9, "abcdefghij", 9, 0);
551     test(S("abcdefghij"), 0, 9, "abcdefghij", 10, -1);
552     test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 0, 9);
553     test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 1, 8);
554     test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 10, -1);
555     test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 19, -10);
556     test(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 20, -11);
557     test(S("abcdefghij"), 0, 10, "", 0, 10);
558     test(S("abcdefghij"), 0, 10, "abcde", 0, 10);
559     test(S("abcdefghij"), 0, 10, "abcde", 1, 9);
560     test(S("abcdefghij"), 0, 10, "abcde", 2, 8);
561     test(S("abcdefghij"), 0, 10, "abcde", 4, 6);
562     test(S("abcdefghij"), 0, 10, "abcde", 5, 5);
563     test(S("abcdefghij"), 0, 10, "abcdefghij", 0, 10);
564     test(S("abcdefghij"), 0, 10, "abcdefghij", 1, 9);
565     test(S("abcdefghij"), 0, 10, "abcdefghij", 5, 5);
566     test(S("abcdefghij"), 0, 10, "abcdefghij", 9, 1);
567     test(S("abcdefghij"), 0, 10, "abcdefghij", 10, 0);
568     test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 0, 10);
569     test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 1, 9);
570     test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 10, 0);
571     test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 19, -9);
572     test(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 20, -10);
573     test(S("abcdefghij"), 0, 11, "", 0, 10);
574     test(S("abcdefghij"), 0, 11, "abcde", 0, 10);
575     test(S("abcdefghij"), 0, 11, "abcde", 1, 9);
576     test(S("abcdefghij"), 0, 11, "abcde", 2, 8);
577 }
578
579 template <class S>
580 void test5()
581 {
582     test(S("abcdefghij"), 0, 11, "abcde", 4, 6);
583     test(S("abcdefghij"), 0, 11, "abcde", 5, 5);
584     test(S("abcdefghij"), 0, 11, "abcdefghij", 0, 10);
585     test(S("abcdefghij"), 0, 11, "abcdefghij", 1, 9);
586     test(S("abcdefghij"), 0, 11, "abcdefghij", 5, 5);
587     test(S("abcdefghij"), 0, 11, "abcdefghij", 9, 1);
588     test(S("abcdefghij"), 0, 11, "abcdefghij", 10, 0);
589     test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 0, 10);
590     test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 1, 9);
591     test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 10, 0);
592     test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 19, -9);
593     test(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 20, -10);
594     test(S("abcdefghij"), 1, 0, "", 0, 0);
595     test(S("abcdefghij"), 1, 0, "abcde", 0, 0);
596     test(S("abcdefghij"), 1, 0, "abcde", 1, -1);
597     test(S("abcdefghij"), 1, 0, "abcde", 2, -2);
598     test(S("abcdefghij"), 1, 0, "abcde", 4, -4);
599     test(S("abcdefghij"), 1, 0, "abcde", 5, -5);
600     test(S("abcdefghij"), 1, 0, "abcdefghij", 0, 0);
601     test(S("abcdefghij"), 1, 0, "abcdefghij", 1, -1);
602     test(S("abcdefghij"), 1, 0, "abcdefghij", 5, -5);
603     test(S("abcdefghij"), 1, 0, "abcdefghij", 9, -9);
604     test(S("abcdefghij"), 1, 0, "abcdefghij", 10, -10);
605     test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 0, 0);
606     test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 1, -1);
607     test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 10, -10);
608     test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 19, -19);
609     test(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 20, -20);
610     test(S("abcdefghij"), 1, 1, "", 0, 1);
611     test(S("abcdefghij"), 1, 1, "abcde", 0, 1);
612     test(S("abcdefghij"), 1, 1, "abcde", 1, 1);
613     test(S("abcdefghij"), 1, 1, "abcde", 2, 1);
614     test(S("abcdefghij"), 1, 1, "abcde", 4, 1);
615     test(S("abcdefghij"), 1, 1, "abcde", 5, 1);
616     test(S("abcdefghij"), 1, 1, "abcdefghij", 0, 1);
617     test(S("abcdefghij"), 1, 1, "abcdefghij", 1, 1);
618     test(S("abcdefghij"), 1, 1, "abcdefghij", 5, 1);
619     test(S("abcdefghij"), 1, 1, "abcdefghij", 9, 1);
620     test(S("abcdefghij"), 1, 1, "abcdefghij", 10, 1);
621     test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 0, 1);
622     test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 1, 1);
623     test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 10, 1);
624     test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 19, 1);
625     test(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 20, 1);
626     test(S("abcdefghij"), 1, 4, "", 0, 4);
627     test(S("abcdefghij"), 1, 4, "abcde", 0, 4);
628     test(S("abcdefghij"), 1, 4, "abcde", 1, 1);
629     test(S("abcdefghij"), 1, 4, "abcde", 2, 1);
630     test(S("abcdefghij"), 1, 4, "abcde", 4, 1);
631     test(S("abcdefghij"), 1, 4, "abcde", 5, 1);
632     test(S("abcdefghij"), 1, 4, "abcdefghij", 0, 4);
633     test(S("abcdefghij"), 1, 4, "abcdefghij", 1, 1);
634     test(S("abcdefghij"), 1, 4, "abcdefghij", 5, 1);
635     test(S("abcdefghij"), 1, 4, "abcdefghij", 9, 1);
636     test(S("abcdefghij"), 1, 4, "abcdefghij", 10, 1);
637     test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 0, 4);
638     test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 1, 1);
639     test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 10, 1);
640     test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 19, 1);
641     test(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 20, 1);
642     test(S("abcdefghij"), 1, 8, "", 0, 8);
643     test(S("abcdefghij"), 1, 8, "abcde", 0, 8);
644     test(S("abcdefghij"), 1, 8, "abcde", 1, 1);
645     test(S("abcdefghij"), 1, 8, "abcde", 2, 1);
646     test(S("abcdefghij"), 1, 8, "abcde", 4, 1);
647     test(S("abcdefghij"), 1, 8, "abcde", 5, 1);
648     test(S("abcdefghij"), 1, 8, "abcdefghij", 0, 8);
649     test(S("abcdefghij"), 1, 8, "abcdefghij", 1, 1);
650     test(S("abcdefghij"), 1, 8, "abcdefghij", 5, 1);
651     test(S("abcdefghij"), 1, 8, "abcdefghij", 9, 1);
652     test(S("abcdefghij"), 1, 8, "abcdefghij", 10, 1);
653     test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 0, 8);
654     test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 1, 1);
655     test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 10, 1);
656     test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 19, 1);
657     test(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 20, 1);
658     test(S("abcdefghij"), 1, 9, "", 0, 9);
659     test(S("abcdefghij"), 1, 9, "abcde", 0, 9);
660     test(S("abcdefghij"), 1, 9, "abcde", 1, 1);
661     test(S("abcdefghij"), 1, 9, "abcde", 2, 1);
662     test(S("abcdefghij"), 1, 9, "abcde", 4, 1);
663     test(S("abcdefghij"), 1, 9, "abcde", 5, 1);
664     test(S("abcdefghij"), 1, 9, "abcdefghij", 0, 9);
665     test(S("abcdefghij"), 1, 9, "abcdefghij", 1, 1);
666     test(S("abcdefghij"), 1, 9, "abcdefghij", 5, 1);
667     test(S("abcdefghij"), 1, 9, "abcdefghij", 9, 1);
668     test(S("abcdefghij"), 1, 9, "abcdefghij", 10, 1);
669     test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 0, 9);
670     test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 1, 1);
671     test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 10, 1);
672     test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 19, 1);
673     test(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 20, 1);
674     test(S("abcdefghij"), 1, 10, "", 0, 9);
675     test(S("abcdefghij"), 1, 10, "abcde", 0, 9);
676     test(S("abcdefghij"), 1, 10, "abcde", 1, 1);
677     test(S("abcdefghij"), 1, 10, "abcde", 2, 1);
678     test(S("abcdefghij"), 1, 10, "abcde", 4, 1);
679     test(S("abcdefghij"), 1, 10, "abcde", 5, 1);
680     test(S("abcdefghij"), 1, 10, "abcdefghij", 0, 9);
681     test(S("abcdefghij"), 1, 10, "abcdefghij", 1, 1);
682 }
683
684 template <class S>
685 void test6()
686 {
687     test(S("abcdefghij"), 1, 10, "abcdefghij", 5, 1);
688     test(S("abcdefghij"), 1, 10, "abcdefghij", 9, 1);
689     test(S("abcdefghij"), 1, 10, "abcdefghij", 10, 1);
690     test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 0, 9);
691     test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 1, 1);
692     test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 10, 1);
693     test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 19, 1);
694     test(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 20, 1);
695     test(S("abcdefghij"), 5, 0, "", 0, 0);
696     test(S("abcdefghij"), 5, 0, "abcde", 0, 0);
697     test(S("abcdefghij"), 5, 0, "abcde", 1, -1);
698     test(S("abcdefghij"), 5, 0, "abcde", 2, -2);
699     test(S("abcdefghij"), 5, 0, "abcde", 4, -4);
700     test(S("abcdefghij"), 5, 0, "abcde", 5, -5);
701     test(S("abcdefghij"), 5, 0, "abcdefghij", 0, 0);
702     test(S("abcdefghij"), 5, 0, "abcdefghij", 1, -1);
703     test(S("abcdefghij"), 5, 0, "abcdefghij", 5, -5);
704     test(S("abcdefghij"), 5, 0, "abcdefghij", 9, -9);
705     test(S("abcdefghij"), 5, 0, "abcdefghij", 10, -10);
706     test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 0, 0);
707     test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 1, -1);
708     test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 10, -10);
709     test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 19, -19);
710     test(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 20, -20);
711     test(S("abcdefghij"), 5, 1, "", 0, 1);
712     test(S("abcdefghij"), 5, 1, "abcde", 0, 1);
713     test(S("abcdefghij"), 5, 1, "abcde", 1, 5);
714     test(S("abcdefghij"), 5, 1, "abcde", 2, 5);
715     test(S("abcdefghij"), 5, 1, "abcde", 4, 5);
716     test(S("abcdefghij"), 5, 1, "abcde", 5, 5);
717     test(S("abcdefghij"), 5, 1, "abcdefghij", 0, 1);
718     test(S("abcdefghij"), 5, 1, "abcdefghij", 1, 5);
719     test(S("abcdefghij"), 5, 1, "abcdefghij", 5, 5);
720     test(S("abcdefghij"), 5, 1, "abcdefghij", 9, 5);
721     test(S("abcdefghij"), 5, 1, "abcdefghij", 10, 5);
722     test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 0, 1);
723     test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 1, 5);
724     test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 10, 5);
725     test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 19, 5);
726     test(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 20, 5);
727     test(S("abcdefghij"), 5, 2, "", 0, 2);
728     test(S("abcdefghij"), 5, 2, "abcde", 0, 2);
729     test(S("abcdefghij"), 5, 2, "abcde", 1, 5);
730     test(S("abcdefghij"), 5, 2, "abcde", 2, 5);
731     test(S("abcdefghij"), 5, 2, "abcde", 4, 5);
732     test(S("abcdefghij"), 5, 2, "abcde", 5, 5);
733     test(S("abcdefghij"), 5, 2, "abcdefghij", 0, 2);
734     test(S("abcdefghij"), 5, 2, "abcdefghij", 1, 5);
735     test(S("abcdefghij"), 5, 2, "abcdefghij", 5, 5);
736     test(S("abcdefghij"), 5, 2, "abcdefghij", 9, 5);
737     test(S("abcdefghij"), 5, 2, "abcdefghij", 10, 5);
738     test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 0, 2);
739     test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 1, 5);
740     test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 10, 5);
741     test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 19, 5);
742     test(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 20, 5);
743     test(S("abcdefghij"), 5, 4, "", 0, 4);
744     test(S("abcdefghij"), 5, 4, "abcde", 0, 4);
745     test(S("abcdefghij"), 5, 4, "abcde", 1, 5);
746     test(S("abcdefghij"), 5, 4, "abcde", 2, 5);
747     test(S("abcdefghij"), 5, 4, "abcde", 4, 5);
748     test(S("abcdefghij"), 5, 4, "abcde", 5, 5);
749     test(S("abcdefghij"), 5, 4, "abcdefghij", 0, 4);
750     test(S("abcdefghij"), 5, 4, "abcdefghij", 1, 5);
751     test(S("abcdefghij"), 5, 4, "abcdefghij", 5, 5);
752     test(S("abcdefghij"), 5, 4, "abcdefghij", 9, 5);
753     test(S("abcdefghij"), 5, 4, "abcdefghij", 10, 5);
754     test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 0, 4);
755     test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 1, 5);
756     test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 10, 5);
757     test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 19, 5);
758     test(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 20, 5);
759     test(S("abcdefghij"), 5, 5, "", 0, 5);
760     test(S("abcdefghij"), 5, 5, "abcde", 0, 5);
761     test(S("abcdefghij"), 5, 5, "abcde", 1, 5);
762     test(S("abcdefghij"), 5, 5, "abcde", 2, 5);
763     test(S("abcdefghij"), 5, 5, "abcde", 4, 5);
764     test(S("abcdefghij"), 5, 5, "abcde", 5, 5);
765     test(S("abcdefghij"), 5, 5, "abcdefghij", 0, 5);
766     test(S("abcdefghij"), 5, 5, "abcdefghij", 1, 5);
767     test(S("abcdefghij"), 5, 5, "abcdefghij", 5, 5);
768     test(S("abcdefghij"), 5, 5, "abcdefghij", 9, 5);
769     test(S("abcdefghij"), 5, 5, "abcdefghij", 10, 5);
770     test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 0, 5);
771     test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 1, 5);
772     test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 10, 5);
773     test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 19, 5);
774     test(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 20, 5);
775     test(S("abcdefghij"), 5, 6, "", 0, 5);
776     test(S("abcdefghij"), 5, 6, "abcde", 0, 5);
777     test(S("abcdefghij"), 5, 6, "abcde", 1, 5);
778     test(S("abcdefghij"), 5, 6, "abcde", 2, 5);
779     test(S("abcdefghij"), 5, 6, "abcde", 4, 5);
780     test(S("abcdefghij"), 5, 6, "abcde", 5, 5);
781     test(S("abcdefghij"), 5, 6, "abcdefghij", 0, 5);
782     test(S("abcdefghij"), 5, 6, "abcdefghij", 1, 5);
783     test(S("abcdefghij"), 5, 6, "abcdefghij", 5, 5);
784     test(S("abcdefghij"), 5, 6, "abcdefghij", 9, 5);
785     test(S("abcdefghij"), 5, 6, "abcdefghij", 10, 5);
786     test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 0, 5);
787 }
788
789 template <class S>
790 void test7()
791 {
792     test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 1, 5);
793     test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 10, 5);
794     test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 19, 5);
795     test(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 20, 5);
796     test(S("abcdefghij"), 9, 0, "", 0, 0);
797     test(S("abcdefghij"), 9, 0, "abcde", 0, 0);
798     test(S("abcdefghij"), 9, 0, "abcde", 1, -1);
799     test(S("abcdefghij"), 9, 0, "abcde", 2, -2);
800     test(S("abcdefghij"), 9, 0, "abcde", 4, -4);
801     test(S("abcdefghij"), 9, 0, "abcde", 5, -5);
802     test(S("abcdefghij"), 9, 0, "abcdefghij", 0, 0);
803     test(S("abcdefghij"), 9, 0, "abcdefghij", 1, -1);
804     test(S("abcdefghij"), 9, 0, "abcdefghij", 5, -5);
805     test(S("abcdefghij"), 9, 0, "abcdefghij", 9, -9);
806     test(S("abcdefghij"), 9, 0, "abcdefghij", 10, -10);
807     test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 0, 0);
808     test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 1, -1);
809     test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 10, -10);
810     test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 19, -19);
811     test(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 20, -20);
812     test(S("abcdefghij"), 9, 1, "", 0, 1);
813     test(S("abcdefghij"), 9, 1, "abcde", 0, 1);
814     test(S("abcdefghij"), 9, 1, "abcde", 1, 9);
815     test(S("abcdefghij"), 9, 1, "abcde", 2, 9);
816     test(S("abcdefghij"), 9, 1, "abcde", 4, 9);
817     test(S("abcdefghij"), 9, 1, "abcde", 5, 9);
818     test(S("abcdefghij"), 9, 1, "abcdefghij", 0, 1);
819     test(S("abcdefghij"), 9, 1, "abcdefghij", 1, 9);
820     test(S("abcdefghij"), 9, 1, "abcdefghij", 5, 9);
821     test(S("abcdefghij"), 9, 1, "abcdefghij", 9, 9);
822     test(S("abcdefghij"), 9, 1, "abcdefghij", 10, 9);
823     test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 0, 1);
824     test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 1, 9);
825     test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 10, 9);
826     test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 19, 9);
827     test(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 20, 9);
828     test(S("abcdefghij"), 9, 2, "", 0, 1);
829     test(S("abcdefghij"), 9, 2, "abcde", 0, 1);
830     test(S("abcdefghij"), 9, 2, "abcde", 1, 9);
831     test(S("abcdefghij"), 9, 2, "abcde", 2, 9);
832     test(S("abcdefghij"), 9, 2, "abcde", 4, 9);
833     test(S("abcdefghij"), 9, 2, "abcde", 5, 9);
834     test(S("abcdefghij"), 9, 2, "abcdefghij", 0, 1);
835     test(S("abcdefghij"), 9, 2, "abcdefghij", 1, 9);
836     test(S("abcdefghij"), 9, 2, "abcdefghij", 5, 9);
837     test(S("abcdefghij"), 9, 2, "abcdefghij", 9, 9);
838     test(S("abcdefghij"), 9, 2, "abcdefghij", 10, 9);
839     test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 0, 1);
840     test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 1, 9);
841     test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 10, 9);
842     test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 19, 9);
843     test(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 20, 9);
844     test(S("abcdefghij"), 10, 0, "", 0, 0);
845     test(S("abcdefghij"), 10, 0, "abcde", 0, 0);
846     test(S("abcdefghij"), 10, 0, "abcde", 1, -1);
847     test(S("abcdefghij"), 10, 0, "abcde", 2, -2);
848     test(S("abcdefghij"), 10, 0, "abcde", 4, -4);
849     test(S("abcdefghij"), 10, 0, "abcde", 5, -5);
850     test(S("abcdefghij"), 10, 0, "abcdefghij", 0, 0);
851     test(S("abcdefghij"), 10, 0, "abcdefghij", 1, -1);
852     test(S("abcdefghij"), 10, 0, "abcdefghij", 5, -5);
853     test(S("abcdefghij"), 10, 0, "abcdefghij", 9, -9);
854     test(S("abcdefghij"), 10, 0, "abcdefghij", 10, -10);
855     test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 0, 0);
856     test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 1, -1);
857     test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 10, -10);
858     test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 19, -19);
859     test(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 20, -20);
860     test(S("abcdefghij"), 10, 1, "", 0, 0);
861     test(S("abcdefghij"), 10, 1, "abcde", 0, 0);
862     test(S("abcdefghij"), 10, 1, "abcde", 1, -1);
863     test(S("abcdefghij"), 10, 1, "abcde", 2, -2);
864     test(S("abcdefghij"), 10, 1, "abcde", 4, -4);
865     test(S("abcdefghij"), 10, 1, "abcde", 5, -5);
866     test(S("abcdefghij"), 10, 1, "abcdefghij", 0, 0);
867     test(S("abcdefghij"), 10, 1, "abcdefghij", 1, -1);
868     test(S("abcdefghij"), 10, 1, "abcdefghij", 5, -5);
869     test(S("abcdefghij"), 10, 1, "abcdefghij", 9, -9);
870     test(S("abcdefghij"), 10, 1, "abcdefghij", 10, -10);
871     test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 0, 0);
872     test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 1, -1);
873     test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 10, -10);
874     test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 19, -19);
875     test(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 20, -20);
876     test(S("abcdefghij"), 11, 0, "", 0, 0);
877     test(S("abcdefghij"), 11, 0, "abcde", 0, 0);
878     test(S("abcdefghij"), 11, 0, "abcde", 1, 0);
879     test(S("abcdefghij"), 11, 0, "abcde", 2, 0);
880     test(S("abcdefghij"), 11, 0, "abcde", 4, 0);
881     test(S("abcdefghij"), 11, 0, "abcde", 5, 0);
882     test(S("abcdefghij"), 11, 0, "abcdefghij", 0, 0);
883     test(S("abcdefghij"), 11, 0, "abcdefghij", 1, 0);
884     test(S("abcdefghij"), 11, 0, "abcdefghij", 5, 0);
885     test(S("abcdefghij"), 11, 0, "abcdefghij", 9, 0);
886     test(S("abcdefghij"), 11, 0, "abcdefghij", 10, 0);
887     test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 0, 0);
888     test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 1, 0);
889     test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 10, 0);
890     test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 19, 0);
891     test(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 20, 0);
892 }
893
894 template <class S>
895 void test8()
896 {
897     test(S("abcdefghijklmnopqrst"), 0, 0, "", 0, 0);
898     test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 0, 0);
899     test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 1, -1);
900     test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 2, -2);
901     test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 4, -4);
902     test(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 5, -5);
903     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 0, 0);
904     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 1, -1);
905     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 5, -5);
906     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 9, -9);
907     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 10, -10);
908     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 0, 0);
909     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 1, -1);
910     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 10, -10);
911     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 19, -19);
912     test(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 20, -20);
913     test(S("abcdefghijklmnopqrst"), 0, 1, "", 0, 1);
914     test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 0, 1);
915     test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 1, 0);
916     test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 2, -1);
917     test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 4, -3);
918     test(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 5, -4);
919     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 0, 1);
920     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 1, 0);
921     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 5, -4);
922     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 9, -8);
923     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 10, -9);
924     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 0, 1);
925     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 1, 0);
926     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 10, -9);
927     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 19, -18);
928     test(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 20, -19);
929     test(S("abcdefghijklmnopqrst"), 0, 10, "", 0, 10);
930     test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 0, 10);
931     test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 1, 9);
932     test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 2, 8);
933     test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 4, 6);
934     test(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 5, 5);
935     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 0, 10);
936     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 1, 9);
937     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 5, 5);
938     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 9, 1);
939     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 10, 0);
940     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 0, 10);
941     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 1, 9);
942     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 10, 0);
943     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 19, -9);
944     test(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 20, -10);
945     test(S("abcdefghijklmnopqrst"), 0, 19, "", 0, 19);
946     test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 0, 19);
947     test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 1, 18);
948     test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 2, 17);
949     test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 4, 15);
950     test(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 5, 14);
951     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 0, 19);
952     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 1, 18);
953     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 5, 14);
954     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 9, 10);
955     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 10, 9);
956     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 0, 19);
957     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 1, 18);
958     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 10, 9);
959     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 19, 0);
960     test(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 20, -1);
961     test(S("abcdefghijklmnopqrst"), 0, 20, "", 0, 20);
962     test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 0, 20);
963     test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 1, 19);
964     test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 2, 18);
965     test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 4, 16);
966     test(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 5, 15);
967     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 0, 20);
968     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 1, 19);
969     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 5, 15);
970     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 9, 11);
971     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 10, 10);
972     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 0, 20);
973     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 1, 19);
974     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 10, 10);
975     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 19, 1);
976     test(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 20, 0);
977     test(S("abcdefghijklmnopqrst"), 0, 21, "", 0, 20);
978     test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 0, 20);
979     test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 1, 19);
980     test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 2, 18);
981     test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 4, 16);
982     test(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 5, 15);
983     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 0, 20);
984     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 1, 19);
985     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 5, 15);
986     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 9, 11);
987     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 10, 10);
988     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 0, 20);
989     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 1, 19);
990     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 10, 10);
991     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 19, 1);
992     test(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 20, 0);
993     test(S("abcdefghijklmnopqrst"), 1, 0, "", 0, 0);
994     test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 0, 0);
995     test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 1, -1);
996     test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 2, -2);
997 }
998
999 template <class S>
1000 void test9()
1001 {
1002     test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 4, -4);
1003     test(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 5, -5);
1004     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 0, 0);
1005     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 1, -1);
1006     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 5, -5);
1007     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 9, -9);
1008     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 10, -10);
1009     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 0, 0);
1010     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 1, -1);
1011     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 10, -10);
1012     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 19, -19);
1013     test(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 20, -20);
1014     test(S("abcdefghijklmnopqrst"), 1, 1, "", 0, 1);
1015     test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 0, 1);
1016     test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 1, 1);
1017     test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 2, 1);
1018     test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 4, 1);
1019     test(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 5, 1);
1020     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 0, 1);
1021     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 1, 1);
1022     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 5, 1);
1023     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 9, 1);
1024     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 10, 1);
1025     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 0, 1);
1026     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 1, 1);
1027     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 10, 1);
1028     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 19, 1);
1029     test(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 20, 1);
1030     test(S("abcdefghijklmnopqrst"), 1, 9, "", 0, 9);
1031     test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 0, 9);
1032     test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 1, 1);
1033     test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 2, 1);
1034     test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 4, 1);
1035     test(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 5, 1);
1036     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 0, 9);
1037     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 1, 1);
1038     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 5, 1);
1039     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 9, 1);
1040     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 10, 1);
1041     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 0, 9);
1042     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 1, 1);
1043     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 10, 1);
1044     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 19, 1);
1045     test(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 20, 1);
1046     test(S("abcdefghijklmnopqrst"), 1, 18, "", 0, 18);
1047     test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 0, 18);
1048     test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 1, 1);
1049     test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 2, 1);
1050     test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 4, 1);
1051     test(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 5, 1);
1052     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 0, 18);
1053     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 1, 1);
1054     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 5, 1);
1055     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 9, 1);
1056     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 10, 1);
1057     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 0, 18);
1058     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 1, 1);
1059     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 10, 1);
1060     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 19, 1);
1061     test(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 20, 1);
1062     test(S("abcdefghijklmnopqrst"), 1, 19, "", 0, 19);
1063     test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 0, 19);
1064     test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 1, 1);
1065     test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 2, 1);
1066     test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 4, 1);
1067     test(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 5, 1);
1068     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 0, 19);
1069     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 1, 1);
1070     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 5, 1);
1071     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 9, 1);
1072     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 10, 1);
1073     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 0, 19);
1074     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 1, 1);
1075     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 10, 1);
1076     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 19, 1);
1077     test(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 20, 1);
1078     test(S("abcdefghijklmnopqrst"), 1, 20, "", 0, 19);
1079     test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 0, 19);
1080     test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 1, 1);
1081     test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 2, 1);
1082     test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 4, 1);
1083     test(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 5, 1);
1084     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 0, 19);
1085     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 1, 1);
1086     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 5, 1);
1087     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 9, 1);
1088     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 10, 1);
1089     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 0, 19);
1090     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 1, 1);
1091     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 10, 1);
1092     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 19, 1);
1093     test(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 20, 1);
1094     test(S("abcdefghijklmnopqrst"), 10, 0, "", 0, 0);
1095     test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 0, 0);
1096     test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 1, -1);
1097     test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 2, -2);
1098     test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 4, -4);
1099     test(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 5, -5);
1100     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 0, 0);
1101     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 1, -1);
1102 }
1103
1104 template <class S>
1105 void test10()
1106 {
1107     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 5, -5);
1108     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 9, -9);
1109     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 10, -10);
1110     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 0, 0);
1111     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 1, -1);
1112     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 10, -10);
1113     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 19, -19);
1114     test(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 20, -20);
1115     test(S("abcdefghijklmnopqrst"), 10, 1, "", 0, 1);
1116     test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 0, 1);
1117     test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 1, 10);
1118     test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 2, 10);
1119     test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 4, 10);
1120     test(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 5, 10);
1121     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 0, 1);
1122     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 1, 10);
1123     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 5, 10);
1124     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 9, 10);
1125     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 10, 10);
1126     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 0, 1);
1127     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 1, 10);
1128     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 10, 10);
1129     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 19, 10);
1130     test(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 20, 10);
1131     test(S("abcdefghijklmnopqrst"), 10, 5, "", 0, 5);
1132     test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 0, 5);
1133     test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 1, 10);
1134     test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 2, 10);
1135     test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 4, 10);
1136     test(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 5, 10);
1137     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 0, 5);
1138     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 1, 10);
1139     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 5, 10);
1140     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 9, 10);
1141     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 10, 10);
1142     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 0, 5);
1143     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 1, 10);
1144     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 10, 10);
1145     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 19, 10);
1146     test(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 20, 10);
1147     test(S("abcdefghijklmnopqrst"), 10, 9, "", 0, 9);
1148     test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 0, 9);
1149     test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 1, 10);
1150     test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 2, 10);
1151     test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 4, 10);
1152     test(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 5, 10);
1153     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 0, 9);
1154     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 1, 10);
1155     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 5, 10);
1156     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 9, 10);
1157     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 10, 10);
1158     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 0, 9);
1159     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 1, 10);
1160     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 10, 10);
1161     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 19, 10);
1162     test(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 20, 10);
1163     test(S("abcdefghijklmnopqrst"), 10, 10, "", 0, 10);
1164     test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 0, 10);
1165     test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 1, 10);
1166     test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 2, 10);
1167     test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 4, 10);
1168     test(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 5, 10);
1169     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 0, 10);
1170     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 1, 10);
1171     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 5, 10);
1172     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 9, 10);
1173     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 10, 10);
1174     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 0, 10);
1175     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 1, 10);
1176     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 10, 10);
1177     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 19, 10);
1178     test(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 20, 10);
1179     test(S("abcdefghijklmnopqrst"), 10, 11, "", 0, 10);
1180     test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 0, 10);
1181     test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 1, 10);
1182     test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 2, 10);
1183     test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 4, 10);
1184     test(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 5, 10);
1185     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 0, 10);
1186     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 1, 10);
1187     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 5, 10);
1188     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 9, 10);
1189     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 10, 10);
1190     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 0, 10);
1191     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 1, 10);
1192     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 10, 10);
1193     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 19, 10);
1194     test(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 20, 10);
1195     test(S("abcdefghijklmnopqrst"), 19, 0, "", 0, 0);
1196     test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 0, 0);
1197     test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 1, -1);
1198     test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 2, -2);
1199     test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 4, -4);
1200     test(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 5, -5);
1201     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 0, 0);
1202     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 1, -1);
1203     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 5, -5);
1204     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 9, -9);
1205     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 10, -10);
1206     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 0, 0);
1207 }
1208
1209 template <class S>
1210 void test11()
1211 {
1212     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 1, -1);
1213     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 10, -10);
1214     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 19, -19);
1215     test(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 20, -20);
1216     test(S("abcdefghijklmnopqrst"), 19, 1, "", 0, 1);
1217     test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 0, 1);
1218     test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 1, 19);
1219     test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 2, 19);
1220     test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 4, 19);
1221     test(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 5, 19);
1222     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 0, 1);
1223     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 1, 19);
1224     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 5, 19);
1225     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 9, 19);
1226     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 10, 19);
1227     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 0, 1);
1228     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 1, 19);
1229     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 10, 19);
1230     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 19, 19);
1231     test(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 20, 19);
1232     test(S("abcdefghijklmnopqrst"), 19, 2, "", 0, 1);
1233     test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 0, 1);
1234     test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 1, 19);
1235     test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 2, 19);
1236     test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 4, 19);
1237     test(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 5, 19);
1238     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 0, 1);
1239     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 1, 19);
1240     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 5, 19);
1241     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 9, 19);
1242     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 10, 19);
1243     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 0, 1);
1244     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 1, 19);
1245     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 10, 19);
1246     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 19, 19);
1247     test(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 20, 19);
1248     test(S("abcdefghijklmnopqrst"), 20, 0, "", 0, 0);
1249     test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 0, 0);
1250     test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 1, -1);
1251     test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 2, -2);
1252     test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 4, -4);
1253     test(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 5, -5);
1254     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 0, 0);
1255     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 1, -1);
1256     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 5, -5);
1257     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 9, -9);
1258     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 10, -10);
1259     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 0, 0);
1260     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 1, -1);
1261     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 10, -10);
1262     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 19, -19);
1263     test(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 20, -20);
1264     test(S("abcdefghijklmnopqrst"), 20, 1, "", 0, 0);
1265     test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 0, 0);
1266     test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 1, -1);
1267     test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 2, -2);
1268     test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 4, -4);
1269     test(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 5, -5);
1270     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 0, 0);
1271     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 1, -1);
1272     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 5, -5);
1273     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 9, -9);
1274     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 10, -10);
1275     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 0, 0);
1276     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 1, -1);
1277     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 10, -10);
1278     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 19, -19);
1279     test(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 20, -20);
1280     test(S("abcdefghijklmnopqrst"), 21, 0, "", 0, 0);
1281     test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 0, 0);
1282     test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 1, 0);
1283     test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 2, 0);
1284     test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 4, 0);
1285     test(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 5, 0);
1286     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 0, 0);
1287     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 1, 0);
1288     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 5, 0);
1289     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 9, 0);
1290     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 10, 0);
1291     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 0, 0);
1292     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 1, 0);
1293     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 10, 0);
1294     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 19, 0);
1295     test(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 20, 0);
1296 }
1297
1298 int main()
1299 {
1300     {
1301     typedef std::string S;
1302     test0<S>();
1303     test1<S>();
1304     test2<S>();
1305     test3<S>();
1306     test4<S>();
1307     test5<S>();
1308     test6<S>();
1309     test7<S>();
1310     test8<S>();
1311     test9<S>();
1312     test10<S>();
1313     test11<S>();
1314     }
1315 #if TEST_STD_VER >= 11
1316     {
1317     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
1318     test0<S>();
1319     test1<S>();
1320     test2<S>();
1321     test3<S>();
1322     test4<S>();
1323     test5<S>();
1324     test6<S>();
1325     test7<S>();
1326     test8<S>();
1327     test9<S>();
1328     test10<S>();
1329     test11<S>();
1330     }
1331 #endif
1332 }