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