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