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