1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // <string>
10
11 // int compare(size_type pos1, size_type n1, const basic_string& str,
12 // size_type pos2, size_type n2=npos) const;
13 // the "=npos" was added in C++14
14
15 #include <string>
16 #include <stdexcept>
17 #include <cassert>
18
19 #include "min_allocator.h"
20
21 #include "test_macros.h"
22
sign(int x)23 int sign(int x)
24 {
25 if (x == 0)
26 return 0;
27 if (x < 0)
28 return -1;
29 return 1;
30 }
31
32 template <class S>
33 void
test(const S & s,typename S::size_type pos1,typename S::size_type n1,const S & str,typename S::size_type pos2,typename S::size_type n2,int x)34 test(const S& s, typename S::size_type pos1, typename S::size_type n1,
35 const S& str, typename S::size_type pos2, typename S::size_type n2, int x)
36 {
37 if (pos1 <= s.size() && pos2 <= str.size())
38 assert(sign(s.compare(pos1, n1, str, pos2, n2)) == sign(x));
39 #ifndef TEST_HAS_NO_EXCEPTIONS
40 else
41 {
42 try
43 {
44 TEST_IGNORE_NODISCARD s.compare(pos1, n1, str, pos2, n2);
45 assert(false);
46 }
47 catch (const std::out_of_range&)
48 {
49 assert(pos1 > s.size() || pos2 > str.size());
50 }
51 }
52 #endif
53 }
54
55 template <class S>
56 void
test_npos(const S & s,typename S::size_type pos1,typename S::size_type n1,const S & str,typename S::size_type pos2,int x)57 test_npos(const S& s, typename S::size_type pos1, typename S::size_type n1,
58 const S& str, typename S::size_type pos2, int x)
59 {
60 if (pos1 <= s.size() && pos2 <= str.size())
61 assert(sign(s.compare(pos1, n1, str, pos2)) == sign(x));
62 #ifndef TEST_HAS_NO_EXCEPTIONS
63 else
64 {
65 try
66 {
67 TEST_IGNORE_NODISCARD s.compare(pos1, n1, str, pos2);
68 assert(false);
69 }
70 catch (const std::out_of_range&)
71 {
72 assert(pos1 > s.size() || pos2 > str.size());
73 }
74 }
75 #endif
76 }
77
78 template <class S>
test0()79 void test0()
80 {
81 test(S(""), 0, 0, S(""), 0, 0, 0);
82 test(S(""), 0, 0, S(""), 0, 1, 0);
83 test(S(""), 0, 0, S(""), 1, 0, 0);
84 test(S(""), 0, 0, S("abcde"), 0, 0, 0);
85 test(S(""), 0, 0, S("abcde"), 0, 1, -1);
86 test(S(""), 0, 0, S("abcde"), 0, 2, -2);
87 test(S(""), 0, 0, S("abcde"), 0, 4, -4);
88 test(S(""), 0, 0, S("abcde"), 0, 5, -5);
89 test(S(""), 0, 0, S("abcde"), 0, 6, -5);
90 test(S(""), 0, 0, S("abcde"), 1, 0, 0);
91 test(S(""), 0, 0, S("abcde"), 1, 1, -1);
92 test(S(""), 0, 0, S("abcde"), 1, 2, -2);
93 test(S(""), 0, 0, S("abcde"), 1, 3, -3);
94 test(S(""), 0, 0, S("abcde"), 1, 4, -4);
95 test(S(""), 0, 0, S("abcde"), 1, 5, -4);
96 test(S(""), 0, 0, S("abcde"), 2, 0, 0);
97 test(S(""), 0, 0, S("abcde"), 2, 1, -1);
98 test(S(""), 0, 0, S("abcde"), 2, 2, -2);
99 test(S(""), 0, 0, S("abcde"), 2, 3, -3);
100 test(S(""), 0, 0, S("abcde"), 2, 4, -3);
101 test(S(""), 0, 0, S("abcde"), 4, 0, 0);
102 test(S(""), 0, 0, S("abcde"), 4, 1, -1);
103 test(S(""), 0, 0, S("abcde"), 4, 2, -1);
104 test(S(""), 0, 0, S("abcde"), 5, 0, 0);
105 test(S(""), 0, 0, S("abcde"), 5, 1, 0);
106 test(S(""), 0, 0, S("abcde"), 6, 0, 0);
107 test(S(""), 0, 0, S("abcdefghij"), 0, 0, 0);
108 test(S(""), 0, 0, S("abcdefghij"), 0, 1, -1);
109 test(S(""), 0, 0, S("abcdefghij"), 0, 5, -5);
110 test(S(""), 0, 0, S("abcdefghij"), 0, 9, -9);
111 test(S(""), 0, 0, S("abcdefghij"), 0, 10, -10);
112 test(S(""), 0, 0, S("abcdefghij"), 0, 11, -10);
113 test(S(""), 0, 0, S("abcdefghij"), 1, 0, 0);
114 test(S(""), 0, 0, S("abcdefghij"), 1, 1, -1);
115 test(S(""), 0, 0, S("abcdefghij"), 1, 4, -4);
116 test(S(""), 0, 0, S("abcdefghij"), 1, 8, -8);
117 test(S(""), 0, 0, S("abcdefghij"), 1, 9, -9);
118 test(S(""), 0, 0, S("abcdefghij"), 1, 10, -9);
119 test(S(""), 0, 0, S("abcdefghij"), 5, 0, 0);
120 test(S(""), 0, 0, S("abcdefghij"), 5, 1, -1);
121 test(S(""), 0, 0, S("abcdefghij"), 5, 2, -2);
122 test(S(""), 0, 0, S("abcdefghij"), 5, 4, -4);
123 test(S(""), 0, 0, S("abcdefghij"), 5, 5, -5);
124 test(S(""), 0, 0, S("abcdefghij"), 5, 6, -5);
125 test(S(""), 0, 0, S("abcdefghij"), 9, 0, 0);
126 test(S(""), 0, 0, S("abcdefghij"), 9, 1, -1);
127 test(S(""), 0, 0, S("abcdefghij"), 9, 2, -1);
128 test(S(""), 0, 0, S("abcdefghij"), 10, 0, 0);
129 test(S(""), 0, 0, S("abcdefghij"), 10, 1, 0);
130 test(S(""), 0, 0, S("abcdefghij"), 11, 0, 0);
131 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
132 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
133 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
134 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
135 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
136 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
137 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
138 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
139 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
140 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
141 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
142 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
143 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
144 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
145 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
146 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
147 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
148 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
149 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
150 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
151 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
152 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
153 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
154 test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
155 test(S(""), 0, 1, S(""), 0, 0, 0);
156 test(S(""), 0, 1, S(""), 0, 1, 0);
157 test(S(""), 0, 1, S(""), 1, 0, 0);
158 test(S(""), 0, 1, S("abcde"), 0, 0, 0);
159 test(S(""), 0, 1, S("abcde"), 0, 1, -1);
160 test(S(""), 0, 1, S("abcde"), 0, 2, -2);
161 test(S(""), 0, 1, S("abcde"), 0, 4, -4);
162 test(S(""), 0, 1, S("abcde"), 0, 5, -5);
163 test(S(""), 0, 1, S("abcde"), 0, 6, -5);
164 test(S(""), 0, 1, S("abcde"), 1, 0, 0);
165 test(S(""), 0, 1, S("abcde"), 1, 1, -1);
166 test(S(""), 0, 1, S("abcde"), 1, 2, -2);
167 test(S(""), 0, 1, S("abcde"), 1, 3, -3);
168 test(S(""), 0, 1, S("abcde"), 1, 4, -4);
169 test(S(""), 0, 1, S("abcde"), 1, 5, -4);
170 test(S(""), 0, 1, S("abcde"), 2, 0, 0);
171 test(S(""), 0, 1, S("abcde"), 2, 1, -1);
172 test(S(""), 0, 1, S("abcde"), 2, 2, -2);
173 test(S(""), 0, 1, S("abcde"), 2, 3, -3);
174 test(S(""), 0, 1, S("abcde"), 2, 4, -3);
175 test(S(""), 0, 1, S("abcde"), 4, 0, 0);
176 test(S(""), 0, 1, S("abcde"), 4, 1, -1);
177 test(S(""), 0, 1, S("abcde"), 4, 2, -1);
178 test(S(""), 0, 1, S("abcde"), 5, 0, 0);
179 test(S(""), 0, 1, S("abcde"), 5, 1, 0);
180 test(S(""), 0, 1, S("abcde"), 6, 0, 0);
181 }
182
183 template <class S>
test1()184 void test1()
185 {
186 test(S(""), 0, 1, S("abcdefghij"), 0, 0, 0);
187 test(S(""), 0, 1, S("abcdefghij"), 0, 1, -1);
188 test(S(""), 0, 1, S("abcdefghij"), 0, 5, -5);
189 test(S(""), 0, 1, S("abcdefghij"), 0, 9, -9);
190 test(S(""), 0, 1, S("abcdefghij"), 0, 10, -10);
191 test(S(""), 0, 1, S("abcdefghij"), 0, 11, -10);
192 test(S(""), 0, 1, S("abcdefghij"), 1, 0, 0);
193 test(S(""), 0, 1, S("abcdefghij"), 1, 1, -1);
194 test(S(""), 0, 1, S("abcdefghij"), 1, 4, -4);
195 test(S(""), 0, 1, S("abcdefghij"), 1, 8, -8);
196 test(S(""), 0, 1, S("abcdefghij"), 1, 9, -9);
197 test(S(""), 0, 1, S("abcdefghij"), 1, 10, -9);
198 test(S(""), 0, 1, S("abcdefghij"), 5, 0, 0);
199 test(S(""), 0, 1, S("abcdefghij"), 5, 1, -1);
200 test(S(""), 0, 1, S("abcdefghij"), 5, 2, -2);
201 test(S(""), 0, 1, S("abcdefghij"), 5, 4, -4);
202 test(S(""), 0, 1, S("abcdefghij"), 5, 5, -5);
203 test(S(""), 0, 1, S("abcdefghij"), 5, 6, -5);
204 test(S(""), 0, 1, S("abcdefghij"), 9, 0, 0);
205 test(S(""), 0, 1, S("abcdefghij"), 9, 1, -1);
206 test(S(""), 0, 1, S("abcdefghij"), 9, 2, -1);
207 test(S(""), 0, 1, S("abcdefghij"), 10, 0, 0);
208 test(S(""), 0, 1, S("abcdefghij"), 10, 1, 0);
209 test(S(""), 0, 1, S("abcdefghij"), 11, 0, 0);
210 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
211 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
212 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
213 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
214 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
215 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
216 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
217 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
218 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
219 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
220 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
221 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
222 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
223 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
224 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
225 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
226 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
227 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
228 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
229 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
230 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
231 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
232 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
233 test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
234 test(S(""), 1, 0, S(""), 0, 0, 0);
235 test(S(""), 1, 0, S(""), 0, 1, 0);
236 test(S(""), 1, 0, S(""), 1, 0, 0);
237 test(S(""), 1, 0, S("abcde"), 0, 0, 0);
238 test(S(""), 1, 0, S("abcde"), 0, 1, 0);
239 test(S(""), 1, 0, S("abcde"), 0, 2, 0);
240 test(S(""), 1, 0, S("abcde"), 0, 4, 0);
241 test(S(""), 1, 0, S("abcde"), 0, 5, 0);
242 test(S(""), 1, 0, S("abcde"), 0, 6, 0);
243 test(S(""), 1, 0, S("abcde"), 1, 0, 0);
244 test(S(""), 1, 0, S("abcde"), 1, 1, 0);
245 test(S(""), 1, 0, S("abcde"), 1, 2, 0);
246 test(S(""), 1, 0, S("abcde"), 1, 3, 0);
247 test(S(""), 1, 0, S("abcde"), 1, 4, 0);
248 test(S(""), 1, 0, S("abcde"), 1, 5, 0);
249 test(S(""), 1, 0, S("abcde"), 2, 0, 0);
250 test(S(""), 1, 0, S("abcde"), 2, 1, 0);
251 test(S(""), 1, 0, S("abcde"), 2, 2, 0);
252 test(S(""), 1, 0, S("abcde"), 2, 3, 0);
253 test(S(""), 1, 0, S("abcde"), 2, 4, 0);
254 test(S(""), 1, 0, S("abcde"), 4, 0, 0);
255 test(S(""), 1, 0, S("abcde"), 4, 1, 0);
256 test(S(""), 1, 0, S("abcde"), 4, 2, 0);
257 test(S(""), 1, 0, S("abcde"), 5, 0, 0);
258 test(S(""), 1, 0, S("abcde"), 5, 1, 0);
259 test(S(""), 1, 0, S("abcde"), 6, 0, 0);
260 test(S(""), 1, 0, S("abcdefghij"), 0, 0, 0);
261 test(S(""), 1, 0, S("abcdefghij"), 0, 1, 0);
262 test(S(""), 1, 0, S("abcdefghij"), 0, 5, 0);
263 test(S(""), 1, 0, S("abcdefghij"), 0, 9, 0);
264 test(S(""), 1, 0, S("abcdefghij"), 0, 10, 0);
265 test(S(""), 1, 0, S("abcdefghij"), 0, 11, 0);
266 test(S(""), 1, 0, S("abcdefghij"), 1, 0, 0);
267 test(S(""), 1, 0, S("abcdefghij"), 1, 1, 0);
268 test(S(""), 1, 0, S("abcdefghij"), 1, 4, 0);
269 test(S(""), 1, 0, S("abcdefghij"), 1, 8, 0);
270 test(S(""), 1, 0, S("abcdefghij"), 1, 9, 0);
271 test(S(""), 1, 0, S("abcdefghij"), 1, 10, 0);
272 test(S(""), 1, 0, S("abcdefghij"), 5, 0, 0);
273 test(S(""), 1, 0, S("abcdefghij"), 5, 1, 0);
274 test(S(""), 1, 0, S("abcdefghij"), 5, 2, 0);
275 test(S(""), 1, 0, S("abcdefghij"), 5, 4, 0);
276 test(S(""), 1, 0, S("abcdefghij"), 5, 5, 0);
277 test(S(""), 1, 0, S("abcdefghij"), 5, 6, 0);
278 test(S(""), 1, 0, S("abcdefghij"), 9, 0, 0);
279 test(S(""), 1, 0, S("abcdefghij"), 9, 1, 0);
280 test(S(""), 1, 0, S("abcdefghij"), 9, 2, 0);
281 test(S(""), 1, 0, S("abcdefghij"), 10, 0, 0);
282 test(S(""), 1, 0, S("abcdefghij"), 10, 1, 0);
283 test(S(""), 1, 0, S("abcdefghij"), 11, 0, 0);
284 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
285 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
286 }
287
288 template <class S>
test2()289 void test2()
290 {
291 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
292 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
293 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
294 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
295 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
296 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
297 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
298 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
299 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
300 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
301 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
302 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
303 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
304 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
305 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
306 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
307 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
308 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
309 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
310 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
311 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
312 test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
313 test(S("abcde"), 0, 0, S(""), 0, 0, 0);
314 test(S("abcde"), 0, 0, S(""), 0, 1, 0);
315 test(S("abcde"), 0, 0, S(""), 1, 0, 0);
316 test(S("abcde"), 0, 0, S("abcde"), 0, 0, 0);
317 test(S("abcde"), 0, 0, S("abcde"), 0, 1, -1);
318 test(S("abcde"), 0, 0, S("abcde"), 0, 2, -2);
319 test(S("abcde"), 0, 0, S("abcde"), 0, 4, -4);
320 test(S("abcde"), 0, 0, S("abcde"), 0, 5, -5);
321 test(S("abcde"), 0, 0, S("abcde"), 0, 6, -5);
322 test(S("abcde"), 0, 0, S("abcde"), 1, 0, 0);
323 test(S("abcde"), 0, 0, S("abcde"), 1, 1, -1);
324 test(S("abcde"), 0, 0, S("abcde"), 1, 2, -2);
325 test(S("abcde"), 0, 0, S("abcde"), 1, 3, -3);
326 test(S("abcde"), 0, 0, S("abcde"), 1, 4, -4);
327 test(S("abcde"), 0, 0, S("abcde"), 1, 5, -4);
328 test(S("abcde"), 0, 0, S("abcde"), 2, 0, 0);
329 test(S("abcde"), 0, 0, S("abcde"), 2, 1, -1);
330 test(S("abcde"), 0, 0, S("abcde"), 2, 2, -2);
331 test(S("abcde"), 0, 0, S("abcde"), 2, 3, -3);
332 test(S("abcde"), 0, 0, S("abcde"), 2, 4, -3);
333 test(S("abcde"), 0, 0, S("abcde"), 4, 0, 0);
334 test(S("abcde"), 0, 0, S("abcde"), 4, 1, -1);
335 test(S("abcde"), 0, 0, S("abcde"), 4, 2, -1);
336 test(S("abcde"), 0, 0, S("abcde"), 5, 0, 0);
337 test(S("abcde"), 0, 0, S("abcde"), 5, 1, 0);
338 test(S("abcde"), 0, 0, S("abcde"), 6, 0, 0);
339 test(S("abcde"), 0, 0, S("abcdefghij"), 0, 0, 0);
340 test(S("abcde"), 0, 0, S("abcdefghij"), 0, 1, -1);
341 test(S("abcde"), 0, 0, S("abcdefghij"), 0, 5, -5);
342 test(S("abcde"), 0, 0, S("abcdefghij"), 0, 9, -9);
343 test(S("abcde"), 0, 0, S("abcdefghij"), 0, 10, -10);
344 test(S("abcde"), 0, 0, S("abcdefghij"), 0, 11, -10);
345 test(S("abcde"), 0, 0, S("abcdefghij"), 1, 0, 0);
346 test(S("abcde"), 0, 0, S("abcdefghij"), 1, 1, -1);
347 test(S("abcde"), 0, 0, S("abcdefghij"), 1, 4, -4);
348 test(S("abcde"), 0, 0, S("abcdefghij"), 1, 8, -8);
349 test(S("abcde"), 0, 0, S("abcdefghij"), 1, 9, -9);
350 test(S("abcde"), 0, 0, S("abcdefghij"), 1, 10, -9);
351 test(S("abcde"), 0, 0, S("abcdefghij"), 5, 0, 0);
352 test(S("abcde"), 0, 0, S("abcdefghij"), 5, 1, -1);
353 test(S("abcde"), 0, 0, S("abcdefghij"), 5, 2, -2);
354 test(S("abcde"), 0, 0, S("abcdefghij"), 5, 4, -4);
355 test(S("abcde"), 0, 0, S("abcdefghij"), 5, 5, -5);
356 test(S("abcde"), 0, 0, S("abcdefghij"), 5, 6, -5);
357 test(S("abcde"), 0, 0, S("abcdefghij"), 9, 0, 0);
358 test(S("abcde"), 0, 0, S("abcdefghij"), 9, 1, -1);
359 test(S("abcde"), 0, 0, S("abcdefghij"), 9, 2, -1);
360 test(S("abcde"), 0, 0, S("abcdefghij"), 10, 0, 0);
361 test(S("abcde"), 0, 0, S("abcdefghij"), 10, 1, 0);
362 test(S("abcde"), 0, 0, S("abcdefghij"), 11, 0, 0);
363 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
364 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
365 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
366 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
367 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
368 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
369 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
370 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
371 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
372 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
373 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
374 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
375 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
376 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
377 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
378 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
379 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
380 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
381 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
382 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
383 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
384 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
385 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
386 test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
387 test(S("abcde"), 0, 1, S(""), 0, 0, 1);
388 test(S("abcde"), 0, 1, S(""), 0, 1, 1);
389 test(S("abcde"), 0, 1, S(""), 1, 0, 0);
390 test(S("abcde"), 0, 1, S("abcde"), 0, 0, 1);
391 }
392
393 template <class S>
test3()394 void test3()
395 {
396 test(S("abcde"), 0, 1, S("abcde"), 0, 1, 0);
397 test(S("abcde"), 0, 1, S("abcde"), 0, 2, -1);
398 test(S("abcde"), 0, 1, S("abcde"), 0, 4, -3);
399 test(S("abcde"), 0, 1, S("abcde"), 0, 5, -4);
400 test(S("abcde"), 0, 1, S("abcde"), 0, 6, -4);
401 test(S("abcde"), 0, 1, S("abcde"), 1, 0, 1);
402 test(S("abcde"), 0, 1, S("abcde"), 1, 1, -1);
403 test(S("abcde"), 0, 1, S("abcde"), 1, 2, -1);
404 test(S("abcde"), 0, 1, S("abcde"), 1, 3, -1);
405 test(S("abcde"), 0, 1, S("abcde"), 1, 4, -1);
406 test(S("abcde"), 0, 1, S("abcde"), 1, 5, -1);
407 test(S("abcde"), 0, 1, S("abcde"), 2, 0, 1);
408 test(S("abcde"), 0, 1, S("abcde"), 2, 1, -2);
409 test(S("abcde"), 0, 1, S("abcde"), 2, 2, -2);
410 test(S("abcde"), 0, 1, S("abcde"), 2, 3, -2);
411 test(S("abcde"), 0, 1, S("abcde"), 2, 4, -2);
412 test(S("abcde"), 0, 1, S("abcde"), 4, 0, 1);
413 test(S("abcde"), 0, 1, S("abcde"), 4, 1, -4);
414 test(S("abcde"), 0, 1, S("abcde"), 4, 2, -4);
415 test(S("abcde"), 0, 1, S("abcde"), 5, 0, 1);
416 test(S("abcde"), 0, 1, S("abcde"), 5, 1, 1);
417 test(S("abcde"), 0, 1, S("abcde"), 6, 0, 0);
418 test(S("abcde"), 0, 1, S("abcdefghij"), 0, 0, 1);
419 test(S("abcde"), 0, 1, S("abcdefghij"), 0, 1, 0);
420 test(S("abcde"), 0, 1, S("abcdefghij"), 0, 5, -4);
421 test(S("abcde"), 0, 1, S("abcdefghij"), 0, 9, -8);
422 test(S("abcde"), 0, 1, S("abcdefghij"), 0, 10, -9);
423 test(S("abcde"), 0, 1, S("abcdefghij"), 0, 11, -9);
424 test(S("abcde"), 0, 1, S("abcdefghij"), 1, 0, 1);
425 test(S("abcde"), 0, 1, S("abcdefghij"), 1, 1, -1);
426 test(S("abcde"), 0, 1, S("abcdefghij"), 1, 4, -1);
427 test(S("abcde"), 0, 1, S("abcdefghij"), 1, 8, -1);
428 test(S("abcde"), 0, 1, S("abcdefghij"), 1, 9, -1);
429 test(S("abcde"), 0, 1, S("abcdefghij"), 1, 10, -1);
430 test(S("abcde"), 0, 1, S("abcdefghij"), 5, 0, 1);
431 test(S("abcde"), 0, 1, S("abcdefghij"), 5, 1, -5);
432 test(S("abcde"), 0, 1, S("abcdefghij"), 5, 2, -5);
433 test(S("abcde"), 0, 1, S("abcdefghij"), 5, 4, -5);
434 test(S("abcde"), 0, 1, S("abcdefghij"), 5, 5, -5);
435 test(S("abcde"), 0, 1, S("abcdefghij"), 5, 6, -5);
436 test(S("abcde"), 0, 1, S("abcdefghij"), 9, 0, 1);
437 test(S("abcde"), 0, 1, S("abcdefghij"), 9, 1, -9);
438 test(S("abcde"), 0, 1, S("abcdefghij"), 9, 2, -9);
439 test(S("abcde"), 0, 1, S("abcdefghij"), 10, 0, 1);
440 test(S("abcde"), 0, 1, S("abcdefghij"), 10, 1, 1);
441 test(S("abcde"), 0, 1, S("abcdefghij"), 11, 0, 0);
442 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
443 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
444 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
445 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
446 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
447 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
448 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
449 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
450 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
451 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
452 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
453 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
454 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
455 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
456 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
457 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
458 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
459 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
460 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
461 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
462 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
463 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
464 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
465 test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
466 test(S("abcde"), 0, 2, S(""), 0, 0, 2);
467 test(S("abcde"), 0, 2, S(""), 0, 1, 2);
468 test(S("abcde"), 0, 2, S(""), 1, 0, 0);
469 test(S("abcde"), 0, 2, S("abcde"), 0, 0, 2);
470 test(S("abcde"), 0, 2, S("abcde"), 0, 1, 1);
471 test(S("abcde"), 0, 2, S("abcde"), 0, 2, 0);
472 test(S("abcde"), 0, 2, S("abcde"), 0, 4, -2);
473 test(S("abcde"), 0, 2, S("abcde"), 0, 5, -3);
474 test(S("abcde"), 0, 2, S("abcde"), 0, 6, -3);
475 test(S("abcde"), 0, 2, S("abcde"), 1, 0, 2);
476 test(S("abcde"), 0, 2, S("abcde"), 1, 1, -1);
477 test(S("abcde"), 0, 2, S("abcde"), 1, 2, -1);
478 test(S("abcde"), 0, 2, S("abcde"), 1, 3, -1);
479 test(S("abcde"), 0, 2, S("abcde"), 1, 4, -1);
480 test(S("abcde"), 0, 2, S("abcde"), 1, 5, -1);
481 test(S("abcde"), 0, 2, S("abcde"), 2, 0, 2);
482 test(S("abcde"), 0, 2, S("abcde"), 2, 1, -2);
483 test(S("abcde"), 0, 2, S("abcde"), 2, 2, -2);
484 test(S("abcde"), 0, 2, S("abcde"), 2, 3, -2);
485 test(S("abcde"), 0, 2, S("abcde"), 2, 4, -2);
486 test(S("abcde"), 0, 2, S("abcde"), 4, 0, 2);
487 test(S("abcde"), 0, 2, S("abcde"), 4, 1, -4);
488 test(S("abcde"), 0, 2, S("abcde"), 4, 2, -4);
489 test(S("abcde"), 0, 2, S("abcde"), 5, 0, 2);
490 test(S("abcde"), 0, 2, S("abcde"), 5, 1, 2);
491 test(S("abcde"), 0, 2, S("abcde"), 6, 0, 0);
492 test(S("abcde"), 0, 2, S("abcdefghij"), 0, 0, 2);
493 test(S("abcde"), 0, 2, S("abcdefghij"), 0, 1, 1);
494 test(S("abcde"), 0, 2, S("abcdefghij"), 0, 5, -3);
495 test(S("abcde"), 0, 2, S("abcdefghij"), 0, 9, -7);
496 }
497
498 template <class S>
test4()499 void test4()
500 {
501 test(S("abcde"), 0, 2, S("abcdefghij"), 0, 10, -8);
502 test(S("abcde"), 0, 2, S("abcdefghij"), 0, 11, -8);
503 test(S("abcde"), 0, 2, S("abcdefghij"), 1, 0, 2);
504 test(S("abcde"), 0, 2, S("abcdefghij"), 1, 1, -1);
505 test(S("abcde"), 0, 2, S("abcdefghij"), 1, 4, -1);
506 test(S("abcde"), 0, 2, S("abcdefghij"), 1, 8, -1);
507 test(S("abcde"), 0, 2, S("abcdefghij"), 1, 9, -1);
508 test(S("abcde"), 0, 2, S("abcdefghij"), 1, 10, -1);
509 test(S("abcde"), 0, 2, S("abcdefghij"), 5, 0, 2);
510 test(S("abcde"), 0, 2, S("abcdefghij"), 5, 1, -5);
511 test(S("abcde"), 0, 2, S("abcdefghij"), 5, 2, -5);
512 test(S("abcde"), 0, 2, S("abcdefghij"), 5, 4, -5);
513 test(S("abcde"), 0, 2, S("abcdefghij"), 5, 5, -5);
514 test(S("abcde"), 0, 2, S("abcdefghij"), 5, 6, -5);
515 test(S("abcde"), 0, 2, S("abcdefghij"), 9, 0, 2);
516 test(S("abcde"), 0, 2, S("abcdefghij"), 9, 1, -9);
517 test(S("abcde"), 0, 2, S("abcdefghij"), 9, 2, -9);
518 test(S("abcde"), 0, 2, S("abcdefghij"), 10, 0, 2);
519 test(S("abcde"), 0, 2, S("abcdefghij"), 10, 1, 2);
520 test(S("abcde"), 0, 2, S("abcdefghij"), 11, 0, 0);
521 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
522 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 1, 1);
523 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 10, -8);
524 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 19, -17);
525 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 20, -18);
526 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 21, -18);
527 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
528 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 1, -1);
529 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 9, -1);
530 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 18, -1);
531 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 19, -1);
532 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 20, -1);
533 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
534 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 1, -10);
535 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 5, -10);
536 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 9, -10);
537 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 10, -10);
538 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 11, -10);
539 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
540 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 1, -19);
541 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 2, -19);
542 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
543 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
544 test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
545 test(S("abcde"), 0, 4, S(""), 0, 0, 4);
546 test(S("abcde"), 0, 4, S(""), 0, 1, 4);
547 test(S("abcde"), 0, 4, S(""), 1, 0, 0);
548 test(S("abcde"), 0, 4, S("abcde"), 0, 0, 4);
549 test(S("abcde"), 0, 4, S("abcde"), 0, 1, 3);
550 test(S("abcde"), 0, 4, S("abcde"), 0, 2, 2);
551 test(S("abcde"), 0, 4, S("abcde"), 0, 4, 0);
552 test(S("abcde"), 0, 4, S("abcde"), 0, 5, -1);
553 test(S("abcde"), 0, 4, S("abcde"), 0, 6, -1);
554 test(S("abcde"), 0, 4, S("abcde"), 1, 0, 4);
555 test(S("abcde"), 0, 4, S("abcde"), 1, 1, -1);
556 test(S("abcde"), 0, 4, S("abcde"), 1, 2, -1);
557 test(S("abcde"), 0, 4, S("abcde"), 1, 3, -1);
558 test(S("abcde"), 0, 4, S("abcde"), 1, 4, -1);
559 test(S("abcde"), 0, 4, S("abcde"), 1, 5, -1);
560 test(S("abcde"), 0, 4, S("abcde"), 2, 0, 4);
561 test(S("abcde"), 0, 4, S("abcde"), 2, 1, -2);
562 test(S("abcde"), 0, 4, S("abcde"), 2, 2, -2);
563 test(S("abcde"), 0, 4, S("abcde"), 2, 3, -2);
564 test(S("abcde"), 0, 4, S("abcde"), 2, 4, -2);
565 test(S("abcde"), 0, 4, S("abcde"), 4, 0, 4);
566 test(S("abcde"), 0, 4, S("abcde"), 4, 1, -4);
567 test(S("abcde"), 0, 4, S("abcde"), 4, 2, -4);
568 test(S("abcde"), 0, 4, S("abcde"), 5, 0, 4);
569 test(S("abcde"), 0, 4, S("abcde"), 5, 1, 4);
570 test(S("abcde"), 0, 4, S("abcde"), 6, 0, 0);
571 test(S("abcde"), 0, 4, S("abcdefghij"), 0, 0, 4);
572 test(S("abcde"), 0, 4, S("abcdefghij"), 0, 1, 3);
573 test(S("abcde"), 0, 4, S("abcdefghij"), 0, 5, -1);
574 test(S("abcde"), 0, 4, S("abcdefghij"), 0, 9, -5);
575 test(S("abcde"), 0, 4, S("abcdefghij"), 0, 10, -6);
576 test(S("abcde"), 0, 4, S("abcdefghij"), 0, 11, -6);
577 test(S("abcde"), 0, 4, S("abcdefghij"), 1, 0, 4);
578 test(S("abcde"), 0, 4, S("abcdefghij"), 1, 1, -1);
579 test(S("abcde"), 0, 4, S("abcdefghij"), 1, 4, -1);
580 test(S("abcde"), 0, 4, S("abcdefghij"), 1, 8, -1);
581 test(S("abcde"), 0, 4, S("abcdefghij"), 1, 9, -1);
582 test(S("abcde"), 0, 4, S("abcdefghij"), 1, 10, -1);
583 test(S("abcde"), 0, 4, S("abcdefghij"), 5, 0, 4);
584 test(S("abcde"), 0, 4, S("abcdefghij"), 5, 1, -5);
585 test(S("abcde"), 0, 4, S("abcdefghij"), 5, 2, -5);
586 test(S("abcde"), 0, 4, S("abcdefghij"), 5, 4, -5);
587 test(S("abcde"), 0, 4, S("abcdefghij"), 5, 5, -5);
588 test(S("abcde"), 0, 4, S("abcdefghij"), 5, 6, -5);
589 test(S("abcde"), 0, 4, S("abcdefghij"), 9, 0, 4);
590 test(S("abcde"), 0, 4, S("abcdefghij"), 9, 1, -9);
591 test(S("abcde"), 0, 4, S("abcdefghij"), 9, 2, -9);
592 test(S("abcde"), 0, 4, S("abcdefghij"), 10, 0, 4);
593 test(S("abcde"), 0, 4, S("abcdefghij"), 10, 1, 4);
594 test(S("abcde"), 0, 4, S("abcdefghij"), 11, 0, 0);
595 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
596 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 1, 3);
597 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 10, -6);
598 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 19, -15);
599 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 20, -16);
600 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 21, -16);
601 }
602
603 template <class S>
test5()604 void test5()
605 {
606 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
607 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 1, -1);
608 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 9, -1);
609 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 18, -1);
610 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 19, -1);
611 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 20, -1);
612 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
613 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 1, -10);
614 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 5, -10);
615 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 9, -10);
616 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 10, -10);
617 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 11, -10);
618 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
619 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 1, -19);
620 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 2, -19);
621 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
622 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
623 test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
624 test(S("abcde"), 0, 5, S(""), 0, 0, 5);
625 test(S("abcde"), 0, 5, S(""), 0, 1, 5);
626 test(S("abcde"), 0, 5, S(""), 1, 0, 0);
627 test(S("abcde"), 0, 5, S("abcde"), 0, 0, 5);
628 test(S("abcde"), 0, 5, S("abcde"), 0, 1, 4);
629 test(S("abcde"), 0, 5, S("abcde"), 0, 2, 3);
630 test(S("abcde"), 0, 5, S("abcde"), 0, 4, 1);
631 test(S("abcde"), 0, 5, S("abcde"), 0, 5, 0);
632 test(S("abcde"), 0, 5, S("abcde"), 0, 6, 0);
633 test(S("abcde"), 0, 5, S("abcde"), 1, 0, 5);
634 test(S("abcde"), 0, 5, S("abcde"), 1, 1, -1);
635 test(S("abcde"), 0, 5, S("abcde"), 1, 2, -1);
636 test(S("abcde"), 0, 5, S("abcde"), 1, 3, -1);
637 test(S("abcde"), 0, 5, S("abcde"), 1, 4, -1);
638 test(S("abcde"), 0, 5, S("abcde"), 1, 5, -1);
639 test(S("abcde"), 0, 5, S("abcde"), 2, 0, 5);
640 test(S("abcde"), 0, 5, S("abcde"), 2, 1, -2);
641 test(S("abcde"), 0, 5, S("abcde"), 2, 2, -2);
642 test(S("abcde"), 0, 5, S("abcde"), 2, 3, -2);
643 test(S("abcde"), 0, 5, S("abcde"), 2, 4, -2);
644 test(S("abcde"), 0, 5, S("abcde"), 4, 0, 5);
645 test(S("abcde"), 0, 5, S("abcde"), 4, 1, -4);
646 test(S("abcde"), 0, 5, S("abcde"), 4, 2, -4);
647 test(S("abcde"), 0, 5, S("abcde"), 5, 0, 5);
648 test(S("abcde"), 0, 5, S("abcde"), 5, 1, 5);
649 test(S("abcde"), 0, 5, S("abcde"), 6, 0, 0);
650 test(S("abcde"), 0, 5, S("abcdefghij"), 0, 0, 5);
651 test(S("abcde"), 0, 5, S("abcdefghij"), 0, 1, 4);
652 test(S("abcde"), 0, 5, S("abcdefghij"), 0, 5, 0);
653 test(S("abcde"), 0, 5, S("abcdefghij"), 0, 9, -4);
654 test(S("abcde"), 0, 5, S("abcdefghij"), 0, 10, -5);
655 test(S("abcde"), 0, 5, S("abcdefghij"), 0, 11, -5);
656 test(S("abcde"), 0, 5, S("abcdefghij"), 1, 0, 5);
657 test(S("abcde"), 0, 5, S("abcdefghij"), 1, 1, -1);
658 test(S("abcde"), 0, 5, S("abcdefghij"), 1, 4, -1);
659 test(S("abcde"), 0, 5, S("abcdefghij"), 1, 8, -1);
660 test(S("abcde"), 0, 5, S("abcdefghij"), 1, 9, -1);
661 test(S("abcde"), 0, 5, S("abcdefghij"), 1, 10, -1);
662 test(S("abcde"), 0, 5, S("abcdefghij"), 5, 0, 5);
663 test(S("abcde"), 0, 5, S("abcdefghij"), 5, 1, -5);
664 test(S("abcde"), 0, 5, S("abcdefghij"), 5, 2, -5);
665 test(S("abcde"), 0, 5, S("abcdefghij"), 5, 4, -5);
666 test(S("abcde"), 0, 5, S("abcdefghij"), 5, 5, -5);
667 test(S("abcde"), 0, 5, S("abcdefghij"), 5, 6, -5);
668 test(S("abcde"), 0, 5, S("abcdefghij"), 9, 0, 5);
669 test(S("abcde"), 0, 5, S("abcdefghij"), 9, 1, -9);
670 test(S("abcde"), 0, 5, S("abcdefghij"), 9, 2, -9);
671 test(S("abcde"), 0, 5, S("abcdefghij"), 10, 0, 5);
672 test(S("abcde"), 0, 5, S("abcdefghij"), 10, 1, 5);
673 test(S("abcde"), 0, 5, S("abcdefghij"), 11, 0, 0);
674 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
675 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4);
676 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5);
677 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14);
678 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15);
679 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15);
680 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
681 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1);
682 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1);
683 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1);
684 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1);
685 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1);
686 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
687 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10);
688 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10);
689 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10);
690 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10);
691 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10);
692 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
693 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19);
694 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19);
695 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
696 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
697 test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
698 test(S("abcde"), 0, 6, S(""), 0, 0, 5);
699 test(S("abcde"), 0, 6, S(""), 0, 1, 5);
700 test(S("abcde"), 0, 6, S(""), 1, 0, 0);
701 test(S("abcde"), 0, 6, S("abcde"), 0, 0, 5);
702 test(S("abcde"), 0, 6, S("abcde"), 0, 1, 4);
703 test(S("abcde"), 0, 6, S("abcde"), 0, 2, 3);
704 test(S("abcde"), 0, 6, S("abcde"), 0, 4, 1);
705 test(S("abcde"), 0, 6, S("abcde"), 0, 5, 0);
706 }
707
708 template <class S>
test6()709 void test6()
710 {
711 test(S("abcde"), 0, 6, S("abcde"), 0, 6, 0);
712 test(S("abcde"), 0, 6, S("abcde"), 1, 0, 5);
713 test(S("abcde"), 0, 6, S("abcde"), 1, 1, -1);
714 test(S("abcde"), 0, 6, S("abcde"), 1, 2, -1);
715 test(S("abcde"), 0, 6, S("abcde"), 1, 3, -1);
716 test(S("abcde"), 0, 6, S("abcde"), 1, 4, -1);
717 test(S("abcde"), 0, 6, S("abcde"), 1, 5, -1);
718 test(S("abcde"), 0, 6, S("abcde"), 2, 0, 5);
719 test(S("abcde"), 0, 6, S("abcde"), 2, 1, -2);
720 test(S("abcde"), 0, 6, S("abcde"), 2, 2, -2);
721 test(S("abcde"), 0, 6, S("abcde"), 2, 3, -2);
722 test(S("abcde"), 0, 6, S("abcde"), 2, 4, -2);
723 test(S("abcde"), 0, 6, S("abcde"), 4, 0, 5);
724 test(S("abcde"), 0, 6, S("abcde"), 4, 1, -4);
725 test(S("abcde"), 0, 6, S("abcde"), 4, 2, -4);
726 test(S("abcde"), 0, 6, S("abcde"), 5, 0, 5);
727 test(S("abcde"), 0, 6, S("abcde"), 5, 1, 5);
728 test(S("abcde"), 0, 6, S("abcde"), 6, 0, 0);
729 test(S("abcde"), 0, 6, S("abcdefghij"), 0, 0, 5);
730 test(S("abcde"), 0, 6, S("abcdefghij"), 0, 1, 4);
731 test(S("abcde"), 0, 6, S("abcdefghij"), 0, 5, 0);
732 test(S("abcde"), 0, 6, S("abcdefghij"), 0, 9, -4);
733 test(S("abcde"), 0, 6, S("abcdefghij"), 0, 10, -5);
734 test(S("abcde"), 0, 6, S("abcdefghij"), 0, 11, -5);
735 test(S("abcde"), 0, 6, S("abcdefghij"), 1, 0, 5);
736 test(S("abcde"), 0, 6, S("abcdefghij"), 1, 1, -1);
737 test(S("abcde"), 0, 6, S("abcdefghij"), 1, 4, -1);
738 test(S("abcde"), 0, 6, S("abcdefghij"), 1, 8, -1);
739 test(S("abcde"), 0, 6, S("abcdefghij"), 1, 9, -1);
740 test(S("abcde"), 0, 6, S("abcdefghij"), 1, 10, -1);
741 test(S("abcde"), 0, 6, S("abcdefghij"), 5, 0, 5);
742 test(S("abcde"), 0, 6, S("abcdefghij"), 5, 1, -5);
743 test(S("abcde"), 0, 6, S("abcdefghij"), 5, 2, -5);
744 test(S("abcde"), 0, 6, S("abcdefghij"), 5, 4, -5);
745 test(S("abcde"), 0, 6, S("abcdefghij"), 5, 5, -5);
746 test(S("abcde"), 0, 6, S("abcdefghij"), 5, 6, -5);
747 test(S("abcde"), 0, 6, S("abcdefghij"), 9, 0, 5);
748 test(S("abcde"), 0, 6, S("abcdefghij"), 9, 1, -9);
749 test(S("abcde"), 0, 6, S("abcdefghij"), 9, 2, -9);
750 test(S("abcde"), 0, 6, S("abcdefghij"), 10, 0, 5);
751 test(S("abcde"), 0, 6, S("abcdefghij"), 10, 1, 5);
752 test(S("abcde"), 0, 6, S("abcdefghij"), 11, 0, 0);
753 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 0, 5);
754 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 1, 4);
755 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 10, -5);
756 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 19, -14);
757 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 20, -15);
758 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 21, -15);
759 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 0, 5);
760 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 1, -1);
761 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 9, -1);
762 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 18, -1);
763 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 19, -1);
764 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 20, -1);
765 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 0, 5);
766 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 1, -10);
767 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 5, -10);
768 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 9, -10);
769 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 10, -10);
770 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 11, -10);
771 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 0, 5);
772 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 1, -19);
773 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 2, -19);
774 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 0, 5);
775 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 1, 5);
776 test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 21, 0, 0);
777 test(S("abcde"), 1, 0, S(""), 0, 0, 0);
778 test(S("abcde"), 1, 0, S(""), 0, 1, 0);
779 test(S("abcde"), 1, 0, S(""), 1, 0, 0);
780 test(S("abcde"), 1, 0, S("abcde"), 0, 0, 0);
781 test(S("abcde"), 1, 0, S("abcde"), 0, 1, -1);
782 test(S("abcde"), 1, 0, S("abcde"), 0, 2, -2);
783 test(S("abcde"), 1, 0, S("abcde"), 0, 4, -4);
784 test(S("abcde"), 1, 0, S("abcde"), 0, 5, -5);
785 test(S("abcde"), 1, 0, S("abcde"), 0, 6, -5);
786 test(S("abcde"), 1, 0, S("abcde"), 1, 0, 0);
787 test(S("abcde"), 1, 0, S("abcde"), 1, 1, -1);
788 test(S("abcde"), 1, 0, S("abcde"), 1, 2, -2);
789 test(S("abcde"), 1, 0, S("abcde"), 1, 3, -3);
790 test(S("abcde"), 1, 0, S("abcde"), 1, 4, -4);
791 test(S("abcde"), 1, 0, S("abcde"), 1, 5, -4);
792 test(S("abcde"), 1, 0, S("abcde"), 2, 0, 0);
793 test(S("abcde"), 1, 0, S("abcde"), 2, 1, -1);
794 test(S("abcde"), 1, 0, S("abcde"), 2, 2, -2);
795 test(S("abcde"), 1, 0, S("abcde"), 2, 3, -3);
796 test(S("abcde"), 1, 0, S("abcde"), 2, 4, -3);
797 test(S("abcde"), 1, 0, S("abcde"), 4, 0, 0);
798 test(S("abcde"), 1, 0, S("abcde"), 4, 1, -1);
799 test(S("abcde"), 1, 0, S("abcde"), 4, 2, -1);
800 test(S("abcde"), 1, 0, S("abcde"), 5, 0, 0);
801 test(S("abcde"), 1, 0, S("abcde"), 5, 1, 0);
802 test(S("abcde"), 1, 0, S("abcde"), 6, 0, 0);
803 test(S("abcde"), 1, 0, S("abcdefghij"), 0, 0, 0);
804 test(S("abcde"), 1, 0, S("abcdefghij"), 0, 1, -1);
805 test(S("abcde"), 1, 0, S("abcdefghij"), 0, 5, -5);
806 test(S("abcde"), 1, 0, S("abcdefghij"), 0, 9, -9);
807 test(S("abcde"), 1, 0, S("abcdefghij"), 0, 10, -10);
808 test(S("abcde"), 1, 0, S("abcdefghij"), 0, 11, -10);
809 test(S("abcde"), 1, 0, S("abcdefghij"), 1, 0, 0);
810 test(S("abcde"), 1, 0, S("abcdefghij"), 1, 1, -1);
811 }
812
813 template <class S>
test7()814 void test7()
815 {
816 test(S("abcde"), 1, 0, S("abcdefghij"), 1, 4, -4);
817 test(S("abcde"), 1, 0, S("abcdefghij"), 1, 8, -8);
818 test(S("abcde"), 1, 0, S("abcdefghij"), 1, 9, -9);
819 test(S("abcde"), 1, 0, S("abcdefghij"), 1, 10, -9);
820 test(S("abcde"), 1, 0, S("abcdefghij"), 5, 0, 0);
821 test(S("abcde"), 1, 0, S("abcdefghij"), 5, 1, -1);
822 test(S("abcde"), 1, 0, S("abcdefghij"), 5, 2, -2);
823 test(S("abcde"), 1, 0, S("abcdefghij"), 5, 4, -4);
824 test(S("abcde"), 1, 0, S("abcdefghij"), 5, 5, -5);
825 test(S("abcde"), 1, 0, S("abcdefghij"), 5, 6, -5);
826 test(S("abcde"), 1, 0, S("abcdefghij"), 9, 0, 0);
827 test(S("abcde"), 1, 0, S("abcdefghij"), 9, 1, -1);
828 test(S("abcde"), 1, 0, S("abcdefghij"), 9, 2, -1);
829 test(S("abcde"), 1, 0, S("abcdefghij"), 10, 0, 0);
830 test(S("abcde"), 1, 0, S("abcdefghij"), 10, 1, 0);
831 test(S("abcde"), 1, 0, S("abcdefghij"), 11, 0, 0);
832 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
833 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
834 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
835 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
836 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
837 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
838 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
839 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
840 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
841 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
842 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
843 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
844 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
845 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
846 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
847 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
848 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
849 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
850 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
851 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
852 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
853 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
854 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
855 test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
856 test(S("abcde"), 1, 1, S(""), 0, 0, 1);
857 test(S("abcde"), 1, 1, S(""), 0, 1, 1);
858 test(S("abcde"), 1, 1, S(""), 1, 0, 0);
859 test(S("abcde"), 1, 1, S("abcde"), 0, 0, 1);
860 test(S("abcde"), 1, 1, S("abcde"), 0, 1, 1);
861 test(S("abcde"), 1, 1, S("abcde"), 0, 2, 1);
862 test(S("abcde"), 1, 1, S("abcde"), 0, 4, 1);
863 test(S("abcde"), 1, 1, S("abcde"), 0, 5, 1);
864 test(S("abcde"), 1, 1, S("abcde"), 0, 6, 1);
865 test(S("abcde"), 1, 1, S("abcde"), 1, 0, 1);
866 test(S("abcde"), 1, 1, S("abcde"), 1, 1, 0);
867 test(S("abcde"), 1, 1, S("abcde"), 1, 2, -1);
868 test(S("abcde"), 1, 1, S("abcde"), 1, 3, -2);
869 test(S("abcde"), 1, 1, S("abcde"), 1, 4, -3);
870 test(S("abcde"), 1, 1, S("abcde"), 1, 5, -3);
871 test(S("abcde"), 1, 1, S("abcde"), 2, 0, 1);
872 test(S("abcde"), 1, 1, S("abcde"), 2, 1, -1);
873 test(S("abcde"), 1, 1, S("abcde"), 2, 2, -1);
874 test(S("abcde"), 1, 1, S("abcde"), 2, 3, -1);
875 test(S("abcde"), 1, 1, S("abcde"), 2, 4, -1);
876 test(S("abcde"), 1, 1, S("abcde"), 4, 0, 1);
877 test(S("abcde"), 1, 1, S("abcde"), 4, 1, -3);
878 test(S("abcde"), 1, 1, S("abcde"), 4, 2, -3);
879 test(S("abcde"), 1, 1, S("abcde"), 5, 0, 1);
880 test(S("abcde"), 1, 1, S("abcde"), 5, 1, 1);
881 test(S("abcde"), 1, 1, S("abcde"), 6, 0, 0);
882 test(S("abcde"), 1, 1, S("abcdefghij"), 0, 0, 1);
883 test(S("abcde"), 1, 1, S("abcdefghij"), 0, 1, 1);
884 test(S("abcde"), 1, 1, S("abcdefghij"), 0, 5, 1);
885 test(S("abcde"), 1, 1, S("abcdefghij"), 0, 9, 1);
886 test(S("abcde"), 1, 1, S("abcdefghij"), 0, 10, 1);
887 test(S("abcde"), 1, 1, S("abcdefghij"), 0, 11, 1);
888 test(S("abcde"), 1, 1, S("abcdefghij"), 1, 0, 1);
889 test(S("abcde"), 1, 1, S("abcdefghij"), 1, 1, 0);
890 test(S("abcde"), 1, 1, S("abcdefghij"), 1, 4, -3);
891 test(S("abcde"), 1, 1, S("abcdefghij"), 1, 8, -7);
892 test(S("abcde"), 1, 1, S("abcdefghij"), 1, 9, -8);
893 test(S("abcde"), 1, 1, S("abcdefghij"), 1, 10, -8);
894 test(S("abcde"), 1, 1, S("abcdefghij"), 5, 0, 1);
895 test(S("abcde"), 1, 1, S("abcdefghij"), 5, 1, -4);
896 test(S("abcde"), 1, 1, S("abcdefghij"), 5, 2, -4);
897 test(S("abcde"), 1, 1, S("abcdefghij"), 5, 4, -4);
898 test(S("abcde"), 1, 1, S("abcdefghij"), 5, 5, -4);
899 test(S("abcde"), 1, 1, S("abcdefghij"), 5, 6, -4);
900 test(S("abcde"), 1, 1, S("abcdefghij"), 9, 0, 1);
901 test(S("abcde"), 1, 1, S("abcdefghij"), 9, 1, -8);
902 test(S("abcde"), 1, 1, S("abcdefghij"), 9, 2, -8);
903 test(S("abcde"), 1, 1, S("abcdefghij"), 10, 0, 1);
904 test(S("abcde"), 1, 1, S("abcdefghij"), 10, 1, 1);
905 test(S("abcde"), 1, 1, S("abcdefghij"), 11, 0, 0);
906 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
907 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
908 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
909 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
910 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
911 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
912 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
913 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
914 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
915 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
916 }
917
918 template <class S>
test8()919 void test8()
920 {
921 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
922 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
923 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
924 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
925 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
926 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
927 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
928 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
929 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
930 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
931 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
932 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
933 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
934 test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
935 test(S("abcde"), 1, 2, S(""), 0, 0, 2);
936 test(S("abcde"), 1, 2, S(""), 0, 1, 2);
937 test(S("abcde"), 1, 2, S(""), 1, 0, 0);
938 test(S("abcde"), 1, 2, S("abcde"), 0, 0, 2);
939 test(S("abcde"), 1, 2, S("abcde"), 0, 1, 1);
940 test(S("abcde"), 1, 2, S("abcde"), 0, 2, 1);
941 test(S("abcde"), 1, 2, S("abcde"), 0, 4, 1);
942 test(S("abcde"), 1, 2, S("abcde"), 0, 5, 1);
943 test(S("abcde"), 1, 2, S("abcde"), 0, 6, 1);
944 test(S("abcde"), 1, 2, S("abcde"), 1, 0, 2);
945 test(S("abcde"), 1, 2, S("abcde"), 1, 1, 1);
946 test(S("abcde"), 1, 2, S("abcde"), 1, 2, 0);
947 test(S("abcde"), 1, 2, S("abcde"), 1, 3, -1);
948 test(S("abcde"), 1, 2, S("abcde"), 1, 4, -2);
949 test(S("abcde"), 1, 2, S("abcde"), 1, 5, -2);
950 test(S("abcde"), 1, 2, S("abcde"), 2, 0, 2);
951 test(S("abcde"), 1, 2, S("abcde"), 2, 1, -1);
952 test(S("abcde"), 1, 2, S("abcde"), 2, 2, -1);
953 test(S("abcde"), 1, 2, S("abcde"), 2, 3, -1);
954 test(S("abcde"), 1, 2, S("abcde"), 2, 4, -1);
955 test(S("abcde"), 1, 2, S("abcde"), 4, 0, 2);
956 test(S("abcde"), 1, 2, S("abcde"), 4, 1, -3);
957 test(S("abcde"), 1, 2, S("abcde"), 4, 2, -3);
958 test(S("abcde"), 1, 2, S("abcde"), 5, 0, 2);
959 test(S("abcde"), 1, 2, S("abcde"), 5, 1, 2);
960 test(S("abcde"), 1, 2, S("abcde"), 6, 0, 0);
961 test(S("abcde"), 1, 2, S("abcdefghij"), 0, 0, 2);
962 test(S("abcde"), 1, 2, S("abcdefghij"), 0, 1, 1);
963 test(S("abcde"), 1, 2, S("abcdefghij"), 0, 5, 1);
964 test(S("abcde"), 1, 2, S("abcdefghij"), 0, 9, 1);
965 test(S("abcde"), 1, 2, S("abcdefghij"), 0, 10, 1);
966 test(S("abcde"), 1, 2, S("abcdefghij"), 0, 11, 1);
967 test(S("abcde"), 1, 2, S("abcdefghij"), 1, 0, 2);
968 test(S("abcde"), 1, 2, S("abcdefghij"), 1, 1, 1);
969 test(S("abcde"), 1, 2, S("abcdefghij"), 1, 4, -2);
970 test(S("abcde"), 1, 2, S("abcdefghij"), 1, 8, -6);
971 test(S("abcde"), 1, 2, S("abcdefghij"), 1, 9, -7);
972 test(S("abcde"), 1, 2, S("abcdefghij"), 1, 10, -7);
973 test(S("abcde"), 1, 2, S("abcdefghij"), 5, 0, 2);
974 test(S("abcde"), 1, 2, S("abcdefghij"), 5, 1, -4);
975 test(S("abcde"), 1, 2, S("abcdefghij"), 5, 2, -4);
976 test(S("abcde"), 1, 2, S("abcdefghij"), 5, 4, -4);
977 test(S("abcde"), 1, 2, S("abcdefghij"), 5, 5, -4);
978 test(S("abcde"), 1, 2, S("abcdefghij"), 5, 6, -4);
979 test(S("abcde"), 1, 2, S("abcdefghij"), 9, 0, 2);
980 test(S("abcde"), 1, 2, S("abcdefghij"), 9, 1, -8);
981 test(S("abcde"), 1, 2, S("abcdefghij"), 9, 2, -8);
982 test(S("abcde"), 1, 2, S("abcdefghij"), 10, 0, 2);
983 test(S("abcde"), 1, 2, S("abcdefghij"), 10, 1, 2);
984 test(S("abcde"), 1, 2, S("abcdefghij"), 11, 0, 0);
985 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
986 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 1, 1);
987 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 10, 1);
988 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 19, 1);
989 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 20, 1);
990 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 21, 1);
991 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
992 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 1, 1);
993 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 9, -7);
994 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 18, -16);
995 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 19, -17);
996 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 20, -17);
997 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
998 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 1, -9);
999 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 5, -9);
1000 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 9, -9);
1001 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 10, -9);
1002 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 11, -9);
1003 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
1004 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 1, -18);
1005 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 2, -18);
1006 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
1007 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
1008 test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1009 test(S("abcde"), 1, 3, S(""), 0, 0, 3);
1010 test(S("abcde"), 1, 3, S(""), 0, 1, 3);
1011 test(S("abcde"), 1, 3, S(""), 1, 0, 0);
1012 test(S("abcde"), 1, 3, S("abcde"), 0, 0, 3);
1013 test(S("abcde"), 1, 3, S("abcde"), 0, 1, 1);
1014 test(S("abcde"), 1, 3, S("abcde"), 0, 2, 1);
1015 test(S("abcde"), 1, 3, S("abcde"), 0, 4, 1);
1016 test(S("abcde"), 1, 3, S("abcde"), 0, 5, 1);
1017 test(S("abcde"), 1, 3, S("abcde"), 0, 6, 1);
1018 test(S("abcde"), 1, 3, S("abcde"), 1, 0, 3);
1019 test(S("abcde"), 1, 3, S("abcde"), 1, 1, 2);
1020 test(S("abcde"), 1, 3, S("abcde"), 1, 2, 1);
1021 }
1022
1023 template <class S>
test9()1024 void test9()
1025 {
1026 test(S("abcde"), 1, 3, S("abcde"), 1, 3, 0);
1027 test(S("abcde"), 1, 3, S("abcde"), 1, 4, -1);
1028 test(S("abcde"), 1, 3, S("abcde"), 1, 5, -1);
1029 test(S("abcde"), 1, 3, S("abcde"), 2, 0, 3);
1030 test(S("abcde"), 1, 3, S("abcde"), 2, 1, -1);
1031 test(S("abcde"), 1, 3, S("abcde"), 2, 2, -1);
1032 test(S("abcde"), 1, 3, S("abcde"), 2, 3, -1);
1033 test(S("abcde"), 1, 3, S("abcde"), 2, 4, -1);
1034 test(S("abcde"), 1, 3, S("abcde"), 4, 0, 3);
1035 test(S("abcde"), 1, 3, S("abcde"), 4, 1, -3);
1036 test(S("abcde"), 1, 3, S("abcde"), 4, 2, -3);
1037 test(S("abcde"), 1, 3, S("abcde"), 5, 0, 3);
1038 test(S("abcde"), 1, 3, S("abcde"), 5, 1, 3);
1039 test(S("abcde"), 1, 3, S("abcde"), 6, 0, 0);
1040 test(S("abcde"), 1, 3, S("abcdefghij"), 0, 0, 3);
1041 test(S("abcde"), 1, 3, S("abcdefghij"), 0, 1, 1);
1042 test(S("abcde"), 1, 3, S("abcdefghij"), 0, 5, 1);
1043 test(S("abcde"), 1, 3, S("abcdefghij"), 0, 9, 1);
1044 test(S("abcde"), 1, 3, S("abcdefghij"), 0, 10, 1);
1045 test(S("abcde"), 1, 3, S("abcdefghij"), 0, 11, 1);
1046 test(S("abcde"), 1, 3, S("abcdefghij"), 1, 0, 3);
1047 test(S("abcde"), 1, 3, S("abcdefghij"), 1, 1, 2);
1048 test(S("abcde"), 1, 3, S("abcdefghij"), 1, 4, -1);
1049 test(S("abcde"), 1, 3, S("abcdefghij"), 1, 8, -5);
1050 test(S("abcde"), 1, 3, S("abcdefghij"), 1, 9, -6);
1051 test(S("abcde"), 1, 3, S("abcdefghij"), 1, 10, -6);
1052 test(S("abcde"), 1, 3, S("abcdefghij"), 5, 0, 3);
1053 test(S("abcde"), 1, 3, S("abcdefghij"), 5, 1, -4);
1054 test(S("abcde"), 1, 3, S("abcdefghij"), 5, 2, -4);
1055 test(S("abcde"), 1, 3, S("abcdefghij"), 5, 4, -4);
1056 test(S("abcde"), 1, 3, S("abcdefghij"), 5, 5, -4);
1057 test(S("abcde"), 1, 3, S("abcdefghij"), 5, 6, -4);
1058 test(S("abcde"), 1, 3, S("abcdefghij"), 9, 0, 3);
1059 test(S("abcde"), 1, 3, S("abcdefghij"), 9, 1, -8);
1060 test(S("abcde"), 1, 3, S("abcdefghij"), 9, 2, -8);
1061 test(S("abcde"), 1, 3, S("abcdefghij"), 10, 0, 3);
1062 test(S("abcde"), 1, 3, S("abcdefghij"), 10, 1, 3);
1063 test(S("abcde"), 1, 3, S("abcdefghij"), 11, 0, 0);
1064 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 0, 3);
1065 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 1, 1);
1066 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 10, 1);
1067 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 19, 1);
1068 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 20, 1);
1069 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 21, 1);
1070 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 0, 3);
1071 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 1, 2);
1072 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 9, -6);
1073 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 18, -15);
1074 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 19, -16);
1075 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 20, -16);
1076 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 0, 3);
1077 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 1, -9);
1078 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 5, -9);
1079 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 9, -9);
1080 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 10, -9);
1081 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 11, -9);
1082 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 0, 3);
1083 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 1, -18);
1084 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 2, -18);
1085 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 0, 3);
1086 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 1, 3);
1087 test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 21, 0, 0);
1088 test(S("abcde"), 1, 4, S(""), 0, 0, 4);
1089 test(S("abcde"), 1, 4, S(""), 0, 1, 4);
1090 test(S("abcde"), 1, 4, S(""), 1, 0, 0);
1091 test(S("abcde"), 1, 4, S("abcde"), 0, 0, 4);
1092 test(S("abcde"), 1, 4, S("abcde"), 0, 1, 1);
1093 test(S("abcde"), 1, 4, S("abcde"), 0, 2, 1);
1094 test(S("abcde"), 1, 4, S("abcde"), 0, 4, 1);
1095 test(S("abcde"), 1, 4, S("abcde"), 0, 5, 1);
1096 test(S("abcde"), 1, 4, S("abcde"), 0, 6, 1);
1097 test(S("abcde"), 1, 4, S("abcde"), 1, 0, 4);
1098 test(S("abcde"), 1, 4, S("abcde"), 1, 1, 3);
1099 test(S("abcde"), 1, 4, S("abcde"), 1, 2, 2);
1100 test(S("abcde"), 1, 4, S("abcde"), 1, 3, 1);
1101 test(S("abcde"), 1, 4, S("abcde"), 1, 4, 0);
1102 test(S("abcde"), 1, 4, S("abcde"), 1, 5, 0);
1103 test(S("abcde"), 1, 4, S("abcde"), 2, 0, 4);
1104 test(S("abcde"), 1, 4, S("abcde"), 2, 1, -1);
1105 test(S("abcde"), 1, 4, S("abcde"), 2, 2, -1);
1106 test(S("abcde"), 1, 4, S("abcde"), 2, 3, -1);
1107 test(S("abcde"), 1, 4, S("abcde"), 2, 4, -1);
1108 test(S("abcde"), 1, 4, S("abcde"), 4, 0, 4);
1109 test(S("abcde"), 1, 4, S("abcde"), 4, 1, -3);
1110 test(S("abcde"), 1, 4, S("abcde"), 4, 2, -3);
1111 test(S("abcde"), 1, 4, S("abcde"), 5, 0, 4);
1112 test(S("abcde"), 1, 4, S("abcde"), 5, 1, 4);
1113 test(S("abcde"), 1, 4, S("abcde"), 6, 0, 0);
1114 test(S("abcde"), 1, 4, S("abcdefghij"), 0, 0, 4);
1115 test(S("abcde"), 1, 4, S("abcdefghij"), 0, 1, 1);
1116 test(S("abcde"), 1, 4, S("abcdefghij"), 0, 5, 1);
1117 test(S("abcde"), 1, 4, S("abcdefghij"), 0, 9, 1);
1118 test(S("abcde"), 1, 4, S("abcdefghij"), 0, 10, 1);
1119 test(S("abcde"), 1, 4, S("abcdefghij"), 0, 11, 1);
1120 test(S("abcde"), 1, 4, S("abcdefghij"), 1, 0, 4);
1121 test(S("abcde"), 1, 4, S("abcdefghij"), 1, 1, 3);
1122 test(S("abcde"), 1, 4, S("abcdefghij"), 1, 4, 0);
1123 test(S("abcde"), 1, 4, S("abcdefghij"), 1, 8, -4);
1124 test(S("abcde"), 1, 4, S("abcdefghij"), 1, 9, -5);
1125 test(S("abcde"), 1, 4, S("abcdefghij"), 1, 10, -5);
1126 }
1127
1128 template <class S>
test10()1129 void test10()
1130 {
1131 test(S("abcde"), 1, 4, S("abcdefghij"), 5, 0, 4);
1132 test(S("abcde"), 1, 4, S("abcdefghij"), 5, 1, -4);
1133 test(S("abcde"), 1, 4, S("abcdefghij"), 5, 2, -4);
1134 test(S("abcde"), 1, 4, S("abcdefghij"), 5, 4, -4);
1135 test(S("abcde"), 1, 4, S("abcdefghij"), 5, 5, -4);
1136 test(S("abcde"), 1, 4, S("abcdefghij"), 5, 6, -4);
1137 test(S("abcde"), 1, 4, S("abcdefghij"), 9, 0, 4);
1138 test(S("abcde"), 1, 4, S("abcdefghij"), 9, 1, -8);
1139 test(S("abcde"), 1, 4, S("abcdefghij"), 9, 2, -8);
1140 test(S("abcde"), 1, 4, S("abcdefghij"), 10, 0, 4);
1141 test(S("abcde"), 1, 4, S("abcdefghij"), 10, 1, 4);
1142 test(S("abcde"), 1, 4, S("abcdefghij"), 11, 0, 0);
1143 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
1144 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1);
1145 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1);
1146 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1);
1147 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1);
1148 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1);
1149 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
1150 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3);
1151 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5);
1152 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14);
1153 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15);
1154 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15);
1155 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
1156 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9);
1157 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9);
1158 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9);
1159 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9);
1160 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9);
1161 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
1162 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18);
1163 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18);
1164 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
1165 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
1166 test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
1167 test(S("abcde"), 1, 5, S(""), 0, 0, 4);
1168 test(S("abcde"), 1, 5, S(""), 0, 1, 4);
1169 test(S("abcde"), 1, 5, S(""), 1, 0, 0);
1170 test(S("abcde"), 1, 5, S("abcde"), 0, 0, 4);
1171 test(S("abcde"), 1, 5, S("abcde"), 0, 1, 1);
1172 test(S("abcde"), 1, 5, S("abcde"), 0, 2, 1);
1173 test(S("abcde"), 1, 5, S("abcde"), 0, 4, 1);
1174 test(S("abcde"), 1, 5, S("abcde"), 0, 5, 1);
1175 test(S("abcde"), 1, 5, S("abcde"), 0, 6, 1);
1176 test(S("abcde"), 1, 5, S("abcde"), 1, 0, 4);
1177 test(S("abcde"), 1, 5, S("abcde"), 1, 1, 3);
1178 test(S("abcde"), 1, 5, S("abcde"), 1, 2, 2);
1179 test(S("abcde"), 1, 5, S("abcde"), 1, 3, 1);
1180 test(S("abcde"), 1, 5, S("abcde"), 1, 4, 0);
1181 test(S("abcde"), 1, 5, S("abcde"), 1, 5, 0);
1182 test(S("abcde"), 1, 5, S("abcde"), 2, 0, 4);
1183 test(S("abcde"), 1, 5, S("abcde"), 2, 1, -1);
1184 test(S("abcde"), 1, 5, S("abcde"), 2, 2, -1);
1185 test(S("abcde"), 1, 5, S("abcde"), 2, 3, -1);
1186 test(S("abcde"), 1, 5, S("abcde"), 2, 4, -1);
1187 test(S("abcde"), 1, 5, S("abcde"), 4, 0, 4);
1188 test(S("abcde"), 1, 5, S("abcde"), 4, 1, -3);
1189 test(S("abcde"), 1, 5, S("abcde"), 4, 2, -3);
1190 test(S("abcde"), 1, 5, S("abcde"), 5, 0, 4);
1191 test(S("abcde"), 1, 5, S("abcde"), 5, 1, 4);
1192 test(S("abcde"), 1, 5, S("abcde"), 6, 0, 0);
1193 test(S("abcde"), 1, 5, S("abcdefghij"), 0, 0, 4);
1194 test(S("abcde"), 1, 5, S("abcdefghij"), 0, 1, 1);
1195 test(S("abcde"), 1, 5, S("abcdefghij"), 0, 5, 1);
1196 test(S("abcde"), 1, 5, S("abcdefghij"), 0, 9, 1);
1197 test(S("abcde"), 1, 5, S("abcdefghij"), 0, 10, 1);
1198 test(S("abcde"), 1, 5, S("abcdefghij"), 0, 11, 1);
1199 test(S("abcde"), 1, 5, S("abcdefghij"), 1, 0, 4);
1200 test(S("abcde"), 1, 5, S("abcdefghij"), 1, 1, 3);
1201 test(S("abcde"), 1, 5, S("abcdefghij"), 1, 4, 0);
1202 test(S("abcde"), 1, 5, S("abcdefghij"), 1, 8, -4);
1203 test(S("abcde"), 1, 5, S("abcdefghij"), 1, 9, -5);
1204 test(S("abcde"), 1, 5, S("abcdefghij"), 1, 10, -5);
1205 test(S("abcde"), 1, 5, S("abcdefghij"), 5, 0, 4);
1206 test(S("abcde"), 1, 5, S("abcdefghij"), 5, 1, -4);
1207 test(S("abcde"), 1, 5, S("abcdefghij"), 5, 2, -4);
1208 test(S("abcde"), 1, 5, S("abcdefghij"), 5, 4, -4);
1209 test(S("abcde"), 1, 5, S("abcdefghij"), 5, 5, -4);
1210 test(S("abcde"), 1, 5, S("abcdefghij"), 5, 6, -4);
1211 test(S("abcde"), 1, 5, S("abcdefghij"), 9, 0, 4);
1212 test(S("abcde"), 1, 5, S("abcdefghij"), 9, 1, -8);
1213 test(S("abcde"), 1, 5, S("abcdefghij"), 9, 2, -8);
1214 test(S("abcde"), 1, 5, S("abcdefghij"), 10, 0, 4);
1215 test(S("abcde"), 1, 5, S("abcdefghij"), 10, 1, 4);
1216 test(S("abcde"), 1, 5, S("abcdefghij"), 11, 0, 0);
1217 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 0, 4);
1218 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 1, 1);
1219 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 10, 1);
1220 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 19, 1);
1221 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 20, 1);
1222 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 21, 1);
1223 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 0, 4);
1224 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 1, 3);
1225 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 9, -5);
1226 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 18, -14);
1227 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 19, -15);
1228 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 20, -15);
1229 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 0, 4);
1230 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 1, -9);
1231 }
1232
1233 template <class S>
test11()1234 void test11()
1235 {
1236 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 5, -9);
1237 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 9, -9);
1238 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 10, -9);
1239 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 11, -9);
1240 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 0, 4);
1241 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 1, -18);
1242 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 2, -18);
1243 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 0, 4);
1244 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 1, 4);
1245 test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
1246 test(S("abcde"), 2, 0, S(""), 0, 0, 0);
1247 test(S("abcde"), 2, 0, S(""), 0, 1, 0);
1248 test(S("abcde"), 2, 0, S(""), 1, 0, 0);
1249 test(S("abcde"), 2, 0, S("abcde"), 0, 0, 0);
1250 test(S("abcde"), 2, 0, S("abcde"), 0, 1, -1);
1251 test(S("abcde"), 2, 0, S("abcde"), 0, 2, -2);
1252 test(S("abcde"), 2, 0, S("abcde"), 0, 4, -4);
1253 test(S("abcde"), 2, 0, S("abcde"), 0, 5, -5);
1254 test(S("abcde"), 2, 0, S("abcde"), 0, 6, -5);
1255 test(S("abcde"), 2, 0, S("abcde"), 1, 0, 0);
1256 test(S("abcde"), 2, 0, S("abcde"), 1, 1, -1);
1257 test(S("abcde"), 2, 0, S("abcde"), 1, 2, -2);
1258 test(S("abcde"), 2, 0, S("abcde"), 1, 3, -3);
1259 test(S("abcde"), 2, 0, S("abcde"), 1, 4, -4);
1260 test(S("abcde"), 2, 0, S("abcde"), 1, 5, -4);
1261 test(S("abcde"), 2, 0, S("abcde"), 2, 0, 0);
1262 test(S("abcde"), 2, 0, S("abcde"), 2, 1, -1);
1263 test(S("abcde"), 2, 0, S("abcde"), 2, 2, -2);
1264 test(S("abcde"), 2, 0, S("abcde"), 2, 3, -3);
1265 test(S("abcde"), 2, 0, S("abcde"), 2, 4, -3);
1266 test(S("abcde"), 2, 0, S("abcde"), 4, 0, 0);
1267 test(S("abcde"), 2, 0, S("abcde"), 4, 1, -1);
1268 test(S("abcde"), 2, 0, S("abcde"), 4, 2, -1);
1269 test(S("abcde"), 2, 0, S("abcde"), 5, 0, 0);
1270 test(S("abcde"), 2, 0, S("abcde"), 5, 1, 0);
1271 test(S("abcde"), 2, 0, S("abcde"), 6, 0, 0);
1272 test(S("abcde"), 2, 0, S("abcdefghij"), 0, 0, 0);
1273 test(S("abcde"), 2, 0, S("abcdefghij"), 0, 1, -1);
1274 test(S("abcde"), 2, 0, S("abcdefghij"), 0, 5, -5);
1275 test(S("abcde"), 2, 0, S("abcdefghij"), 0, 9, -9);
1276 test(S("abcde"), 2, 0, S("abcdefghij"), 0, 10, -10);
1277 test(S("abcde"), 2, 0, S("abcdefghij"), 0, 11, -10);
1278 test(S("abcde"), 2, 0, S("abcdefghij"), 1, 0, 0);
1279 test(S("abcde"), 2, 0, S("abcdefghij"), 1, 1, -1);
1280 test(S("abcde"), 2, 0, S("abcdefghij"), 1, 4, -4);
1281 test(S("abcde"), 2, 0, S("abcdefghij"), 1, 8, -8);
1282 test(S("abcde"), 2, 0, S("abcdefghij"), 1, 9, -9);
1283 test(S("abcde"), 2, 0, S("abcdefghij"), 1, 10, -9);
1284 test(S("abcde"), 2, 0, S("abcdefghij"), 5, 0, 0);
1285 test(S("abcde"), 2, 0, S("abcdefghij"), 5, 1, -1);
1286 test(S("abcde"), 2, 0, S("abcdefghij"), 5, 2, -2);
1287 test(S("abcde"), 2, 0, S("abcdefghij"), 5, 4, -4);
1288 test(S("abcde"), 2, 0, S("abcdefghij"), 5, 5, -5);
1289 test(S("abcde"), 2, 0, S("abcdefghij"), 5, 6, -5);
1290 test(S("abcde"), 2, 0, S("abcdefghij"), 9, 0, 0);
1291 test(S("abcde"), 2, 0, S("abcdefghij"), 9, 1, -1);
1292 test(S("abcde"), 2, 0, S("abcdefghij"), 9, 2, -1);
1293 test(S("abcde"), 2, 0, S("abcdefghij"), 10, 0, 0);
1294 test(S("abcde"), 2, 0, S("abcdefghij"), 10, 1, 0);
1295 test(S("abcde"), 2, 0, S("abcdefghij"), 11, 0, 0);
1296 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1297 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1298 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1299 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1300 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1301 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1302 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1303 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1304 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1305 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1306 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1307 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1308 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1309 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1310 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1311 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1312 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1313 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1314 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1315 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1316 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1317 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1318 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1319 test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1320 test(S("abcde"), 2, 1, S(""), 0, 0, 1);
1321 test(S("abcde"), 2, 1, S(""), 0, 1, 1);
1322 test(S("abcde"), 2, 1, S(""), 1, 0, 0);
1323 test(S("abcde"), 2, 1, S("abcde"), 0, 0, 1);
1324 test(S("abcde"), 2, 1, S("abcde"), 0, 1, 2);
1325 test(S("abcde"), 2, 1, S("abcde"), 0, 2, 2);
1326 test(S("abcde"), 2, 1, S("abcde"), 0, 4, 2);
1327 test(S("abcde"), 2, 1, S("abcde"), 0, 5, 2);
1328 test(S("abcde"), 2, 1, S("abcde"), 0, 6, 2);
1329 test(S("abcde"), 2, 1, S("abcde"), 1, 0, 1);
1330 test(S("abcde"), 2, 1, S("abcde"), 1, 1, 1);
1331 test(S("abcde"), 2, 1, S("abcde"), 1, 2, 1);
1332 test(S("abcde"), 2, 1, S("abcde"), 1, 3, 1);
1333 test(S("abcde"), 2, 1, S("abcde"), 1, 4, 1);
1334 test(S("abcde"), 2, 1, S("abcde"), 1, 5, 1);
1335 test(S("abcde"), 2, 1, S("abcde"), 2, 0, 1);
1336 }
1337
1338 template <class S>
test12()1339 void test12()
1340 {
1341 test(S("abcde"), 2, 1, S("abcde"), 2, 1, 0);
1342 test(S("abcde"), 2, 1, S("abcde"), 2, 2, -1);
1343 test(S("abcde"), 2, 1, S("abcde"), 2, 3, -2);
1344 test(S("abcde"), 2, 1, S("abcde"), 2, 4, -2);
1345 test(S("abcde"), 2, 1, S("abcde"), 4, 0, 1);
1346 test(S("abcde"), 2, 1, S("abcde"), 4, 1, -2);
1347 test(S("abcde"), 2, 1, S("abcde"), 4, 2, -2);
1348 test(S("abcde"), 2, 1, S("abcde"), 5, 0, 1);
1349 test(S("abcde"), 2, 1, S("abcde"), 5, 1, 1);
1350 test(S("abcde"), 2, 1, S("abcde"), 6, 0, 0);
1351 test(S("abcde"), 2, 1, S("abcdefghij"), 0, 0, 1);
1352 test(S("abcde"), 2, 1, S("abcdefghij"), 0, 1, 2);
1353 test(S("abcde"), 2, 1, S("abcdefghij"), 0, 5, 2);
1354 test(S("abcde"), 2, 1, S("abcdefghij"), 0, 9, 2);
1355 test(S("abcde"), 2, 1, S("abcdefghij"), 0, 10, 2);
1356 test(S("abcde"), 2, 1, S("abcdefghij"), 0, 11, 2);
1357 test(S("abcde"), 2, 1, S("abcdefghij"), 1, 0, 1);
1358 test(S("abcde"), 2, 1, S("abcdefghij"), 1, 1, 1);
1359 test(S("abcde"), 2, 1, S("abcdefghij"), 1, 4, 1);
1360 test(S("abcde"), 2, 1, S("abcdefghij"), 1, 8, 1);
1361 test(S("abcde"), 2, 1, S("abcdefghij"), 1, 9, 1);
1362 test(S("abcde"), 2, 1, S("abcdefghij"), 1, 10, 1);
1363 test(S("abcde"), 2, 1, S("abcdefghij"), 5, 0, 1);
1364 test(S("abcde"), 2, 1, S("abcdefghij"), 5, 1, -3);
1365 test(S("abcde"), 2, 1, S("abcdefghij"), 5, 2, -3);
1366 test(S("abcde"), 2, 1, S("abcdefghij"), 5, 4, -3);
1367 test(S("abcde"), 2, 1, S("abcdefghij"), 5, 5, -3);
1368 test(S("abcde"), 2, 1, S("abcdefghij"), 5, 6, -3);
1369 test(S("abcde"), 2, 1, S("abcdefghij"), 9, 0, 1);
1370 test(S("abcde"), 2, 1, S("abcdefghij"), 9, 1, -7);
1371 test(S("abcde"), 2, 1, S("abcdefghij"), 9, 2, -7);
1372 test(S("abcde"), 2, 1, S("abcdefghij"), 10, 0, 1);
1373 test(S("abcde"), 2, 1, S("abcdefghij"), 10, 1, 1);
1374 test(S("abcde"), 2, 1, S("abcdefghij"), 11, 0, 0);
1375 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
1376 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 1, 2);
1377 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 10, 2);
1378 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 19, 2);
1379 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 20, 2);
1380 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 21, 2);
1381 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
1382 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 1, 1);
1383 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 9, 1);
1384 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 18, 1);
1385 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 19, 1);
1386 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 20, 1);
1387 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
1388 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 1, -8);
1389 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 5, -8);
1390 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 9, -8);
1391 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 10, -8);
1392 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 11, -8);
1393 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
1394 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 1, -17);
1395 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 2, -17);
1396 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
1397 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
1398 test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
1399 test(S("abcde"), 2, 2, S(""), 0, 0, 2);
1400 test(S("abcde"), 2, 2, S(""), 0, 1, 2);
1401 test(S("abcde"), 2, 2, S(""), 1, 0, 0);
1402 test(S("abcde"), 2, 2, S("abcde"), 0, 0, 2);
1403 test(S("abcde"), 2, 2, S("abcde"), 0, 1, 2);
1404 test(S("abcde"), 2, 2, S("abcde"), 0, 2, 2);
1405 test(S("abcde"), 2, 2, S("abcde"), 0, 4, 2);
1406 test(S("abcde"), 2, 2, S("abcde"), 0, 5, 2);
1407 test(S("abcde"), 2, 2, S("abcde"), 0, 6, 2);
1408 test(S("abcde"), 2, 2, S("abcde"), 1, 0, 2);
1409 test(S("abcde"), 2, 2, S("abcde"), 1, 1, 1);
1410 test(S("abcde"), 2, 2, S("abcde"), 1, 2, 1);
1411 test(S("abcde"), 2, 2, S("abcde"), 1, 3, 1);
1412 test(S("abcde"), 2, 2, S("abcde"), 1, 4, 1);
1413 test(S("abcde"), 2, 2, S("abcde"), 1, 5, 1);
1414 test(S("abcde"), 2, 2, S("abcde"), 2, 0, 2);
1415 test(S("abcde"), 2, 2, S("abcde"), 2, 1, 1);
1416 test(S("abcde"), 2, 2, S("abcde"), 2, 2, 0);
1417 test(S("abcde"), 2, 2, S("abcde"), 2, 3, -1);
1418 test(S("abcde"), 2, 2, S("abcde"), 2, 4, -1);
1419 test(S("abcde"), 2, 2, S("abcde"), 4, 0, 2);
1420 test(S("abcde"), 2, 2, S("abcde"), 4, 1, -2);
1421 test(S("abcde"), 2, 2, S("abcde"), 4, 2, -2);
1422 test(S("abcde"), 2, 2, S("abcde"), 5, 0, 2);
1423 test(S("abcde"), 2, 2, S("abcde"), 5, 1, 2);
1424 test(S("abcde"), 2, 2, S("abcde"), 6, 0, 0);
1425 test(S("abcde"), 2, 2, S("abcdefghij"), 0, 0, 2);
1426 test(S("abcde"), 2, 2, S("abcdefghij"), 0, 1, 2);
1427 test(S("abcde"), 2, 2, S("abcdefghij"), 0, 5, 2);
1428 test(S("abcde"), 2, 2, S("abcdefghij"), 0, 9, 2);
1429 test(S("abcde"), 2, 2, S("abcdefghij"), 0, 10, 2);
1430 test(S("abcde"), 2, 2, S("abcdefghij"), 0, 11, 2);
1431 test(S("abcde"), 2, 2, S("abcdefghij"), 1, 0, 2);
1432 test(S("abcde"), 2, 2, S("abcdefghij"), 1, 1, 1);
1433 test(S("abcde"), 2, 2, S("abcdefghij"), 1, 4, 1);
1434 test(S("abcde"), 2, 2, S("abcdefghij"), 1, 8, 1);
1435 test(S("abcde"), 2, 2, S("abcdefghij"), 1, 9, 1);
1436 test(S("abcde"), 2, 2, S("abcdefghij"), 1, 10, 1);
1437 test(S("abcde"), 2, 2, S("abcdefghij"), 5, 0, 2);
1438 test(S("abcde"), 2, 2, S("abcdefghij"), 5, 1, -3);
1439 test(S("abcde"), 2, 2, S("abcdefghij"), 5, 2, -3);
1440 test(S("abcde"), 2, 2, S("abcdefghij"), 5, 4, -3);
1441 }
1442
1443 template <class S>
test13()1444 void test13()
1445 {
1446 test(S("abcde"), 2, 2, S("abcdefghij"), 5, 5, -3);
1447 test(S("abcde"), 2, 2, S("abcdefghij"), 5, 6, -3);
1448 test(S("abcde"), 2, 2, S("abcdefghij"), 9, 0, 2);
1449 test(S("abcde"), 2, 2, S("abcdefghij"), 9, 1, -7);
1450 test(S("abcde"), 2, 2, S("abcdefghij"), 9, 2, -7);
1451 test(S("abcde"), 2, 2, S("abcdefghij"), 10, 0, 2);
1452 test(S("abcde"), 2, 2, S("abcdefghij"), 10, 1, 2);
1453 test(S("abcde"), 2, 2, S("abcdefghij"), 11, 0, 0);
1454 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
1455 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 1, 2);
1456 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 10, 2);
1457 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 19, 2);
1458 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 20, 2);
1459 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 21, 2);
1460 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
1461 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 1, 1);
1462 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 9, 1);
1463 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 18, 1);
1464 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 19, 1);
1465 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 20, 1);
1466 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
1467 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 1, -8);
1468 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 5, -8);
1469 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 9, -8);
1470 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 10, -8);
1471 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 11, -8);
1472 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
1473 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 1, -17);
1474 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 2, -17);
1475 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
1476 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
1477 test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1478 test(S("abcde"), 2, 3, S(""), 0, 0, 3);
1479 test(S("abcde"), 2, 3, S(""), 0, 1, 3);
1480 test(S("abcde"), 2, 3, S(""), 1, 0, 0);
1481 test(S("abcde"), 2, 3, S("abcde"), 0, 0, 3);
1482 test(S("abcde"), 2, 3, S("abcde"), 0, 1, 2);
1483 test(S("abcde"), 2, 3, S("abcde"), 0, 2, 2);
1484 test(S("abcde"), 2, 3, S("abcde"), 0, 4, 2);
1485 test(S("abcde"), 2, 3, S("abcde"), 0, 5, 2);
1486 test(S("abcde"), 2, 3, S("abcde"), 0, 6, 2);
1487 test(S("abcde"), 2, 3, S("abcde"), 1, 0, 3);
1488 test(S("abcde"), 2, 3, S("abcde"), 1, 1, 1);
1489 test(S("abcde"), 2, 3, S("abcde"), 1, 2, 1);
1490 test(S("abcde"), 2, 3, S("abcde"), 1, 3, 1);
1491 test(S("abcde"), 2, 3, S("abcde"), 1, 4, 1);
1492 test(S("abcde"), 2, 3, S("abcde"), 1, 5, 1);
1493 test(S("abcde"), 2, 3, S("abcde"), 2, 0, 3);
1494 test(S("abcde"), 2, 3, S("abcde"), 2, 1, 2);
1495 test(S("abcde"), 2, 3, S("abcde"), 2, 2, 1);
1496 test(S("abcde"), 2, 3, S("abcde"), 2, 3, 0);
1497 test(S("abcde"), 2, 3, S("abcde"), 2, 4, 0);
1498 test(S("abcde"), 2, 3, S("abcde"), 4, 0, 3);
1499 test(S("abcde"), 2, 3, S("abcde"), 4, 1, -2);
1500 test(S("abcde"), 2, 3, S("abcde"), 4, 2, -2);
1501 test(S("abcde"), 2, 3, S("abcde"), 5, 0, 3);
1502 test(S("abcde"), 2, 3, S("abcde"), 5, 1, 3);
1503 test(S("abcde"), 2, 3, S("abcde"), 6, 0, 0);
1504 test(S("abcde"), 2, 3, S("abcdefghij"), 0, 0, 3);
1505 test(S("abcde"), 2, 3, S("abcdefghij"), 0, 1, 2);
1506 test(S("abcde"), 2, 3, S("abcdefghij"), 0, 5, 2);
1507 test(S("abcde"), 2, 3, S("abcdefghij"), 0, 9, 2);
1508 test(S("abcde"), 2, 3, S("abcdefghij"), 0, 10, 2);
1509 test(S("abcde"), 2, 3, S("abcdefghij"), 0, 11, 2);
1510 test(S("abcde"), 2, 3, S("abcdefghij"), 1, 0, 3);
1511 test(S("abcde"), 2, 3, S("abcdefghij"), 1, 1, 1);
1512 test(S("abcde"), 2, 3, S("abcdefghij"), 1, 4, 1);
1513 test(S("abcde"), 2, 3, S("abcdefghij"), 1, 8, 1);
1514 test(S("abcde"), 2, 3, S("abcdefghij"), 1, 9, 1);
1515 test(S("abcde"), 2, 3, S("abcdefghij"), 1, 10, 1);
1516 test(S("abcde"), 2, 3, S("abcdefghij"), 5, 0, 3);
1517 test(S("abcde"), 2, 3, S("abcdefghij"), 5, 1, -3);
1518 test(S("abcde"), 2, 3, S("abcdefghij"), 5, 2, -3);
1519 test(S("abcde"), 2, 3, S("abcdefghij"), 5, 4, -3);
1520 test(S("abcde"), 2, 3, S("abcdefghij"), 5, 5, -3);
1521 test(S("abcde"), 2, 3, S("abcdefghij"), 5, 6, -3);
1522 test(S("abcde"), 2, 3, S("abcdefghij"), 9, 0, 3);
1523 test(S("abcde"), 2, 3, S("abcdefghij"), 9, 1, -7);
1524 test(S("abcde"), 2, 3, S("abcdefghij"), 9, 2, -7);
1525 test(S("abcde"), 2, 3, S("abcdefghij"), 10, 0, 3);
1526 test(S("abcde"), 2, 3, S("abcdefghij"), 10, 1, 3);
1527 test(S("abcde"), 2, 3, S("abcdefghij"), 11, 0, 0);
1528 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 0, 3);
1529 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 1, 2);
1530 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 10, 2);
1531 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 19, 2);
1532 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 20, 2);
1533 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 21, 2);
1534 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 0, 3);
1535 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 1, 1);
1536 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 9, 1);
1537 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 18, 1);
1538 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 19, 1);
1539 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 20, 1);
1540 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 0, 3);
1541 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 1, -8);
1542 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 5, -8);
1543 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 9, -8);
1544 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 10, -8);
1545 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 11, -8);
1546 }
1547
1548 template <class S>
test14()1549 void test14()
1550 {
1551 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 0, 3);
1552 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 1, -17);
1553 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 2, -17);
1554 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 0, 3);
1555 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 1, 3);
1556 test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 21, 0, 0);
1557 test(S("abcde"), 2, 4, S(""), 0, 0, 3);
1558 test(S("abcde"), 2, 4, S(""), 0, 1, 3);
1559 test(S("abcde"), 2, 4, S(""), 1, 0, 0);
1560 test(S("abcde"), 2, 4, S("abcde"), 0, 0, 3);
1561 test(S("abcde"), 2, 4, S("abcde"), 0, 1, 2);
1562 test(S("abcde"), 2, 4, S("abcde"), 0, 2, 2);
1563 test(S("abcde"), 2, 4, S("abcde"), 0, 4, 2);
1564 test(S("abcde"), 2, 4, S("abcde"), 0, 5, 2);
1565 test(S("abcde"), 2, 4, S("abcde"), 0, 6, 2);
1566 test(S("abcde"), 2, 4, S("abcde"), 1, 0, 3);
1567 test(S("abcde"), 2, 4, S("abcde"), 1, 1, 1);
1568 test(S("abcde"), 2, 4, S("abcde"), 1, 2, 1);
1569 test(S("abcde"), 2, 4, S("abcde"), 1, 3, 1);
1570 test(S("abcde"), 2, 4, S("abcde"), 1, 4, 1);
1571 test(S("abcde"), 2, 4, S("abcde"), 1, 5, 1);
1572 test(S("abcde"), 2, 4, S("abcde"), 2, 0, 3);
1573 test(S("abcde"), 2, 4, S("abcde"), 2, 1, 2);
1574 test(S("abcde"), 2, 4, S("abcde"), 2, 2, 1);
1575 test(S("abcde"), 2, 4, S("abcde"), 2, 3, 0);
1576 test(S("abcde"), 2, 4, S("abcde"), 2, 4, 0);
1577 test(S("abcde"), 2, 4, S("abcde"), 4, 0, 3);
1578 test(S("abcde"), 2, 4, S("abcde"), 4, 1, -2);
1579 test(S("abcde"), 2, 4, S("abcde"), 4, 2, -2);
1580 test(S("abcde"), 2, 4, S("abcde"), 5, 0, 3);
1581 test(S("abcde"), 2, 4, S("abcde"), 5, 1, 3);
1582 test(S("abcde"), 2, 4, S("abcde"), 6, 0, 0);
1583 test(S("abcde"), 2, 4, S("abcdefghij"), 0, 0, 3);
1584 test(S("abcde"), 2, 4, S("abcdefghij"), 0, 1, 2);
1585 test(S("abcde"), 2, 4, S("abcdefghij"), 0, 5, 2);
1586 test(S("abcde"), 2, 4, S("abcdefghij"), 0, 9, 2);
1587 test(S("abcde"), 2, 4, S("abcdefghij"), 0, 10, 2);
1588 test(S("abcde"), 2, 4, S("abcdefghij"), 0, 11, 2);
1589 test(S("abcde"), 2, 4, S("abcdefghij"), 1, 0, 3);
1590 test(S("abcde"), 2, 4, S("abcdefghij"), 1, 1, 1);
1591 test(S("abcde"), 2, 4, S("abcdefghij"), 1, 4, 1);
1592 test(S("abcde"), 2, 4, S("abcdefghij"), 1, 8, 1);
1593 test(S("abcde"), 2, 4, S("abcdefghij"), 1, 9, 1);
1594 test(S("abcde"), 2, 4, S("abcdefghij"), 1, 10, 1);
1595 test(S("abcde"), 2, 4, S("abcdefghij"), 5, 0, 3);
1596 test(S("abcde"), 2, 4, S("abcdefghij"), 5, 1, -3);
1597 test(S("abcde"), 2, 4, S("abcdefghij"), 5, 2, -3);
1598 test(S("abcde"), 2, 4, S("abcdefghij"), 5, 4, -3);
1599 test(S("abcde"), 2, 4, S("abcdefghij"), 5, 5, -3);
1600 test(S("abcde"), 2, 4, S("abcdefghij"), 5, 6, -3);
1601 test(S("abcde"), 2, 4, S("abcdefghij"), 9, 0, 3);
1602 test(S("abcde"), 2, 4, S("abcdefghij"), 9, 1, -7);
1603 test(S("abcde"), 2, 4, S("abcdefghij"), 9, 2, -7);
1604 test(S("abcde"), 2, 4, S("abcdefghij"), 10, 0, 3);
1605 test(S("abcde"), 2, 4, S("abcdefghij"), 10, 1, 3);
1606 test(S("abcde"), 2, 4, S("abcdefghij"), 11, 0, 0);
1607 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 0, 3);
1608 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 1, 2);
1609 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 10, 2);
1610 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 19, 2);
1611 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 20, 2);
1612 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 21, 2);
1613 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 0, 3);
1614 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 1, 1);
1615 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 9, 1);
1616 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 18, 1);
1617 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 19, 1);
1618 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 20, 1);
1619 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 0, 3);
1620 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 1, -8);
1621 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 5, -8);
1622 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 9, -8);
1623 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 10, -8);
1624 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 11, -8);
1625 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 0, 3);
1626 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 1, -17);
1627 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 2, -17);
1628 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 0, 3);
1629 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 1, 3);
1630 test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
1631 test(S("abcde"), 4, 0, S(""), 0, 0, 0);
1632 test(S("abcde"), 4, 0, S(""), 0, 1, 0);
1633 test(S("abcde"), 4, 0, S(""), 1, 0, 0);
1634 test(S("abcde"), 4, 0, S("abcde"), 0, 0, 0);
1635 test(S("abcde"), 4, 0, S("abcde"), 0, 1, -1);
1636 test(S("abcde"), 4, 0, S("abcde"), 0, 2, -2);
1637 test(S("abcde"), 4, 0, S("abcde"), 0, 4, -4);
1638 test(S("abcde"), 4, 0, S("abcde"), 0, 5, -5);
1639 test(S("abcde"), 4, 0, S("abcde"), 0, 6, -5);
1640 test(S("abcde"), 4, 0, S("abcde"), 1, 0, 0);
1641 test(S("abcde"), 4, 0, S("abcde"), 1, 1, -1);
1642 test(S("abcde"), 4, 0, S("abcde"), 1, 2, -2);
1643 test(S("abcde"), 4, 0, S("abcde"), 1, 3, -3);
1644 test(S("abcde"), 4, 0, S("abcde"), 1, 4, -4);
1645 test(S("abcde"), 4, 0, S("abcde"), 1, 5, -4);
1646 test(S("abcde"), 4, 0, S("abcde"), 2, 0, 0);
1647 test(S("abcde"), 4, 0, S("abcde"), 2, 1, -1);
1648 test(S("abcde"), 4, 0, S("abcde"), 2, 2, -2);
1649 test(S("abcde"), 4, 0, S("abcde"), 2, 3, -3);
1650 test(S("abcde"), 4, 0, S("abcde"), 2, 4, -3);
1651 }
1652
1653 template <class S>
test15()1654 void test15()
1655 {
1656 test(S("abcde"), 4, 0, S("abcde"), 4, 0, 0);
1657 test(S("abcde"), 4, 0, S("abcde"), 4, 1, -1);
1658 test(S("abcde"), 4, 0, S("abcde"), 4, 2, -1);
1659 test(S("abcde"), 4, 0, S("abcde"), 5, 0, 0);
1660 test(S("abcde"), 4, 0, S("abcde"), 5, 1, 0);
1661 test(S("abcde"), 4, 0, S("abcde"), 6, 0, 0);
1662 test(S("abcde"), 4, 0, S("abcdefghij"), 0, 0, 0);
1663 test(S("abcde"), 4, 0, S("abcdefghij"), 0, 1, -1);
1664 test(S("abcde"), 4, 0, S("abcdefghij"), 0, 5, -5);
1665 test(S("abcde"), 4, 0, S("abcdefghij"), 0, 9, -9);
1666 test(S("abcde"), 4, 0, S("abcdefghij"), 0, 10, -10);
1667 test(S("abcde"), 4, 0, S("abcdefghij"), 0, 11, -10);
1668 test(S("abcde"), 4, 0, S("abcdefghij"), 1, 0, 0);
1669 test(S("abcde"), 4, 0, S("abcdefghij"), 1, 1, -1);
1670 test(S("abcde"), 4, 0, S("abcdefghij"), 1, 4, -4);
1671 test(S("abcde"), 4, 0, S("abcdefghij"), 1, 8, -8);
1672 test(S("abcde"), 4, 0, S("abcdefghij"), 1, 9, -9);
1673 test(S("abcde"), 4, 0, S("abcdefghij"), 1, 10, -9);
1674 test(S("abcde"), 4, 0, S("abcdefghij"), 5, 0, 0);
1675 test(S("abcde"), 4, 0, S("abcdefghij"), 5, 1, -1);
1676 test(S("abcde"), 4, 0, S("abcdefghij"), 5, 2, -2);
1677 test(S("abcde"), 4, 0, S("abcdefghij"), 5, 4, -4);
1678 test(S("abcde"), 4, 0, S("abcdefghij"), 5, 5, -5);
1679 test(S("abcde"), 4, 0, S("abcdefghij"), 5, 6, -5);
1680 test(S("abcde"), 4, 0, S("abcdefghij"), 9, 0, 0);
1681 test(S("abcde"), 4, 0, S("abcdefghij"), 9, 1, -1);
1682 test(S("abcde"), 4, 0, S("abcdefghij"), 9, 2, -1);
1683 test(S("abcde"), 4, 0, S("abcdefghij"), 10, 0, 0);
1684 test(S("abcde"), 4, 0, S("abcdefghij"), 10, 1, 0);
1685 test(S("abcde"), 4, 0, S("abcdefghij"), 11, 0, 0);
1686 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1687 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1688 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1689 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1690 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1691 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1692 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1693 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1694 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1695 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1696 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1697 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1698 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1699 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1700 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1701 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1702 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1703 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1704 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1705 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1706 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1707 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1708 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1709 test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1710 test(S("abcde"), 4, 1, S(""), 0, 0, 1);
1711 test(S("abcde"), 4, 1, S(""), 0, 1, 1);
1712 test(S("abcde"), 4, 1, S(""), 1, 0, 0);
1713 test(S("abcde"), 4, 1, S("abcde"), 0, 0, 1);
1714 test(S("abcde"), 4, 1, S("abcde"), 0, 1, 4);
1715 test(S("abcde"), 4, 1, S("abcde"), 0, 2, 4);
1716 test(S("abcde"), 4, 1, S("abcde"), 0, 4, 4);
1717 test(S("abcde"), 4, 1, S("abcde"), 0, 5, 4);
1718 test(S("abcde"), 4, 1, S("abcde"), 0, 6, 4);
1719 test(S("abcde"), 4, 1, S("abcde"), 1, 0, 1);
1720 test(S("abcde"), 4, 1, S("abcde"), 1, 1, 3);
1721 test(S("abcde"), 4, 1, S("abcde"), 1, 2, 3);
1722 test(S("abcde"), 4, 1, S("abcde"), 1, 3, 3);
1723 test(S("abcde"), 4, 1, S("abcde"), 1, 4, 3);
1724 test(S("abcde"), 4, 1, S("abcde"), 1, 5, 3);
1725 test(S("abcde"), 4, 1, S("abcde"), 2, 0, 1);
1726 test(S("abcde"), 4, 1, S("abcde"), 2, 1, 2);
1727 test(S("abcde"), 4, 1, S("abcde"), 2, 2, 2);
1728 test(S("abcde"), 4, 1, S("abcde"), 2, 3, 2);
1729 test(S("abcde"), 4, 1, S("abcde"), 2, 4, 2);
1730 test(S("abcde"), 4, 1, S("abcde"), 4, 0, 1);
1731 test(S("abcde"), 4, 1, S("abcde"), 4, 1, 0);
1732 test(S("abcde"), 4, 1, S("abcde"), 4, 2, 0);
1733 test(S("abcde"), 4, 1, S("abcde"), 5, 0, 1);
1734 test(S("abcde"), 4, 1, S("abcde"), 5, 1, 1);
1735 test(S("abcde"), 4, 1, S("abcde"), 6, 0, 0);
1736 test(S("abcde"), 4, 1, S("abcdefghij"), 0, 0, 1);
1737 test(S("abcde"), 4, 1, S("abcdefghij"), 0, 1, 4);
1738 test(S("abcde"), 4, 1, S("abcdefghij"), 0, 5, 4);
1739 test(S("abcde"), 4, 1, S("abcdefghij"), 0, 9, 4);
1740 test(S("abcde"), 4, 1, S("abcdefghij"), 0, 10, 4);
1741 test(S("abcde"), 4, 1, S("abcdefghij"), 0, 11, 4);
1742 test(S("abcde"), 4, 1, S("abcdefghij"), 1, 0, 1);
1743 test(S("abcde"), 4, 1, S("abcdefghij"), 1, 1, 3);
1744 test(S("abcde"), 4, 1, S("abcdefghij"), 1, 4, 3);
1745 test(S("abcde"), 4, 1, S("abcdefghij"), 1, 8, 3);
1746 test(S("abcde"), 4, 1, S("abcdefghij"), 1, 9, 3);
1747 test(S("abcde"), 4, 1, S("abcdefghij"), 1, 10, 3);
1748 test(S("abcde"), 4, 1, S("abcdefghij"), 5, 0, 1);
1749 test(S("abcde"), 4, 1, S("abcdefghij"), 5, 1, -1);
1750 test(S("abcde"), 4, 1, S("abcdefghij"), 5, 2, -1);
1751 test(S("abcde"), 4, 1, S("abcdefghij"), 5, 4, -1);
1752 test(S("abcde"), 4, 1, S("abcdefghij"), 5, 5, -1);
1753 test(S("abcde"), 4, 1, S("abcdefghij"), 5, 6, -1);
1754 test(S("abcde"), 4, 1, S("abcdefghij"), 9, 0, 1);
1755 test(S("abcde"), 4, 1, S("abcdefghij"), 9, 1, -5);
1756 }
1757
1758 template <class S>
test16()1759 void test16()
1760 {
1761 test(S("abcde"), 4, 1, S("abcdefghij"), 9, 2, -5);
1762 test(S("abcde"), 4, 1, S("abcdefghij"), 10, 0, 1);
1763 test(S("abcde"), 4, 1, S("abcdefghij"), 10, 1, 1);
1764 test(S("abcde"), 4, 1, S("abcdefghij"), 11, 0, 0);
1765 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
1766 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 1, 4);
1767 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 10, 4);
1768 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 19, 4);
1769 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 20, 4);
1770 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 21, 4);
1771 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
1772 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 1, 3);
1773 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 9, 3);
1774 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 18, 3);
1775 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 19, 3);
1776 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 20, 3);
1777 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
1778 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 1, -6);
1779 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 5, -6);
1780 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 9, -6);
1781 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 10, -6);
1782 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 11, -6);
1783 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
1784 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 1, -15);
1785 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 2, -15);
1786 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
1787 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
1788 test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
1789 test(S("abcde"), 4, 2, S(""), 0, 0, 1);
1790 test(S("abcde"), 4, 2, S(""), 0, 1, 1);
1791 test(S("abcde"), 4, 2, S(""), 1, 0, 0);
1792 test(S("abcde"), 4, 2, S("abcde"), 0, 0, 1);
1793 test(S("abcde"), 4, 2, S("abcde"), 0, 1, 4);
1794 test(S("abcde"), 4, 2, S("abcde"), 0, 2, 4);
1795 test(S("abcde"), 4, 2, S("abcde"), 0, 4, 4);
1796 test(S("abcde"), 4, 2, S("abcde"), 0, 5, 4);
1797 test(S("abcde"), 4, 2, S("abcde"), 0, 6, 4);
1798 test(S("abcde"), 4, 2, S("abcde"), 1, 0, 1);
1799 test(S("abcde"), 4, 2, S("abcde"), 1, 1, 3);
1800 test(S("abcde"), 4, 2, S("abcde"), 1, 2, 3);
1801 test(S("abcde"), 4, 2, S("abcde"), 1, 3, 3);
1802 test(S("abcde"), 4, 2, S("abcde"), 1, 4, 3);
1803 test(S("abcde"), 4, 2, S("abcde"), 1, 5, 3);
1804 test(S("abcde"), 4, 2, S("abcde"), 2, 0, 1);
1805 test(S("abcde"), 4, 2, S("abcde"), 2, 1, 2);
1806 test(S("abcde"), 4, 2, S("abcde"), 2, 2, 2);
1807 test(S("abcde"), 4, 2, S("abcde"), 2, 3, 2);
1808 test(S("abcde"), 4, 2, S("abcde"), 2, 4, 2);
1809 test(S("abcde"), 4, 2, S("abcde"), 4, 0, 1);
1810 test(S("abcde"), 4, 2, S("abcde"), 4, 1, 0);
1811 test(S("abcde"), 4, 2, S("abcde"), 4, 2, 0);
1812 test(S("abcde"), 4, 2, S("abcde"), 5, 0, 1);
1813 test(S("abcde"), 4, 2, S("abcde"), 5, 1, 1);
1814 test(S("abcde"), 4, 2, S("abcde"), 6, 0, 0);
1815 test(S("abcde"), 4, 2, S("abcdefghij"), 0, 0, 1);
1816 test(S("abcde"), 4, 2, S("abcdefghij"), 0, 1, 4);
1817 test(S("abcde"), 4, 2, S("abcdefghij"), 0, 5, 4);
1818 test(S("abcde"), 4, 2, S("abcdefghij"), 0, 9, 4);
1819 test(S("abcde"), 4, 2, S("abcdefghij"), 0, 10, 4);
1820 test(S("abcde"), 4, 2, S("abcdefghij"), 0, 11, 4);
1821 test(S("abcde"), 4, 2, S("abcdefghij"), 1, 0, 1);
1822 test(S("abcde"), 4, 2, S("abcdefghij"), 1, 1, 3);
1823 test(S("abcde"), 4, 2, S("abcdefghij"), 1, 4, 3);
1824 test(S("abcde"), 4, 2, S("abcdefghij"), 1, 8, 3);
1825 test(S("abcde"), 4, 2, S("abcdefghij"), 1, 9, 3);
1826 test(S("abcde"), 4, 2, S("abcdefghij"), 1, 10, 3);
1827 test(S("abcde"), 4, 2, S("abcdefghij"), 5, 0, 1);
1828 test(S("abcde"), 4, 2, S("abcdefghij"), 5, 1, -1);
1829 test(S("abcde"), 4, 2, S("abcdefghij"), 5, 2, -1);
1830 test(S("abcde"), 4, 2, S("abcdefghij"), 5, 4, -1);
1831 test(S("abcde"), 4, 2, S("abcdefghij"), 5, 5, -1);
1832 test(S("abcde"), 4, 2, S("abcdefghij"), 5, 6, -1);
1833 test(S("abcde"), 4, 2, S("abcdefghij"), 9, 0, 1);
1834 test(S("abcde"), 4, 2, S("abcdefghij"), 9, 1, -5);
1835 test(S("abcde"), 4, 2, S("abcdefghij"), 9, 2, -5);
1836 test(S("abcde"), 4, 2, S("abcdefghij"), 10, 0, 1);
1837 test(S("abcde"), 4, 2, S("abcdefghij"), 10, 1, 1);
1838 test(S("abcde"), 4, 2, S("abcdefghij"), 11, 0, 0);
1839 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
1840 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 1, 4);
1841 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 10, 4);
1842 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 19, 4);
1843 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 20, 4);
1844 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 21, 4);
1845 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
1846 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 1, 3);
1847 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 9, 3);
1848 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 18, 3);
1849 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 19, 3);
1850 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 20, 3);
1851 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
1852 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 1, -6);
1853 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 5, -6);
1854 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 9, -6);
1855 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 10, -6);
1856 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 11, -6);
1857 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
1858 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 1, -15);
1859 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 2, -15);
1860 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
1861 }
1862
1863 template <class S>
test17()1864 void test17()
1865 {
1866 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
1867 test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1868 test(S("abcde"), 5, 0, S(""), 0, 0, 0);
1869 test(S("abcde"), 5, 0, S(""), 0, 1, 0);
1870 test(S("abcde"), 5, 0, S(""), 1, 0, 0);
1871 test(S("abcde"), 5, 0, S("abcde"), 0, 0, 0);
1872 test(S("abcde"), 5, 0, S("abcde"), 0, 1, -1);
1873 test(S("abcde"), 5, 0, S("abcde"), 0, 2, -2);
1874 test(S("abcde"), 5, 0, S("abcde"), 0, 4, -4);
1875 test(S("abcde"), 5, 0, S("abcde"), 0, 5, -5);
1876 test(S("abcde"), 5, 0, S("abcde"), 0, 6, -5);
1877 test(S("abcde"), 5, 0, S("abcde"), 1, 0, 0);
1878 test(S("abcde"), 5, 0, S("abcde"), 1, 1, -1);
1879 test(S("abcde"), 5, 0, S("abcde"), 1, 2, -2);
1880 test(S("abcde"), 5, 0, S("abcde"), 1, 3, -3);
1881 test(S("abcde"), 5, 0, S("abcde"), 1, 4, -4);
1882 test(S("abcde"), 5, 0, S("abcde"), 1, 5, -4);
1883 test(S("abcde"), 5, 0, S("abcde"), 2, 0, 0);
1884 test(S("abcde"), 5, 0, S("abcde"), 2, 1, -1);
1885 test(S("abcde"), 5, 0, S("abcde"), 2, 2, -2);
1886 test(S("abcde"), 5, 0, S("abcde"), 2, 3, -3);
1887 test(S("abcde"), 5, 0, S("abcde"), 2, 4, -3);
1888 test(S("abcde"), 5, 0, S("abcde"), 4, 0, 0);
1889 test(S("abcde"), 5, 0, S("abcde"), 4, 1, -1);
1890 test(S("abcde"), 5, 0, S("abcde"), 4, 2, -1);
1891 test(S("abcde"), 5, 0, S("abcde"), 5, 0, 0);
1892 test(S("abcde"), 5, 0, S("abcde"), 5, 1, 0);
1893 test(S("abcde"), 5, 0, S("abcde"), 6, 0, 0);
1894 test(S("abcde"), 5, 0, S("abcdefghij"), 0, 0, 0);
1895 test(S("abcde"), 5, 0, S("abcdefghij"), 0, 1, -1);
1896 test(S("abcde"), 5, 0, S("abcdefghij"), 0, 5, -5);
1897 test(S("abcde"), 5, 0, S("abcdefghij"), 0, 9, -9);
1898 test(S("abcde"), 5, 0, S("abcdefghij"), 0, 10, -10);
1899 test(S("abcde"), 5, 0, S("abcdefghij"), 0, 11, -10);
1900 test(S("abcde"), 5, 0, S("abcdefghij"), 1, 0, 0);
1901 test(S("abcde"), 5, 0, S("abcdefghij"), 1, 1, -1);
1902 test(S("abcde"), 5, 0, S("abcdefghij"), 1, 4, -4);
1903 test(S("abcde"), 5, 0, S("abcdefghij"), 1, 8, -8);
1904 test(S("abcde"), 5, 0, S("abcdefghij"), 1, 9, -9);
1905 test(S("abcde"), 5, 0, S("abcdefghij"), 1, 10, -9);
1906 test(S("abcde"), 5, 0, S("abcdefghij"), 5, 0, 0);
1907 test(S("abcde"), 5, 0, S("abcdefghij"), 5, 1, -1);
1908 test(S("abcde"), 5, 0, S("abcdefghij"), 5, 2, -2);
1909 test(S("abcde"), 5, 0, S("abcdefghij"), 5, 4, -4);
1910 test(S("abcde"), 5, 0, S("abcdefghij"), 5, 5, -5);
1911 test(S("abcde"), 5, 0, S("abcdefghij"), 5, 6, -5);
1912 test(S("abcde"), 5, 0, S("abcdefghij"), 9, 0, 0);
1913 test(S("abcde"), 5, 0, S("abcdefghij"), 9, 1, -1);
1914 test(S("abcde"), 5, 0, S("abcdefghij"), 9, 2, -1);
1915 test(S("abcde"), 5, 0, S("abcdefghij"), 10, 0, 0);
1916 test(S("abcde"), 5, 0, S("abcdefghij"), 10, 1, 0);
1917 test(S("abcde"), 5, 0, S("abcdefghij"), 11, 0, 0);
1918 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1919 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1920 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1921 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1922 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1923 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1924 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1925 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1926 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1927 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1928 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1929 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1930 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1931 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1932 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1933 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1934 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1935 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1936 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1937 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1938 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1939 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1940 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1941 test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1942 test(S("abcde"), 5, 1, S(""), 0, 0, 0);
1943 test(S("abcde"), 5, 1, S(""), 0, 1, 0);
1944 test(S("abcde"), 5, 1, S(""), 1, 0, 0);
1945 test(S("abcde"), 5, 1, S("abcde"), 0, 0, 0);
1946 test(S("abcde"), 5, 1, S("abcde"), 0, 1, -1);
1947 test(S("abcde"), 5, 1, S("abcde"), 0, 2, -2);
1948 test(S("abcde"), 5, 1, S("abcde"), 0, 4, -4);
1949 test(S("abcde"), 5, 1, S("abcde"), 0, 5, -5);
1950 test(S("abcde"), 5, 1, S("abcde"), 0, 6, -5);
1951 test(S("abcde"), 5, 1, S("abcde"), 1, 0, 0);
1952 test(S("abcde"), 5, 1, S("abcde"), 1, 1, -1);
1953 test(S("abcde"), 5, 1, S("abcde"), 1, 2, -2);
1954 test(S("abcde"), 5, 1, S("abcde"), 1, 3, -3);
1955 test(S("abcde"), 5, 1, S("abcde"), 1, 4, -4);
1956 test(S("abcde"), 5, 1, S("abcde"), 1, 5, -4);
1957 test(S("abcde"), 5, 1, S("abcde"), 2, 0, 0);
1958 test(S("abcde"), 5, 1, S("abcde"), 2, 1, -1);
1959 test(S("abcde"), 5, 1, S("abcde"), 2, 2, -2);
1960 test(S("abcde"), 5, 1, S("abcde"), 2, 3, -3);
1961 test(S("abcde"), 5, 1, S("abcde"), 2, 4, -3);
1962 test(S("abcde"), 5, 1, S("abcde"), 4, 0, 0);
1963 test(S("abcde"), 5, 1, S("abcde"), 4, 1, -1);
1964 test(S("abcde"), 5, 1, S("abcde"), 4, 2, -1);
1965 test(S("abcde"), 5, 1, S("abcde"), 5, 0, 0);
1966 }
1967
1968 template <class S>
test18()1969 void test18()
1970 {
1971 test(S("abcde"), 5, 1, S("abcde"), 5, 1, 0);
1972 test(S("abcde"), 5, 1, S("abcde"), 6, 0, 0);
1973 test(S("abcde"), 5, 1, S("abcdefghij"), 0, 0, 0);
1974 test(S("abcde"), 5, 1, S("abcdefghij"), 0, 1, -1);
1975 test(S("abcde"), 5, 1, S("abcdefghij"), 0, 5, -5);
1976 test(S("abcde"), 5, 1, S("abcdefghij"), 0, 9, -9);
1977 test(S("abcde"), 5, 1, S("abcdefghij"), 0, 10, -10);
1978 test(S("abcde"), 5, 1, S("abcdefghij"), 0, 11, -10);
1979 test(S("abcde"), 5, 1, S("abcdefghij"), 1, 0, 0);
1980 test(S("abcde"), 5, 1, S("abcdefghij"), 1, 1, -1);
1981 test(S("abcde"), 5, 1, S("abcdefghij"), 1, 4, -4);
1982 test(S("abcde"), 5, 1, S("abcdefghij"), 1, 8, -8);
1983 test(S("abcde"), 5, 1, S("abcdefghij"), 1, 9, -9);
1984 test(S("abcde"), 5, 1, S("abcdefghij"), 1, 10, -9);
1985 test(S("abcde"), 5, 1, S("abcdefghij"), 5, 0, 0);
1986 test(S("abcde"), 5, 1, S("abcdefghij"), 5, 1, -1);
1987 test(S("abcde"), 5, 1, S("abcdefghij"), 5, 2, -2);
1988 test(S("abcde"), 5, 1, S("abcdefghij"), 5, 4, -4);
1989 test(S("abcde"), 5, 1, S("abcdefghij"), 5, 5, -5);
1990 test(S("abcde"), 5, 1, S("abcdefghij"), 5, 6, -5);
1991 test(S("abcde"), 5, 1, S("abcdefghij"), 9, 0, 0);
1992 test(S("abcde"), 5, 1, S("abcdefghij"), 9, 1, -1);
1993 test(S("abcde"), 5, 1, S("abcdefghij"), 9, 2, -1);
1994 test(S("abcde"), 5, 1, S("abcdefghij"), 10, 0, 0);
1995 test(S("abcde"), 5, 1, S("abcdefghij"), 10, 1, 0);
1996 test(S("abcde"), 5, 1, S("abcdefghij"), 11, 0, 0);
1997 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
1998 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
1999 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
2000 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
2001 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
2002 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
2003 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
2004 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
2005 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
2006 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
2007 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
2008 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
2009 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
2010 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
2011 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
2012 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
2013 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
2014 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
2015 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
2016 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
2017 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
2018 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
2019 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
2020 test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2021 test(S("abcde"), 6, 0, S(""), 0, 0, 0);
2022 test(S("abcde"), 6, 0, S(""), 0, 1, 0);
2023 test(S("abcde"), 6, 0, S(""), 1, 0, 0);
2024 test(S("abcde"), 6, 0, S("abcde"), 0, 0, 0);
2025 test(S("abcde"), 6, 0, S("abcde"), 0, 1, 0);
2026 test(S("abcde"), 6, 0, S("abcde"), 0, 2, 0);
2027 test(S("abcde"), 6, 0, S("abcde"), 0, 4, 0);
2028 test(S("abcde"), 6, 0, S("abcde"), 0, 5, 0);
2029 test(S("abcde"), 6, 0, S("abcde"), 0, 6, 0);
2030 test(S("abcde"), 6, 0, S("abcde"), 1, 0, 0);
2031 test(S("abcde"), 6, 0, S("abcde"), 1, 1, 0);
2032 test(S("abcde"), 6, 0, S("abcde"), 1, 2, 0);
2033 test(S("abcde"), 6, 0, S("abcde"), 1, 3, 0);
2034 test(S("abcde"), 6, 0, S("abcde"), 1, 4, 0);
2035 test(S("abcde"), 6, 0, S("abcde"), 1, 5, 0);
2036 test(S("abcde"), 6, 0, S("abcde"), 2, 0, 0);
2037 test(S("abcde"), 6, 0, S("abcde"), 2, 1, 0);
2038 test(S("abcde"), 6, 0, S("abcde"), 2, 2, 0);
2039 test(S("abcde"), 6, 0, S("abcde"), 2, 3, 0);
2040 test(S("abcde"), 6, 0, S("abcde"), 2, 4, 0);
2041 test(S("abcde"), 6, 0, S("abcde"), 4, 0, 0);
2042 test(S("abcde"), 6, 0, S("abcde"), 4, 1, 0);
2043 test(S("abcde"), 6, 0, S("abcde"), 4, 2, 0);
2044 test(S("abcde"), 6, 0, S("abcde"), 5, 0, 0);
2045 test(S("abcde"), 6, 0, S("abcde"), 5, 1, 0);
2046 test(S("abcde"), 6, 0, S("abcde"), 6, 0, 0);
2047 test(S("abcde"), 6, 0, S("abcdefghij"), 0, 0, 0);
2048 test(S("abcde"), 6, 0, S("abcdefghij"), 0, 1, 0);
2049 test(S("abcde"), 6, 0, S("abcdefghij"), 0, 5, 0);
2050 test(S("abcde"), 6, 0, S("abcdefghij"), 0, 9, 0);
2051 test(S("abcde"), 6, 0, S("abcdefghij"), 0, 10, 0);
2052 test(S("abcde"), 6, 0, S("abcdefghij"), 0, 11, 0);
2053 test(S("abcde"), 6, 0, S("abcdefghij"), 1, 0, 0);
2054 test(S("abcde"), 6, 0, S("abcdefghij"), 1, 1, 0);
2055 test(S("abcde"), 6, 0, S("abcdefghij"), 1, 4, 0);
2056 test(S("abcde"), 6, 0, S("abcdefghij"), 1, 8, 0);
2057 test(S("abcde"), 6, 0, S("abcdefghij"), 1, 9, 0);
2058 test(S("abcde"), 6, 0, S("abcdefghij"), 1, 10, 0);
2059 test(S("abcde"), 6, 0, S("abcdefghij"), 5, 0, 0);
2060 test(S("abcde"), 6, 0, S("abcdefghij"), 5, 1, 0);
2061 test(S("abcde"), 6, 0, S("abcdefghij"), 5, 2, 0);
2062 test(S("abcde"), 6, 0, S("abcdefghij"), 5, 4, 0);
2063 test(S("abcde"), 6, 0, S("abcdefghij"), 5, 5, 0);
2064 test(S("abcde"), 6, 0, S("abcdefghij"), 5, 6, 0);
2065 test(S("abcde"), 6, 0, S("abcdefghij"), 9, 0, 0);
2066 test(S("abcde"), 6, 0, S("abcdefghij"), 9, 1, 0);
2067 test(S("abcde"), 6, 0, S("abcdefghij"), 9, 2, 0);
2068 test(S("abcde"), 6, 0, S("abcdefghij"), 10, 0, 0);
2069 test(S("abcde"), 6, 0, S("abcdefghij"), 10, 1, 0);
2070 test(S("abcde"), 6, 0, S("abcdefghij"), 11, 0, 0);
2071 }
2072
2073 template <class S>
test19()2074 void test19()
2075 {
2076 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2077 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
2078 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
2079 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
2080 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
2081 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
2082 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2083 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
2084 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
2085 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
2086 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
2087 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
2088 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2089 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
2090 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
2091 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
2092 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
2093 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
2094 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2095 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
2096 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
2097 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2098 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2099 test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2100 test(S("abcdefghij"), 0, 0, S(""), 0, 0, 0);
2101 test(S("abcdefghij"), 0, 0, S(""), 0, 1, 0);
2102 test(S("abcdefghij"), 0, 0, S(""), 1, 0, 0);
2103 test(S("abcdefghij"), 0, 0, S("abcde"), 0, 0, 0);
2104 test(S("abcdefghij"), 0, 0, S("abcde"), 0, 1, -1);
2105 test(S("abcdefghij"), 0, 0, S("abcde"), 0, 2, -2);
2106 test(S("abcdefghij"), 0, 0, S("abcde"), 0, 4, -4);
2107 test(S("abcdefghij"), 0, 0, S("abcde"), 0, 5, -5);
2108 test(S("abcdefghij"), 0, 0, S("abcde"), 0, 6, -5);
2109 test(S("abcdefghij"), 0, 0, S("abcde"), 1, 0, 0);
2110 test(S("abcdefghij"), 0, 0, S("abcde"), 1, 1, -1);
2111 test(S("abcdefghij"), 0, 0, S("abcde"), 1, 2, -2);
2112 test(S("abcdefghij"), 0, 0, S("abcde"), 1, 3, -3);
2113 test(S("abcdefghij"), 0, 0, S("abcde"), 1, 4, -4);
2114 test(S("abcdefghij"), 0, 0, S("abcde"), 1, 5, -4);
2115 test(S("abcdefghij"), 0, 0, S("abcde"), 2, 0, 0);
2116 test(S("abcdefghij"), 0, 0, S("abcde"), 2, 1, -1);
2117 test(S("abcdefghij"), 0, 0, S("abcde"), 2, 2, -2);
2118 test(S("abcdefghij"), 0, 0, S("abcde"), 2, 3, -3);
2119 test(S("abcdefghij"), 0, 0, S("abcde"), 2, 4, -3);
2120 test(S("abcdefghij"), 0, 0, S("abcde"), 4, 0, 0);
2121 test(S("abcdefghij"), 0, 0, S("abcde"), 4, 1, -1);
2122 test(S("abcdefghij"), 0, 0, S("abcde"), 4, 2, -1);
2123 test(S("abcdefghij"), 0, 0, S("abcde"), 5, 0, 0);
2124 test(S("abcdefghij"), 0, 0, S("abcde"), 5, 1, 0);
2125 test(S("abcdefghij"), 0, 0, S("abcde"), 6, 0, 0);
2126 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 0, 0);
2127 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 1, -1);
2128 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 5, -5);
2129 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 9, -9);
2130 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 10, -10);
2131 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 11, -10);
2132 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 0, 0);
2133 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 1, -1);
2134 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 4, -4);
2135 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 8, -8);
2136 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 9, -9);
2137 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 10, -9);
2138 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 0, 0);
2139 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 1, -1);
2140 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 2, -2);
2141 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 4, -4);
2142 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 5, -5);
2143 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 6, -5);
2144 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 0, 0);
2145 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 1, -1);
2146 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 2, -1);
2147 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 0, 0);
2148 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 1, 0);
2149 test(S("abcdefghij"), 0, 0, S("abcdefghij"), 11, 0, 0);
2150 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2151 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
2152 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
2153 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
2154 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
2155 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
2156 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2157 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
2158 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
2159 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
2160 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
2161 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
2162 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2163 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
2164 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
2165 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
2166 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
2167 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
2168 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2169 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
2170 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
2171 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2172 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2173 test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2174 test(S("abcdefghij"), 0, 1, S(""), 0, 0, 1);
2175 test(S("abcdefghij"), 0, 1, S(""), 0, 1, 1);
2176 }
2177
2178 template <class S>
test20()2179 void test20()
2180 {
2181 test(S("abcdefghij"), 0, 1, S(""), 1, 0, 0);
2182 test(S("abcdefghij"), 0, 1, S("abcde"), 0, 0, 1);
2183 test(S("abcdefghij"), 0, 1, S("abcde"), 0, 1, 0);
2184 test(S("abcdefghij"), 0, 1, S("abcde"), 0, 2, -1);
2185 test(S("abcdefghij"), 0, 1, S("abcde"), 0, 4, -3);
2186 test(S("abcdefghij"), 0, 1, S("abcde"), 0, 5, -4);
2187 test(S("abcdefghij"), 0, 1, S("abcde"), 0, 6, -4);
2188 test(S("abcdefghij"), 0, 1, S("abcde"), 1, 0, 1);
2189 test(S("abcdefghij"), 0, 1, S("abcde"), 1, 1, -1);
2190 test(S("abcdefghij"), 0, 1, S("abcde"), 1, 2, -1);
2191 test(S("abcdefghij"), 0, 1, S("abcde"), 1, 3, -1);
2192 test(S("abcdefghij"), 0, 1, S("abcde"), 1, 4, -1);
2193 test(S("abcdefghij"), 0, 1, S("abcde"), 1, 5, -1);
2194 test(S("abcdefghij"), 0, 1, S("abcde"), 2, 0, 1);
2195 test(S("abcdefghij"), 0, 1, S("abcde"), 2, 1, -2);
2196 test(S("abcdefghij"), 0, 1, S("abcde"), 2, 2, -2);
2197 test(S("abcdefghij"), 0, 1, S("abcde"), 2, 3, -2);
2198 test(S("abcdefghij"), 0, 1, S("abcde"), 2, 4, -2);
2199 test(S("abcdefghij"), 0, 1, S("abcde"), 4, 0, 1);
2200 test(S("abcdefghij"), 0, 1, S("abcde"), 4, 1, -4);
2201 test(S("abcdefghij"), 0, 1, S("abcde"), 4, 2, -4);
2202 test(S("abcdefghij"), 0, 1, S("abcde"), 5, 0, 1);
2203 test(S("abcdefghij"), 0, 1, S("abcde"), 5, 1, 1);
2204 test(S("abcdefghij"), 0, 1, S("abcde"), 6, 0, 0);
2205 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 0, 1);
2206 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 1, 0);
2207 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 5, -4);
2208 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 9, -8);
2209 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 10, -9);
2210 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 11, -9);
2211 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 0, 1);
2212 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 1, -1);
2213 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 4, -1);
2214 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 8, -1);
2215 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 9, -1);
2216 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 10, -1);
2217 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 0, 1);
2218 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 1, -5);
2219 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 2, -5);
2220 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 4, -5);
2221 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 5, -5);
2222 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 6, -5);
2223 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 0, 1);
2224 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 1, -9);
2225 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 2, -9);
2226 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 0, 1);
2227 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 1, 1);
2228 test(S("abcdefghij"), 0, 1, S("abcdefghij"), 11, 0, 0);
2229 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
2230 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
2231 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
2232 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
2233 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
2234 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
2235 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
2236 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
2237 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
2238 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
2239 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
2240 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
2241 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
2242 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
2243 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
2244 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
2245 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
2246 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
2247 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
2248 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
2249 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
2250 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
2251 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
2252 test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2253 test(S("abcdefghij"), 0, 5, S(""), 0, 0, 5);
2254 test(S("abcdefghij"), 0, 5, S(""), 0, 1, 5);
2255 test(S("abcdefghij"), 0, 5, S(""), 1, 0, 0);
2256 test(S("abcdefghij"), 0, 5, S("abcde"), 0, 0, 5);
2257 test(S("abcdefghij"), 0, 5, S("abcde"), 0, 1, 4);
2258 test(S("abcdefghij"), 0, 5, S("abcde"), 0, 2, 3);
2259 test(S("abcdefghij"), 0, 5, S("abcde"), 0, 4, 1);
2260 test(S("abcdefghij"), 0, 5, S("abcde"), 0, 5, 0);
2261 test(S("abcdefghij"), 0, 5, S("abcde"), 0, 6, 0);
2262 test(S("abcdefghij"), 0, 5, S("abcde"), 1, 0, 5);
2263 test(S("abcdefghij"), 0, 5, S("abcde"), 1, 1, -1);
2264 test(S("abcdefghij"), 0, 5, S("abcde"), 1, 2, -1);
2265 test(S("abcdefghij"), 0, 5, S("abcde"), 1, 3, -1);
2266 test(S("abcdefghij"), 0, 5, S("abcde"), 1, 4, -1);
2267 test(S("abcdefghij"), 0, 5, S("abcde"), 1, 5, -1);
2268 test(S("abcdefghij"), 0, 5, S("abcde"), 2, 0, 5);
2269 test(S("abcdefghij"), 0, 5, S("abcde"), 2, 1, -2);
2270 test(S("abcdefghij"), 0, 5, S("abcde"), 2, 2, -2);
2271 test(S("abcdefghij"), 0, 5, S("abcde"), 2, 3, -2);
2272 test(S("abcdefghij"), 0, 5, S("abcde"), 2, 4, -2);
2273 test(S("abcdefghij"), 0, 5, S("abcde"), 4, 0, 5);
2274 test(S("abcdefghij"), 0, 5, S("abcde"), 4, 1, -4);
2275 test(S("abcdefghij"), 0, 5, S("abcde"), 4, 2, -4);
2276 test(S("abcdefghij"), 0, 5, S("abcde"), 5, 0, 5);
2277 test(S("abcdefghij"), 0, 5, S("abcde"), 5, 1, 5);
2278 test(S("abcdefghij"), 0, 5, S("abcde"), 6, 0, 0);
2279 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 0, 5);
2280 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 1, 4);
2281 }
2282
2283 template <class S>
test21()2284 void test21()
2285 {
2286 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 5, 0);
2287 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 9, -4);
2288 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 10, -5);
2289 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 11, -5);
2290 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 0, 5);
2291 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 1, -1);
2292 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 4, -1);
2293 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 8, -1);
2294 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 9, -1);
2295 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 10, -1);
2296 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 0, 5);
2297 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 1, -5);
2298 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 2, -5);
2299 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 4, -5);
2300 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 5, -5);
2301 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 6, -5);
2302 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 0, 5);
2303 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 1, -9);
2304 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 2, -9);
2305 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 0, 5);
2306 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 1, 5);
2307 test(S("abcdefghij"), 0, 5, S("abcdefghij"), 11, 0, 0);
2308 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
2309 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4);
2310 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5);
2311 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14);
2312 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15);
2313 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15);
2314 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
2315 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1);
2316 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1);
2317 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1);
2318 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1);
2319 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1);
2320 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
2321 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10);
2322 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10);
2323 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10);
2324 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10);
2325 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10);
2326 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
2327 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19);
2328 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19);
2329 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
2330 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
2331 test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
2332 test(S("abcdefghij"), 0, 9, S(""), 0, 0, 9);
2333 test(S("abcdefghij"), 0, 9, S(""), 0, 1, 9);
2334 test(S("abcdefghij"), 0, 9, S(""), 1, 0, 0);
2335 test(S("abcdefghij"), 0, 9, S("abcde"), 0, 0, 9);
2336 test(S("abcdefghij"), 0, 9, S("abcde"), 0, 1, 8);
2337 test(S("abcdefghij"), 0, 9, S("abcde"), 0, 2, 7);
2338 test(S("abcdefghij"), 0, 9, S("abcde"), 0, 4, 5);
2339 test(S("abcdefghij"), 0, 9, S("abcde"), 0, 5, 4);
2340 test(S("abcdefghij"), 0, 9, S("abcde"), 0, 6, 4);
2341 test(S("abcdefghij"), 0, 9, S("abcde"), 1, 0, 9);
2342 test(S("abcdefghij"), 0, 9, S("abcde"), 1, 1, -1);
2343 test(S("abcdefghij"), 0, 9, S("abcde"), 1, 2, -1);
2344 test(S("abcdefghij"), 0, 9, S("abcde"), 1, 3, -1);
2345 test(S("abcdefghij"), 0, 9, S("abcde"), 1, 4, -1);
2346 test(S("abcdefghij"), 0, 9, S("abcde"), 1, 5, -1);
2347 test(S("abcdefghij"), 0, 9, S("abcde"), 2, 0, 9);
2348 test(S("abcdefghij"), 0, 9, S("abcde"), 2, 1, -2);
2349 test(S("abcdefghij"), 0, 9, S("abcde"), 2, 2, -2);
2350 test(S("abcdefghij"), 0, 9, S("abcde"), 2, 3, -2);
2351 test(S("abcdefghij"), 0, 9, S("abcde"), 2, 4, -2);
2352 test(S("abcdefghij"), 0, 9, S("abcde"), 4, 0, 9);
2353 test(S("abcdefghij"), 0, 9, S("abcde"), 4, 1, -4);
2354 test(S("abcdefghij"), 0, 9, S("abcde"), 4, 2, -4);
2355 test(S("abcdefghij"), 0, 9, S("abcde"), 5, 0, 9);
2356 test(S("abcdefghij"), 0, 9, S("abcde"), 5, 1, 9);
2357 test(S("abcdefghij"), 0, 9, S("abcde"), 6, 0, 0);
2358 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 0, 9);
2359 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 1, 8);
2360 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 5, 4);
2361 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 9, 0);
2362 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 10, -1);
2363 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 11, -1);
2364 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 0, 9);
2365 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 1, -1);
2366 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 4, -1);
2367 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 8, -1);
2368 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 9, -1);
2369 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 10, -1);
2370 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 0, 9);
2371 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 1, -5);
2372 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 2, -5);
2373 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 4, -5);
2374 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 5, -5);
2375 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 6, -5);
2376 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 0, 9);
2377 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 1, -9);
2378 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 2, -9);
2379 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 0, 9);
2380 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 1, 9);
2381 test(S("abcdefghij"), 0, 9, S("abcdefghij"), 11, 0, 0);
2382 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
2383 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 1, 8);
2384 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 10, -1);
2385 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 19, -10);
2386 }
2387
2388 template <class S>
test22()2389 void test22()
2390 {
2391 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 20, -11);
2392 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 21, -11);
2393 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
2394 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 1, -1);
2395 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 9, -1);
2396 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 18, -1);
2397 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 19, -1);
2398 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 20, -1);
2399 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
2400 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 1, -10);
2401 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 5, -10);
2402 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 9, -10);
2403 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 10, -10);
2404 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 11, -10);
2405 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
2406 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 1, -19);
2407 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 2, -19);
2408 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
2409 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
2410 test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
2411 test(S("abcdefghij"), 0, 10, S(""), 0, 0, 10);
2412 test(S("abcdefghij"), 0, 10, S(""), 0, 1, 10);
2413 test(S("abcdefghij"), 0, 10, S(""), 1, 0, 0);
2414 test(S("abcdefghij"), 0, 10, S("abcde"), 0, 0, 10);
2415 test(S("abcdefghij"), 0, 10, S("abcde"), 0, 1, 9);
2416 test(S("abcdefghij"), 0, 10, S("abcde"), 0, 2, 8);
2417 test(S("abcdefghij"), 0, 10, S("abcde"), 0, 4, 6);
2418 test(S("abcdefghij"), 0, 10, S("abcde"), 0, 5, 5);
2419 test(S("abcdefghij"), 0, 10, S("abcde"), 0, 6, 5);
2420 test(S("abcdefghij"), 0, 10, S("abcde"), 1, 0, 10);
2421 test(S("abcdefghij"), 0, 10, S("abcde"), 1, 1, -1);
2422 test(S("abcdefghij"), 0, 10, S("abcde"), 1, 2, -1);
2423 test(S("abcdefghij"), 0, 10, S("abcde"), 1, 3, -1);
2424 test(S("abcdefghij"), 0, 10, S("abcde"), 1, 4, -1);
2425 test(S("abcdefghij"), 0, 10, S("abcde"), 1, 5, -1);
2426 test(S("abcdefghij"), 0, 10, S("abcde"), 2, 0, 10);
2427 test(S("abcdefghij"), 0, 10, S("abcde"), 2, 1, -2);
2428 test(S("abcdefghij"), 0, 10, S("abcde"), 2, 2, -2);
2429 test(S("abcdefghij"), 0, 10, S("abcde"), 2, 3, -2);
2430 test(S("abcdefghij"), 0, 10, S("abcde"), 2, 4, -2);
2431 test(S("abcdefghij"), 0, 10, S("abcde"), 4, 0, 10);
2432 test(S("abcdefghij"), 0, 10, S("abcde"), 4, 1, -4);
2433 test(S("abcdefghij"), 0, 10, S("abcde"), 4, 2, -4);
2434 test(S("abcdefghij"), 0, 10, S("abcde"), 5, 0, 10);
2435 test(S("abcdefghij"), 0, 10, S("abcde"), 5, 1, 10);
2436 test(S("abcdefghij"), 0, 10, S("abcde"), 6, 0, 0);
2437 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 0, 10);
2438 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 1, 9);
2439 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 5, 5);
2440 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 9, 1);
2441 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 10, 0);
2442 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 11, 0);
2443 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 0, 10);
2444 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 1, -1);
2445 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 4, -1);
2446 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 8, -1);
2447 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 9, -1);
2448 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 10, -1);
2449 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 0, 10);
2450 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 1, -5);
2451 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 2, -5);
2452 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 4, -5);
2453 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 5, -5);
2454 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 6, -5);
2455 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 0, 10);
2456 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 1, -9);
2457 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 2, -9);
2458 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 0, 10);
2459 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 1, 10);
2460 test(S("abcdefghij"), 0, 10, S("abcdefghij"), 11, 0, 0);
2461 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
2462 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9);
2463 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0);
2464 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9);
2465 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10);
2466 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10);
2467 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
2468 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1);
2469 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1);
2470 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1);
2471 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1);
2472 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1);
2473 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
2474 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10);
2475 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10);
2476 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10);
2477 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10);
2478 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10);
2479 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
2480 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19);
2481 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19);
2482 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
2483 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
2484 test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
2485 test(S("abcdefghij"), 0, 11, S(""), 0, 0, 10);
2486 test(S("abcdefghij"), 0, 11, S(""), 0, 1, 10);
2487 test(S("abcdefghij"), 0, 11, S(""), 1, 0, 0);
2488 test(S("abcdefghij"), 0, 11, S("abcde"), 0, 0, 10);
2489 test(S("abcdefghij"), 0, 11, S("abcde"), 0, 1, 9);
2490 test(S("abcdefghij"), 0, 11, S("abcde"), 0, 2, 8);
2491 }
2492
2493 template <class S>
test23()2494 void test23()
2495 {
2496 test(S("abcdefghij"), 0, 11, S("abcde"), 0, 4, 6);
2497 test(S("abcdefghij"), 0, 11, S("abcde"), 0, 5, 5);
2498 test(S("abcdefghij"), 0, 11, S("abcde"), 0, 6, 5);
2499 test(S("abcdefghij"), 0, 11, S("abcde"), 1, 0, 10);
2500 test(S("abcdefghij"), 0, 11, S("abcde"), 1, 1, -1);
2501 test(S("abcdefghij"), 0, 11, S("abcde"), 1, 2, -1);
2502 test(S("abcdefghij"), 0, 11, S("abcde"), 1, 3, -1);
2503 test(S("abcdefghij"), 0, 11, S("abcde"), 1, 4, -1);
2504 test(S("abcdefghij"), 0, 11, S("abcde"), 1, 5, -1);
2505 test(S("abcdefghij"), 0, 11, S("abcde"), 2, 0, 10);
2506 test(S("abcdefghij"), 0, 11, S("abcde"), 2, 1, -2);
2507 test(S("abcdefghij"), 0, 11, S("abcde"), 2, 2, -2);
2508 test(S("abcdefghij"), 0, 11, S("abcde"), 2, 3, -2);
2509 test(S("abcdefghij"), 0, 11, S("abcde"), 2, 4, -2);
2510 test(S("abcdefghij"), 0, 11, S("abcde"), 4, 0, 10);
2511 test(S("abcdefghij"), 0, 11, S("abcde"), 4, 1, -4);
2512 test(S("abcdefghij"), 0, 11, S("abcde"), 4, 2, -4);
2513 test(S("abcdefghij"), 0, 11, S("abcde"), 5, 0, 10);
2514 test(S("abcdefghij"), 0, 11, S("abcde"), 5, 1, 10);
2515 test(S("abcdefghij"), 0, 11, S("abcde"), 6, 0, 0);
2516 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 0, 10);
2517 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 1, 9);
2518 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 5, 5);
2519 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 9, 1);
2520 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 10, 0);
2521 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 11, 0);
2522 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 0, 10);
2523 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 1, -1);
2524 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 4, -1);
2525 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 8, -1);
2526 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 9, -1);
2527 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 10, -1);
2528 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 0, 10);
2529 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 1, -5);
2530 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 2, -5);
2531 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 4, -5);
2532 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 5, -5);
2533 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 6, -5);
2534 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 0, 10);
2535 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 1, -9);
2536 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 2, -9);
2537 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 0, 10);
2538 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 1, 10);
2539 test(S("abcdefghij"), 0, 11, S("abcdefghij"), 11, 0, 0);
2540 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 0, 10);
2541 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 1, 9);
2542 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 10, 0);
2543 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 19, -9);
2544 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 20, -10);
2545 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 21, -10);
2546 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 0, 10);
2547 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 1, -1);
2548 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 9, -1);
2549 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 18, -1);
2550 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 19, -1);
2551 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 20, -1);
2552 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 0, 10);
2553 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 1, -10);
2554 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 5, -10);
2555 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 9, -10);
2556 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 10, -10);
2557 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 11, -10);
2558 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 0, 10);
2559 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 1, -19);
2560 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 2, -19);
2561 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 0, 10);
2562 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 1, 10);
2563 test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 21, 0, 0);
2564 test(S("abcdefghij"), 1, 0, S(""), 0, 0, 0);
2565 test(S("abcdefghij"), 1, 0, S(""), 0, 1, 0);
2566 test(S("abcdefghij"), 1, 0, S(""), 1, 0, 0);
2567 test(S("abcdefghij"), 1, 0, S("abcde"), 0, 0, 0);
2568 test(S("abcdefghij"), 1, 0, S("abcde"), 0, 1, -1);
2569 test(S("abcdefghij"), 1, 0, S("abcde"), 0, 2, -2);
2570 test(S("abcdefghij"), 1, 0, S("abcde"), 0, 4, -4);
2571 test(S("abcdefghij"), 1, 0, S("abcde"), 0, 5, -5);
2572 test(S("abcdefghij"), 1, 0, S("abcde"), 0, 6, -5);
2573 test(S("abcdefghij"), 1, 0, S("abcde"), 1, 0, 0);
2574 test(S("abcdefghij"), 1, 0, S("abcde"), 1, 1, -1);
2575 test(S("abcdefghij"), 1, 0, S("abcde"), 1, 2, -2);
2576 test(S("abcdefghij"), 1, 0, S("abcde"), 1, 3, -3);
2577 test(S("abcdefghij"), 1, 0, S("abcde"), 1, 4, -4);
2578 test(S("abcdefghij"), 1, 0, S("abcde"), 1, 5, -4);
2579 test(S("abcdefghij"), 1, 0, S("abcde"), 2, 0, 0);
2580 test(S("abcdefghij"), 1, 0, S("abcde"), 2, 1, -1);
2581 test(S("abcdefghij"), 1, 0, S("abcde"), 2, 2, -2);
2582 test(S("abcdefghij"), 1, 0, S("abcde"), 2, 3, -3);
2583 test(S("abcdefghij"), 1, 0, S("abcde"), 2, 4, -3);
2584 test(S("abcdefghij"), 1, 0, S("abcde"), 4, 0, 0);
2585 test(S("abcdefghij"), 1, 0, S("abcde"), 4, 1, -1);
2586 test(S("abcdefghij"), 1, 0, S("abcde"), 4, 2, -1);
2587 test(S("abcdefghij"), 1, 0, S("abcde"), 5, 0, 0);
2588 test(S("abcdefghij"), 1, 0, S("abcde"), 5, 1, 0);
2589 test(S("abcdefghij"), 1, 0, S("abcde"), 6, 0, 0);
2590 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 0, 0);
2591 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 1, -1);
2592 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 5, -5);
2593 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 9, -9);
2594 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 10, -10);
2595 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 11, -10);
2596 }
2597
2598 template <class S>
test24()2599 void test24()
2600 {
2601 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 0, 0);
2602 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 1, -1);
2603 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 4, -4);
2604 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 8, -8);
2605 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 9, -9);
2606 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 10, -9);
2607 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 0, 0);
2608 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 1, -1);
2609 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 2, -2);
2610 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 4, -4);
2611 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 5, -5);
2612 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 6, -5);
2613 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 0, 0);
2614 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 1, -1);
2615 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 2, -1);
2616 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 0, 0);
2617 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 1, 0);
2618 test(S("abcdefghij"), 1, 0, S("abcdefghij"), 11, 0, 0);
2619 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2620 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
2621 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
2622 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
2623 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
2624 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
2625 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2626 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
2627 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
2628 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
2629 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
2630 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
2631 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2632 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
2633 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
2634 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
2635 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
2636 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
2637 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2638 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
2639 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
2640 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2641 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2642 test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2643 test(S("abcdefghij"), 1, 1, S(""), 0, 0, 1);
2644 test(S("abcdefghij"), 1, 1, S(""), 0, 1, 1);
2645 test(S("abcdefghij"), 1, 1, S(""), 1, 0, 0);
2646 test(S("abcdefghij"), 1, 1, S("abcde"), 0, 0, 1);
2647 test(S("abcdefghij"), 1, 1, S("abcde"), 0, 1, 1);
2648 test(S("abcdefghij"), 1, 1, S("abcde"), 0, 2, 1);
2649 test(S("abcdefghij"), 1, 1, S("abcde"), 0, 4, 1);
2650 test(S("abcdefghij"), 1, 1, S("abcde"), 0, 5, 1);
2651 test(S("abcdefghij"), 1, 1, S("abcde"), 0, 6, 1);
2652 test(S("abcdefghij"), 1, 1, S("abcde"), 1, 0, 1);
2653 test(S("abcdefghij"), 1, 1, S("abcde"), 1, 1, 0);
2654 test(S("abcdefghij"), 1, 1, S("abcde"), 1, 2, -1);
2655 test(S("abcdefghij"), 1, 1, S("abcde"), 1, 3, -2);
2656 test(S("abcdefghij"), 1, 1, S("abcde"), 1, 4, -3);
2657 test(S("abcdefghij"), 1, 1, S("abcde"), 1, 5, -3);
2658 test(S("abcdefghij"), 1, 1, S("abcde"), 2, 0, 1);
2659 test(S("abcdefghij"), 1, 1, S("abcde"), 2, 1, -1);
2660 test(S("abcdefghij"), 1, 1, S("abcde"), 2, 2, -1);
2661 test(S("abcdefghij"), 1, 1, S("abcde"), 2, 3, -1);
2662 test(S("abcdefghij"), 1, 1, S("abcde"), 2, 4, -1);
2663 test(S("abcdefghij"), 1, 1, S("abcde"), 4, 0, 1);
2664 test(S("abcdefghij"), 1, 1, S("abcde"), 4, 1, -3);
2665 test(S("abcdefghij"), 1, 1, S("abcde"), 4, 2, -3);
2666 test(S("abcdefghij"), 1, 1, S("abcde"), 5, 0, 1);
2667 test(S("abcdefghij"), 1, 1, S("abcde"), 5, 1, 1);
2668 test(S("abcdefghij"), 1, 1, S("abcde"), 6, 0, 0);
2669 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 0, 1);
2670 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 1, 1);
2671 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 5, 1);
2672 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 9, 1);
2673 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 10, 1);
2674 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 11, 1);
2675 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 0, 1);
2676 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 1, 0);
2677 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 4, -3);
2678 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 8, -7);
2679 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 9, -8);
2680 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 10, -8);
2681 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 0, 1);
2682 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 1, -4);
2683 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 2, -4);
2684 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 4, -4);
2685 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 5, -4);
2686 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 6, -4);
2687 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 0, 1);
2688 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 1, -8);
2689 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 2, -8);
2690 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 0, 1);
2691 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 1, 1);
2692 test(S("abcdefghij"), 1, 1, S("abcdefghij"), 11, 0, 0);
2693 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
2694 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
2695 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
2696 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
2697 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
2698 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
2699 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
2700 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
2701 }
2702
2703 template <class S>
test25()2704 void test25()
2705 {
2706 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
2707 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
2708 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
2709 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
2710 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
2711 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
2712 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
2713 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
2714 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
2715 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
2716 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
2717 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
2718 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
2719 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
2720 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
2721 test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2722 test(S("abcdefghij"), 1, 4, S(""), 0, 0, 4);
2723 test(S("abcdefghij"), 1, 4, S(""), 0, 1, 4);
2724 test(S("abcdefghij"), 1, 4, S(""), 1, 0, 0);
2725 test(S("abcdefghij"), 1, 4, S("abcde"), 0, 0, 4);
2726 test(S("abcdefghij"), 1, 4, S("abcde"), 0, 1, 1);
2727 test(S("abcdefghij"), 1, 4, S("abcde"), 0, 2, 1);
2728 test(S("abcdefghij"), 1, 4, S("abcde"), 0, 4, 1);
2729 test(S("abcdefghij"), 1, 4, S("abcde"), 0, 5, 1);
2730 test(S("abcdefghij"), 1, 4, S("abcde"), 0, 6, 1);
2731 test(S("abcdefghij"), 1, 4, S("abcde"), 1, 0, 4);
2732 test(S("abcdefghij"), 1, 4, S("abcde"), 1, 1, 3);
2733 test(S("abcdefghij"), 1, 4, S("abcde"), 1, 2, 2);
2734 test(S("abcdefghij"), 1, 4, S("abcde"), 1, 3, 1);
2735 test(S("abcdefghij"), 1, 4, S("abcde"), 1, 4, 0);
2736 test(S("abcdefghij"), 1, 4, S("abcde"), 1, 5, 0);
2737 test(S("abcdefghij"), 1, 4, S("abcde"), 2, 0, 4);
2738 test(S("abcdefghij"), 1, 4, S("abcde"), 2, 1, -1);
2739 test(S("abcdefghij"), 1, 4, S("abcde"), 2, 2, -1);
2740 test(S("abcdefghij"), 1, 4, S("abcde"), 2, 3, -1);
2741 test(S("abcdefghij"), 1, 4, S("abcde"), 2, 4, -1);
2742 test(S("abcdefghij"), 1, 4, S("abcde"), 4, 0, 4);
2743 test(S("abcdefghij"), 1, 4, S("abcde"), 4, 1, -3);
2744 test(S("abcdefghij"), 1, 4, S("abcde"), 4, 2, -3);
2745 test(S("abcdefghij"), 1, 4, S("abcde"), 5, 0, 4);
2746 test(S("abcdefghij"), 1, 4, S("abcde"), 5, 1, 4);
2747 test(S("abcdefghij"), 1, 4, S("abcde"), 6, 0, 0);
2748 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 0, 4);
2749 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 1, 1);
2750 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 5, 1);
2751 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 9, 1);
2752 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 10, 1);
2753 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 11, 1);
2754 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 0, 4);
2755 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 1, 3);
2756 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 4, 0);
2757 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 8, -4);
2758 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 9, -5);
2759 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 10, -5);
2760 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 0, 4);
2761 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 1, -4);
2762 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 2, -4);
2763 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 4, -4);
2764 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 5, -4);
2765 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 6, -4);
2766 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 0, 4);
2767 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 1, -8);
2768 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 2, -8);
2769 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 0, 4);
2770 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 1, 4);
2771 test(S("abcdefghij"), 1, 4, S("abcdefghij"), 11, 0, 0);
2772 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
2773 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1);
2774 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1);
2775 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1);
2776 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1);
2777 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1);
2778 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
2779 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3);
2780 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5);
2781 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14);
2782 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15);
2783 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15);
2784 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
2785 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9);
2786 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9);
2787 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9);
2788 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9);
2789 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9);
2790 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
2791 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18);
2792 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18);
2793 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
2794 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
2795 test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
2796 test(S("abcdefghij"), 1, 8, S(""), 0, 0, 8);
2797 test(S("abcdefghij"), 1, 8, S(""), 0, 1, 8);
2798 test(S("abcdefghij"), 1, 8, S(""), 1, 0, 0);
2799 test(S("abcdefghij"), 1, 8, S("abcde"), 0, 0, 8);
2800 test(S("abcdefghij"), 1, 8, S("abcde"), 0, 1, 1);
2801 test(S("abcdefghij"), 1, 8, S("abcde"), 0, 2, 1);
2802 test(S("abcdefghij"), 1, 8, S("abcde"), 0, 4, 1);
2803 test(S("abcdefghij"), 1, 8, S("abcde"), 0, 5, 1);
2804 test(S("abcdefghij"), 1, 8, S("abcde"), 0, 6, 1);
2805 test(S("abcdefghij"), 1, 8, S("abcde"), 1, 0, 8);
2806 }
2807
2808 template <class S>
test26()2809 void test26()
2810 {
2811 test(S("abcdefghij"), 1, 8, S("abcde"), 1, 1, 7);
2812 test(S("abcdefghij"), 1, 8, S("abcde"), 1, 2, 6);
2813 test(S("abcdefghij"), 1, 8, S("abcde"), 1, 3, 5);
2814 test(S("abcdefghij"), 1, 8, S("abcde"), 1, 4, 4);
2815 test(S("abcdefghij"), 1, 8, S("abcde"), 1, 5, 4);
2816 test(S("abcdefghij"), 1, 8, S("abcde"), 2, 0, 8);
2817 test(S("abcdefghij"), 1, 8, S("abcde"), 2, 1, -1);
2818 test(S("abcdefghij"), 1, 8, S("abcde"), 2, 2, -1);
2819 test(S("abcdefghij"), 1, 8, S("abcde"), 2, 3, -1);
2820 test(S("abcdefghij"), 1, 8, S("abcde"), 2, 4, -1);
2821 test(S("abcdefghij"), 1, 8, S("abcde"), 4, 0, 8);
2822 test(S("abcdefghij"), 1, 8, S("abcde"), 4, 1, -3);
2823 test(S("abcdefghij"), 1, 8, S("abcde"), 4, 2, -3);
2824 test(S("abcdefghij"), 1, 8, S("abcde"), 5, 0, 8);
2825 test(S("abcdefghij"), 1, 8, S("abcde"), 5, 1, 8);
2826 test(S("abcdefghij"), 1, 8, S("abcde"), 6, 0, 0);
2827 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 0, 8);
2828 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 1, 1);
2829 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 5, 1);
2830 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 9, 1);
2831 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 10, 1);
2832 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 11, 1);
2833 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 0, 8);
2834 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 1, 7);
2835 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 4, 4);
2836 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 8, 0);
2837 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 9, -1);
2838 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 10, -1);
2839 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 0, 8);
2840 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 1, -4);
2841 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 2, -4);
2842 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 4, -4);
2843 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 5, -4);
2844 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 6, -4);
2845 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 0, 8);
2846 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 1, -8);
2847 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 2, -8);
2848 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 0, 8);
2849 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 1, 8);
2850 test(S("abcdefghij"), 1, 8, S("abcdefghij"), 11, 0, 0);
2851 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 0, 8);
2852 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 1, 1);
2853 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 10, 1);
2854 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 19, 1);
2855 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 20, 1);
2856 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 21, 1);
2857 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 0, 8);
2858 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 1, 7);
2859 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 9, -1);
2860 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 18, -10);
2861 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 19, -11);
2862 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 20, -11);
2863 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 0, 8);
2864 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 1, -9);
2865 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 5, -9);
2866 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 9, -9);
2867 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 10, -9);
2868 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 11, -9);
2869 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 0, 8);
2870 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 1, -18);
2871 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 2, -18);
2872 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 0, 8);
2873 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 1, 8);
2874 test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 21, 0, 0);
2875 test(S("abcdefghij"), 1, 9, S(""), 0, 0, 9);
2876 test(S("abcdefghij"), 1, 9, S(""), 0, 1, 9);
2877 test(S("abcdefghij"), 1, 9, S(""), 1, 0, 0);
2878 test(S("abcdefghij"), 1, 9, S("abcde"), 0, 0, 9);
2879 test(S("abcdefghij"), 1, 9, S("abcde"), 0, 1, 1);
2880 test(S("abcdefghij"), 1, 9, S("abcde"), 0, 2, 1);
2881 test(S("abcdefghij"), 1, 9, S("abcde"), 0, 4, 1);
2882 test(S("abcdefghij"), 1, 9, S("abcde"), 0, 5, 1);
2883 test(S("abcdefghij"), 1, 9, S("abcde"), 0, 6, 1);
2884 test(S("abcdefghij"), 1, 9, S("abcde"), 1, 0, 9);
2885 test(S("abcdefghij"), 1, 9, S("abcde"), 1, 1, 8);
2886 test(S("abcdefghij"), 1, 9, S("abcde"), 1, 2, 7);
2887 test(S("abcdefghij"), 1, 9, S("abcde"), 1, 3, 6);
2888 test(S("abcdefghij"), 1, 9, S("abcde"), 1, 4, 5);
2889 test(S("abcdefghij"), 1, 9, S("abcde"), 1, 5, 5);
2890 test(S("abcdefghij"), 1, 9, S("abcde"), 2, 0, 9);
2891 test(S("abcdefghij"), 1, 9, S("abcde"), 2, 1, -1);
2892 test(S("abcdefghij"), 1, 9, S("abcde"), 2, 2, -1);
2893 test(S("abcdefghij"), 1, 9, S("abcde"), 2, 3, -1);
2894 test(S("abcdefghij"), 1, 9, S("abcde"), 2, 4, -1);
2895 test(S("abcdefghij"), 1, 9, S("abcde"), 4, 0, 9);
2896 test(S("abcdefghij"), 1, 9, S("abcde"), 4, 1, -3);
2897 test(S("abcdefghij"), 1, 9, S("abcde"), 4, 2, -3);
2898 test(S("abcdefghij"), 1, 9, S("abcde"), 5, 0, 9);
2899 test(S("abcdefghij"), 1, 9, S("abcde"), 5, 1, 9);
2900 test(S("abcdefghij"), 1, 9, S("abcde"), 6, 0, 0);
2901 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 0, 9);
2902 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 1, 1);
2903 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 5, 1);
2904 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 9, 1);
2905 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 10, 1);
2906 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 11, 1);
2907 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 0, 9);
2908 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 1, 8);
2909 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 4, 5);
2910 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 8, 1);
2911 }
2912
2913 template <class S>
test27()2914 void test27()
2915 {
2916 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 9, 0);
2917 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 10, 0);
2918 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 0, 9);
2919 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 1, -4);
2920 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 2, -4);
2921 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 4, -4);
2922 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 5, -4);
2923 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 6, -4);
2924 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 0, 9);
2925 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 1, -8);
2926 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 2, -8);
2927 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 0, 9);
2928 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 1, 9);
2929 test(S("abcdefghij"), 1, 9, S("abcdefghij"), 11, 0, 0);
2930 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
2931 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1);
2932 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1);
2933 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1);
2934 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1);
2935 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1);
2936 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
2937 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8);
2938 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0);
2939 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9);
2940 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10);
2941 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10);
2942 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
2943 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9);
2944 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9);
2945 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9);
2946 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9);
2947 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9);
2948 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
2949 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18);
2950 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18);
2951 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
2952 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
2953 test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
2954 test(S("abcdefghij"), 1, 10, S(""), 0, 0, 9);
2955 test(S("abcdefghij"), 1, 10, S(""), 0, 1, 9);
2956 test(S("abcdefghij"), 1, 10, S(""), 1, 0, 0);
2957 test(S("abcdefghij"), 1, 10, S("abcde"), 0, 0, 9);
2958 test(S("abcdefghij"), 1, 10, S("abcde"), 0, 1, 1);
2959 test(S("abcdefghij"), 1, 10, S("abcde"), 0, 2, 1);
2960 test(S("abcdefghij"), 1, 10, S("abcde"), 0, 4, 1);
2961 test(S("abcdefghij"), 1, 10, S("abcde"), 0, 5, 1);
2962 test(S("abcdefghij"), 1, 10, S("abcde"), 0, 6, 1);
2963 test(S("abcdefghij"), 1, 10, S("abcde"), 1, 0, 9);
2964 test(S("abcdefghij"), 1, 10, S("abcde"), 1, 1, 8);
2965 test(S("abcdefghij"), 1, 10, S("abcde"), 1, 2, 7);
2966 test(S("abcdefghij"), 1, 10, S("abcde"), 1, 3, 6);
2967 test(S("abcdefghij"), 1, 10, S("abcde"), 1, 4, 5);
2968 test(S("abcdefghij"), 1, 10, S("abcde"), 1, 5, 5);
2969 test(S("abcdefghij"), 1, 10, S("abcde"), 2, 0, 9);
2970 test(S("abcdefghij"), 1, 10, S("abcde"), 2, 1, -1);
2971 test(S("abcdefghij"), 1, 10, S("abcde"), 2, 2, -1);
2972 test(S("abcdefghij"), 1, 10, S("abcde"), 2, 3, -1);
2973 test(S("abcdefghij"), 1, 10, S("abcde"), 2, 4, -1);
2974 test(S("abcdefghij"), 1, 10, S("abcde"), 4, 0, 9);
2975 test(S("abcdefghij"), 1, 10, S("abcde"), 4, 1, -3);
2976 test(S("abcdefghij"), 1, 10, S("abcde"), 4, 2, -3);
2977 test(S("abcdefghij"), 1, 10, S("abcde"), 5, 0, 9);
2978 test(S("abcdefghij"), 1, 10, S("abcde"), 5, 1, 9);
2979 test(S("abcdefghij"), 1, 10, S("abcde"), 6, 0, 0);
2980 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 0, 9);
2981 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 1, 1);
2982 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 5, 1);
2983 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 9, 1);
2984 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 10, 1);
2985 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 11, 1);
2986 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 0, 9);
2987 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 1, 8);
2988 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 4, 5);
2989 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 8, 1);
2990 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 9, 0);
2991 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 10, 0);
2992 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 0, 9);
2993 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 1, -4);
2994 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 2, -4);
2995 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 4, -4);
2996 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 5, -4);
2997 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 6, -4);
2998 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 0, 9);
2999 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 1, -8);
3000 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 2, -8);
3001 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 0, 9);
3002 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 1, 9);
3003 test(S("abcdefghij"), 1, 10, S("abcdefghij"), 11, 0, 0);
3004 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 0, 9);
3005 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 1, 1);
3006 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 10, 1);
3007 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 19, 1);
3008 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 20, 1);
3009 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 21, 1);
3010 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 0, 9);
3011 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 1, 8);
3012 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 9, 0);
3013 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 18, -9);
3014 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 19, -10);
3015 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 20, -10);
3016 }
3017
3018 template <class S>
test28()3019 void test28()
3020 {
3021 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 0, 9);
3022 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 1, -9);
3023 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 5, -9);
3024 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 9, -9);
3025 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 10, -9);
3026 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 11, -9);
3027 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 0, 9);
3028 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 1, -18);
3029 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 2, -18);
3030 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 0, 9);
3031 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 1, 9);
3032 test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
3033 test(S("abcdefghij"), 5, 0, S(""), 0, 0, 0);
3034 test(S("abcdefghij"), 5, 0, S(""), 0, 1, 0);
3035 test(S("abcdefghij"), 5, 0, S(""), 1, 0, 0);
3036 test(S("abcdefghij"), 5, 0, S("abcde"), 0, 0, 0);
3037 test(S("abcdefghij"), 5, 0, S("abcde"), 0, 1, -1);
3038 test(S("abcdefghij"), 5, 0, S("abcde"), 0, 2, -2);
3039 test(S("abcdefghij"), 5, 0, S("abcde"), 0, 4, -4);
3040 test(S("abcdefghij"), 5, 0, S("abcde"), 0, 5, -5);
3041 test(S("abcdefghij"), 5, 0, S("abcde"), 0, 6, -5);
3042 test(S("abcdefghij"), 5, 0, S("abcde"), 1, 0, 0);
3043 test(S("abcdefghij"), 5, 0, S("abcde"), 1, 1, -1);
3044 test(S("abcdefghij"), 5, 0, S("abcde"), 1, 2, -2);
3045 test(S("abcdefghij"), 5, 0, S("abcde"), 1, 3, -3);
3046 test(S("abcdefghij"), 5, 0, S("abcde"), 1, 4, -4);
3047 test(S("abcdefghij"), 5, 0, S("abcde"), 1, 5, -4);
3048 test(S("abcdefghij"), 5, 0, S("abcde"), 2, 0, 0);
3049 test(S("abcdefghij"), 5, 0, S("abcde"), 2, 1, -1);
3050 test(S("abcdefghij"), 5, 0, S("abcde"), 2, 2, -2);
3051 test(S("abcdefghij"), 5, 0, S("abcde"), 2, 3, -3);
3052 test(S("abcdefghij"), 5, 0, S("abcde"), 2, 4, -3);
3053 test(S("abcdefghij"), 5, 0, S("abcde"), 4, 0, 0);
3054 test(S("abcdefghij"), 5, 0, S("abcde"), 4, 1, -1);
3055 test(S("abcdefghij"), 5, 0, S("abcde"), 4, 2, -1);
3056 test(S("abcdefghij"), 5, 0, S("abcde"), 5, 0, 0);
3057 test(S("abcdefghij"), 5, 0, S("abcde"), 5, 1, 0);
3058 test(S("abcdefghij"), 5, 0, S("abcde"), 6, 0, 0);
3059 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 0, 0);
3060 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 1, -1);
3061 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 5, -5);
3062 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 9, -9);
3063 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 10, -10);
3064 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 11, -10);
3065 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 0, 0);
3066 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 1, -1);
3067 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 4, -4);
3068 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 8, -8);
3069 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 9, -9);
3070 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 10, -9);
3071 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 0, 0);
3072 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 1, -1);
3073 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 2, -2);
3074 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 4, -4);
3075 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 5, -5);
3076 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 6, -5);
3077 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 0, 0);
3078 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 1, -1);
3079 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 2, -1);
3080 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 0, 0);
3081 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 1, 0);
3082 test(S("abcdefghij"), 5, 0, S("abcdefghij"), 11, 0, 0);
3083 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3084 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3085 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3086 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3087 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3088 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3089 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3090 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3091 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3092 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3093 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3094 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3095 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3096 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3097 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3098 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3099 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3100 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3101 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3102 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3103 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3104 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3105 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3106 test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3107 test(S("abcdefghij"), 5, 1, S(""), 0, 0, 1);
3108 test(S("abcdefghij"), 5, 1, S(""), 0, 1, 1);
3109 test(S("abcdefghij"), 5, 1, S(""), 1, 0, 0);
3110 test(S("abcdefghij"), 5, 1, S("abcde"), 0, 0, 1);
3111 test(S("abcdefghij"), 5, 1, S("abcde"), 0, 1, 5);
3112 test(S("abcdefghij"), 5, 1, S("abcde"), 0, 2, 5);
3113 test(S("abcdefghij"), 5, 1, S("abcde"), 0, 4, 5);
3114 test(S("abcdefghij"), 5, 1, S("abcde"), 0, 5, 5);
3115 test(S("abcdefghij"), 5, 1, S("abcde"), 0, 6, 5);
3116 test(S("abcdefghij"), 5, 1, S("abcde"), 1, 0, 1);
3117 test(S("abcdefghij"), 5, 1, S("abcde"), 1, 1, 4);
3118 test(S("abcdefghij"), 5, 1, S("abcde"), 1, 2, 4);
3119 test(S("abcdefghij"), 5, 1, S("abcde"), 1, 3, 4);
3120 test(S("abcdefghij"), 5, 1, S("abcde"), 1, 4, 4);
3121 }
3122
3123 template <class S>
test29()3124 void test29()
3125 {
3126 test(S("abcdefghij"), 5, 1, S("abcde"), 1, 5, 4);
3127 test(S("abcdefghij"), 5, 1, S("abcde"), 2, 0, 1);
3128 test(S("abcdefghij"), 5, 1, S("abcde"), 2, 1, 3);
3129 test(S("abcdefghij"), 5, 1, S("abcde"), 2, 2, 3);
3130 test(S("abcdefghij"), 5, 1, S("abcde"), 2, 3, 3);
3131 test(S("abcdefghij"), 5, 1, S("abcde"), 2, 4, 3);
3132 test(S("abcdefghij"), 5, 1, S("abcde"), 4, 0, 1);
3133 test(S("abcdefghij"), 5, 1, S("abcde"), 4, 1, 1);
3134 test(S("abcdefghij"), 5, 1, S("abcde"), 4, 2, 1);
3135 test(S("abcdefghij"), 5, 1, S("abcde"), 5, 0, 1);
3136 test(S("abcdefghij"), 5, 1, S("abcde"), 5, 1, 1);
3137 test(S("abcdefghij"), 5, 1, S("abcde"), 6, 0, 0);
3138 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 0, 1);
3139 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 1, 5);
3140 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 5, 5);
3141 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 9, 5);
3142 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 10, 5);
3143 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 11, 5);
3144 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 0, 1);
3145 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 1, 4);
3146 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 4, 4);
3147 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 8, 4);
3148 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 9, 4);
3149 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 10, 4);
3150 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 0, 1);
3151 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 1, 0);
3152 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 2, -1);
3153 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 4, -3);
3154 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 5, -4);
3155 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 6, -4);
3156 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 0, 1);
3157 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 1, -4);
3158 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 2, -4);
3159 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 0, 1);
3160 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 1, 1);
3161 test(S("abcdefghij"), 5, 1, S("abcdefghij"), 11, 0, 0);
3162 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
3163 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, 5);
3164 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, 5);
3165 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, 5);
3166 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, 5);
3167 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, 5);
3168 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
3169 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, 4);
3170 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, 4);
3171 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, 4);
3172 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, 4);
3173 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, 4);
3174 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
3175 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -5);
3176 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
3177 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -5);
3178 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -5);
3179 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -5);
3180 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
3181 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -14);
3182 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -14);
3183 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
3184 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
3185 test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3186 test(S("abcdefghij"), 5, 2, S(""), 0, 0, 2);
3187 test(S("abcdefghij"), 5, 2, S(""), 0, 1, 2);
3188 test(S("abcdefghij"), 5, 2, S(""), 1, 0, 0);
3189 test(S("abcdefghij"), 5, 2, S("abcde"), 0, 0, 2);
3190 test(S("abcdefghij"), 5, 2, S("abcde"), 0, 1, 5);
3191 test(S("abcdefghij"), 5, 2, S("abcde"), 0, 2, 5);
3192 test(S("abcdefghij"), 5, 2, S("abcde"), 0, 4, 5);
3193 test(S("abcdefghij"), 5, 2, S("abcde"), 0, 5, 5);
3194 test(S("abcdefghij"), 5, 2, S("abcde"), 0, 6, 5);
3195 test(S("abcdefghij"), 5, 2, S("abcde"), 1, 0, 2);
3196 test(S("abcdefghij"), 5, 2, S("abcde"), 1, 1, 4);
3197 test(S("abcdefghij"), 5, 2, S("abcde"), 1, 2, 4);
3198 test(S("abcdefghij"), 5, 2, S("abcde"), 1, 3, 4);
3199 test(S("abcdefghij"), 5, 2, S("abcde"), 1, 4, 4);
3200 test(S("abcdefghij"), 5, 2, S("abcde"), 1, 5, 4);
3201 test(S("abcdefghij"), 5, 2, S("abcde"), 2, 0, 2);
3202 test(S("abcdefghij"), 5, 2, S("abcde"), 2, 1, 3);
3203 test(S("abcdefghij"), 5, 2, S("abcde"), 2, 2, 3);
3204 test(S("abcdefghij"), 5, 2, S("abcde"), 2, 3, 3);
3205 test(S("abcdefghij"), 5, 2, S("abcde"), 2, 4, 3);
3206 test(S("abcdefghij"), 5, 2, S("abcde"), 4, 0, 2);
3207 test(S("abcdefghij"), 5, 2, S("abcde"), 4, 1, 1);
3208 test(S("abcdefghij"), 5, 2, S("abcde"), 4, 2, 1);
3209 test(S("abcdefghij"), 5, 2, S("abcde"), 5, 0, 2);
3210 test(S("abcdefghij"), 5, 2, S("abcde"), 5, 1, 2);
3211 test(S("abcdefghij"), 5, 2, S("abcde"), 6, 0, 0);
3212 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 0, 2);
3213 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 1, 5);
3214 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 5, 5);
3215 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 9, 5);
3216 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 10, 5);
3217 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 11, 5);
3218 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 0, 2);
3219 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 1, 4);
3220 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 4, 4);
3221 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 8, 4);
3222 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 9, 4);
3223 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 10, 4);
3224 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 0, 2);
3225 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 1, 1);
3226 }
3227
3228 template <class S>
test30()3229 void test30()
3230 {
3231 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 2, 0);
3232 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 4, -2);
3233 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 5, -3);
3234 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 6, -3);
3235 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 0, 2);
3236 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 1, -4);
3237 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 2, -4);
3238 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 0, 2);
3239 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 1, 2);
3240 test(S("abcdefghij"), 5, 2, S("abcdefghij"), 11, 0, 0);
3241 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
3242 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 1, 5);
3243 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 10, 5);
3244 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 19, 5);
3245 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 20, 5);
3246 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 21, 5);
3247 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
3248 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 1, 4);
3249 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 9, 4);
3250 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 18, 4);
3251 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 19, 4);
3252 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 20, 4);
3253 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
3254 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 1, -5);
3255 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 5, -5);
3256 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 9, -5);
3257 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 10, -5);
3258 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 11, -5);
3259 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
3260 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 1, -14);
3261 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 2, -14);
3262 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
3263 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
3264 test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
3265 test(S("abcdefghij"), 5, 4, S(""), 0, 0, 4);
3266 test(S("abcdefghij"), 5, 4, S(""), 0, 1, 4);
3267 test(S("abcdefghij"), 5, 4, S(""), 1, 0, 0);
3268 test(S("abcdefghij"), 5, 4, S("abcde"), 0, 0, 4);
3269 test(S("abcdefghij"), 5, 4, S("abcde"), 0, 1, 5);
3270 test(S("abcdefghij"), 5, 4, S("abcde"), 0, 2, 5);
3271 test(S("abcdefghij"), 5, 4, S("abcde"), 0, 4, 5);
3272 test(S("abcdefghij"), 5, 4, S("abcde"), 0, 5, 5);
3273 test(S("abcdefghij"), 5, 4, S("abcde"), 0, 6, 5);
3274 test(S("abcdefghij"), 5, 4, S("abcde"), 1, 0, 4);
3275 test(S("abcdefghij"), 5, 4, S("abcde"), 1, 1, 4);
3276 test(S("abcdefghij"), 5, 4, S("abcde"), 1, 2, 4);
3277 test(S("abcdefghij"), 5, 4, S("abcde"), 1, 3, 4);
3278 test(S("abcdefghij"), 5, 4, S("abcde"), 1, 4, 4);
3279 test(S("abcdefghij"), 5, 4, S("abcde"), 1, 5, 4);
3280 test(S("abcdefghij"), 5, 4, S("abcde"), 2, 0, 4);
3281 test(S("abcdefghij"), 5, 4, S("abcde"), 2, 1, 3);
3282 test(S("abcdefghij"), 5, 4, S("abcde"), 2, 2, 3);
3283 test(S("abcdefghij"), 5, 4, S("abcde"), 2, 3, 3);
3284 test(S("abcdefghij"), 5, 4, S("abcde"), 2, 4, 3);
3285 test(S("abcdefghij"), 5, 4, S("abcde"), 4, 0, 4);
3286 test(S("abcdefghij"), 5, 4, S("abcde"), 4, 1, 1);
3287 test(S("abcdefghij"), 5, 4, S("abcde"), 4, 2, 1);
3288 test(S("abcdefghij"), 5, 4, S("abcde"), 5, 0, 4);
3289 test(S("abcdefghij"), 5, 4, S("abcde"), 5, 1, 4);
3290 test(S("abcdefghij"), 5, 4, S("abcde"), 6, 0, 0);
3291 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 0, 4);
3292 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 1, 5);
3293 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 5, 5);
3294 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 9, 5);
3295 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 10, 5);
3296 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 11, 5);
3297 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 0, 4);
3298 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 1, 4);
3299 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 4, 4);
3300 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 8, 4);
3301 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 9, 4);
3302 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 10, 4);
3303 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 0, 4);
3304 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 1, 3);
3305 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 2, 2);
3306 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 4, 0);
3307 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 5, -1);
3308 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 6, -1);
3309 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 0, 4);
3310 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 1, -4);
3311 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 2, -4);
3312 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 0, 4);
3313 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 1, 4);
3314 test(S("abcdefghij"), 5, 4, S("abcdefghij"), 11, 0, 0);
3315 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
3316 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 1, 5);
3317 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 10, 5);
3318 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 19, 5);
3319 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 20, 5);
3320 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 21, 5);
3321 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
3322 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 1, 4);
3323 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 9, 4);
3324 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 18, 4);
3325 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 19, 4);
3326 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 20, 4);
3327 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
3328 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 1, -5);
3329 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 5, -5);
3330 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 9, -5);
3331 }
3332
3333 template <class S>
test31()3334 void test31()
3335 {
3336 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 10, -5);
3337 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 11, -5);
3338 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
3339 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 1, -14);
3340 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 2, -14);
3341 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
3342 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
3343 test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
3344 test(S("abcdefghij"), 5, 5, S(""), 0, 0, 5);
3345 test(S("abcdefghij"), 5, 5, S(""), 0, 1, 5);
3346 test(S("abcdefghij"), 5, 5, S(""), 1, 0, 0);
3347 test(S("abcdefghij"), 5, 5, S("abcde"), 0, 0, 5);
3348 test(S("abcdefghij"), 5, 5, S("abcde"), 0, 1, 5);
3349 test(S("abcdefghij"), 5, 5, S("abcde"), 0, 2, 5);
3350 test(S("abcdefghij"), 5, 5, S("abcde"), 0, 4, 5);
3351 test(S("abcdefghij"), 5, 5, S("abcde"), 0, 5, 5);
3352 test(S("abcdefghij"), 5, 5, S("abcde"), 0, 6, 5);
3353 test(S("abcdefghij"), 5, 5, S("abcde"), 1, 0, 5);
3354 test(S("abcdefghij"), 5, 5, S("abcde"), 1, 1, 4);
3355 test(S("abcdefghij"), 5, 5, S("abcde"), 1, 2, 4);
3356 test(S("abcdefghij"), 5, 5, S("abcde"), 1, 3, 4);
3357 test(S("abcdefghij"), 5, 5, S("abcde"), 1, 4, 4);
3358 test(S("abcdefghij"), 5, 5, S("abcde"), 1, 5, 4);
3359 test(S("abcdefghij"), 5, 5, S("abcde"), 2, 0, 5);
3360 test(S("abcdefghij"), 5, 5, S("abcde"), 2, 1, 3);
3361 test(S("abcdefghij"), 5, 5, S("abcde"), 2, 2, 3);
3362 test(S("abcdefghij"), 5, 5, S("abcde"), 2, 3, 3);
3363 test(S("abcdefghij"), 5, 5, S("abcde"), 2, 4, 3);
3364 test(S("abcdefghij"), 5, 5, S("abcde"), 4, 0, 5);
3365 test(S("abcdefghij"), 5, 5, S("abcde"), 4, 1, 1);
3366 test(S("abcdefghij"), 5, 5, S("abcde"), 4, 2, 1);
3367 test(S("abcdefghij"), 5, 5, S("abcde"), 5, 0, 5);
3368 test(S("abcdefghij"), 5, 5, S("abcde"), 5, 1, 5);
3369 test(S("abcdefghij"), 5, 5, S("abcde"), 6, 0, 0);
3370 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 0, 5);
3371 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 1, 5);
3372 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 5, 5);
3373 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 9, 5);
3374 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 10, 5);
3375 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 11, 5);
3376 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 0, 5);
3377 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 1, 4);
3378 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 4, 4);
3379 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 8, 4);
3380 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 9, 4);
3381 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 10, 4);
3382 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 0, 5);
3383 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 1, 4);
3384 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 2, 3);
3385 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 4, 1);
3386 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 5, 0);
3387 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 6, 0);
3388 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 0, 5);
3389 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 1, -4);
3390 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 2, -4);
3391 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 0, 5);
3392 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 1, 5);
3393 test(S("abcdefghij"), 5, 5, S("abcdefghij"), 11, 0, 0);
3394 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
3395 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 1, 5);
3396 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 10, 5);
3397 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 19, 5);
3398 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 20, 5);
3399 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 21, 5);
3400 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
3401 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 1, 4);
3402 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 9, 4);
3403 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 18, 4);
3404 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 19, 4);
3405 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 20, 4);
3406 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
3407 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 1, -5);
3408 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 5, -5);
3409 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 9, -5);
3410 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 10, -5);
3411 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 11, -5);
3412 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
3413 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 1, -14);
3414 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 2, -14);
3415 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
3416 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
3417 test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
3418 test(S("abcdefghij"), 5, 6, S(""), 0, 0, 5);
3419 test(S("abcdefghij"), 5, 6, S(""), 0, 1, 5);
3420 test(S("abcdefghij"), 5, 6, S(""), 1, 0, 0);
3421 test(S("abcdefghij"), 5, 6, S("abcde"), 0, 0, 5);
3422 test(S("abcdefghij"), 5, 6, S("abcde"), 0, 1, 5);
3423 test(S("abcdefghij"), 5, 6, S("abcde"), 0, 2, 5);
3424 test(S("abcdefghij"), 5, 6, S("abcde"), 0, 4, 5);
3425 test(S("abcdefghij"), 5, 6, S("abcde"), 0, 5, 5);
3426 test(S("abcdefghij"), 5, 6, S("abcde"), 0, 6, 5);
3427 test(S("abcdefghij"), 5, 6, S("abcde"), 1, 0, 5);
3428 test(S("abcdefghij"), 5, 6, S("abcde"), 1, 1, 4);
3429 test(S("abcdefghij"), 5, 6, S("abcde"), 1, 2, 4);
3430 test(S("abcdefghij"), 5, 6, S("abcde"), 1, 3, 4);
3431 test(S("abcdefghij"), 5, 6, S("abcde"), 1, 4, 4);
3432 test(S("abcdefghij"), 5, 6, S("abcde"), 1, 5, 4);
3433 test(S("abcdefghij"), 5, 6, S("abcde"), 2, 0, 5);
3434 test(S("abcdefghij"), 5, 6, S("abcde"), 2, 1, 3);
3435 test(S("abcdefghij"), 5, 6, S("abcde"), 2, 2, 3);
3436 }
3437
3438 template <class S>
test32()3439 void test32()
3440 {
3441 test(S("abcdefghij"), 5, 6, S("abcde"), 2, 3, 3);
3442 test(S("abcdefghij"), 5, 6, S("abcde"), 2, 4, 3);
3443 test(S("abcdefghij"), 5, 6, S("abcde"), 4, 0, 5);
3444 test(S("abcdefghij"), 5, 6, S("abcde"), 4, 1, 1);
3445 test(S("abcdefghij"), 5, 6, S("abcde"), 4, 2, 1);
3446 test(S("abcdefghij"), 5, 6, S("abcde"), 5, 0, 5);
3447 test(S("abcdefghij"), 5, 6, S("abcde"), 5, 1, 5);
3448 test(S("abcdefghij"), 5, 6, S("abcde"), 6, 0, 0);
3449 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 0, 5);
3450 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 1, 5);
3451 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 5, 5);
3452 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 9, 5);
3453 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 10, 5);
3454 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 11, 5);
3455 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 0, 5);
3456 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 1, 4);
3457 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 4, 4);
3458 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 8, 4);
3459 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 9, 4);
3460 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 10, 4);
3461 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 0, 5);
3462 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 1, 4);
3463 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 2, 3);
3464 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 4, 1);
3465 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 5, 0);
3466 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 6, 0);
3467 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 0, 5);
3468 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 1, -4);
3469 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 2, -4);
3470 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 0, 5);
3471 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 1, 5);
3472 test(S("abcdefghij"), 5, 6, S("abcdefghij"), 11, 0, 0);
3473 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 0, 5);
3474 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 1, 5);
3475 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 10, 5);
3476 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 19, 5);
3477 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 20, 5);
3478 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 21, 5);
3479 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 0, 5);
3480 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 1, 4);
3481 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 9, 4);
3482 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 18, 4);
3483 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 19, 4);
3484 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 20, 4);
3485 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 0, 5);
3486 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 1, -5);
3487 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 5, -5);
3488 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 9, -5);
3489 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 10, -5);
3490 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 11, -5);
3491 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 0, 5);
3492 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 1, -14);
3493 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 2, -14);
3494 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 0, 5);
3495 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 1, 5);
3496 test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 21, 0, 0);
3497 test(S("abcdefghij"), 9, 0, S(""), 0, 0, 0);
3498 test(S("abcdefghij"), 9, 0, S(""), 0, 1, 0);
3499 test(S("abcdefghij"), 9, 0, S(""), 1, 0, 0);
3500 test(S("abcdefghij"), 9, 0, S("abcde"), 0, 0, 0);
3501 test(S("abcdefghij"), 9, 0, S("abcde"), 0, 1, -1);
3502 test(S("abcdefghij"), 9, 0, S("abcde"), 0, 2, -2);
3503 test(S("abcdefghij"), 9, 0, S("abcde"), 0, 4, -4);
3504 test(S("abcdefghij"), 9, 0, S("abcde"), 0, 5, -5);
3505 test(S("abcdefghij"), 9, 0, S("abcde"), 0, 6, -5);
3506 test(S("abcdefghij"), 9, 0, S("abcde"), 1, 0, 0);
3507 test(S("abcdefghij"), 9, 0, S("abcde"), 1, 1, -1);
3508 test(S("abcdefghij"), 9, 0, S("abcde"), 1, 2, -2);
3509 test(S("abcdefghij"), 9, 0, S("abcde"), 1, 3, -3);
3510 test(S("abcdefghij"), 9, 0, S("abcde"), 1, 4, -4);
3511 test(S("abcdefghij"), 9, 0, S("abcde"), 1, 5, -4);
3512 test(S("abcdefghij"), 9, 0, S("abcde"), 2, 0, 0);
3513 test(S("abcdefghij"), 9, 0, S("abcde"), 2, 1, -1);
3514 test(S("abcdefghij"), 9, 0, S("abcde"), 2, 2, -2);
3515 test(S("abcdefghij"), 9, 0, S("abcde"), 2, 3, -3);
3516 test(S("abcdefghij"), 9, 0, S("abcde"), 2, 4, -3);
3517 test(S("abcdefghij"), 9, 0, S("abcde"), 4, 0, 0);
3518 test(S("abcdefghij"), 9, 0, S("abcde"), 4, 1, -1);
3519 test(S("abcdefghij"), 9, 0, S("abcde"), 4, 2, -1);
3520 test(S("abcdefghij"), 9, 0, S("abcde"), 5, 0, 0);
3521 test(S("abcdefghij"), 9, 0, S("abcde"), 5, 1, 0);
3522 test(S("abcdefghij"), 9, 0, S("abcde"), 6, 0, 0);
3523 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 0, 0);
3524 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 1, -1);
3525 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 5, -5);
3526 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 9, -9);
3527 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 10, -10);
3528 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 11, -10);
3529 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 0, 0);
3530 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 1, -1);
3531 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 4, -4);
3532 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 8, -8);
3533 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 9, -9);
3534 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 10, -9);
3535 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 0, 0);
3536 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 1, -1);
3537 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 2, -2);
3538 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 4, -4);
3539 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 5, -5);
3540 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 6, -5);
3541 }
3542
3543 template <class S>
test33()3544 void test33()
3545 {
3546 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 0, 0);
3547 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 1, -1);
3548 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 2, -1);
3549 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 0, 0);
3550 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 1, 0);
3551 test(S("abcdefghij"), 9, 0, S("abcdefghij"), 11, 0, 0);
3552 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3553 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3554 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3555 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3556 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3557 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3558 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3559 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3560 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3561 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3562 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3563 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3564 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3565 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3566 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3567 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3568 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3569 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3570 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3571 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3572 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3573 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3574 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3575 test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3576 test(S("abcdefghij"), 9, 1, S(""), 0, 0, 1);
3577 test(S("abcdefghij"), 9, 1, S(""), 0, 1, 1);
3578 test(S("abcdefghij"), 9, 1, S(""), 1, 0, 0);
3579 test(S("abcdefghij"), 9, 1, S("abcde"), 0, 0, 1);
3580 test(S("abcdefghij"), 9, 1, S("abcde"), 0, 1, 9);
3581 test(S("abcdefghij"), 9, 1, S("abcde"), 0, 2, 9);
3582 test(S("abcdefghij"), 9, 1, S("abcde"), 0, 4, 9);
3583 test(S("abcdefghij"), 9, 1, S("abcde"), 0, 5, 9);
3584 test(S("abcdefghij"), 9, 1, S("abcde"), 0, 6, 9);
3585 test(S("abcdefghij"), 9, 1, S("abcde"), 1, 0, 1);
3586 test(S("abcdefghij"), 9, 1, S("abcde"), 1, 1, 8);
3587 test(S("abcdefghij"), 9, 1, S("abcde"), 1, 2, 8);
3588 test(S("abcdefghij"), 9, 1, S("abcde"), 1, 3, 8);
3589 test(S("abcdefghij"), 9, 1, S("abcde"), 1, 4, 8);
3590 test(S("abcdefghij"), 9, 1, S("abcde"), 1, 5, 8);
3591 test(S("abcdefghij"), 9, 1, S("abcde"), 2, 0, 1);
3592 test(S("abcdefghij"), 9, 1, S("abcde"), 2, 1, 7);
3593 test(S("abcdefghij"), 9, 1, S("abcde"), 2, 2, 7);
3594 test(S("abcdefghij"), 9, 1, S("abcde"), 2, 3, 7);
3595 test(S("abcdefghij"), 9, 1, S("abcde"), 2, 4, 7);
3596 test(S("abcdefghij"), 9, 1, S("abcde"), 4, 0, 1);
3597 test(S("abcdefghij"), 9, 1, S("abcde"), 4, 1, 5);
3598 test(S("abcdefghij"), 9, 1, S("abcde"), 4, 2, 5);
3599 test(S("abcdefghij"), 9, 1, S("abcde"), 5, 0, 1);
3600 test(S("abcdefghij"), 9, 1, S("abcde"), 5, 1, 1);
3601 test(S("abcdefghij"), 9, 1, S("abcde"), 6, 0, 0);
3602 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 0, 1);
3603 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 1, 9);
3604 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 5, 9);
3605 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 9, 9);
3606 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 10, 9);
3607 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 11, 9);
3608 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 0, 1);
3609 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 1, 8);
3610 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 4, 8);
3611 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 8, 8);
3612 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 9, 8);
3613 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 10, 8);
3614 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 0, 1);
3615 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 1, 4);
3616 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 2, 4);
3617 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 4, 4);
3618 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 5, 4);
3619 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 6, 4);
3620 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 0, 1);
3621 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 1, 0);
3622 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 2, 0);
3623 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 0, 1);
3624 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 1, 1);
3625 test(S("abcdefghij"), 9, 1, S("abcdefghij"), 11, 0, 0);
3626 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
3627 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 1, 9);
3628 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 10, 9);
3629 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 19, 9);
3630 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 20, 9);
3631 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 21, 9);
3632 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
3633 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 1, 8);
3634 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 9, 8);
3635 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 18, 8);
3636 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 19, 8);
3637 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 20, 8);
3638 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
3639 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
3640 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 5, -1);
3641 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 9, -1);
3642 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 10, -1);
3643 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 11, -1);
3644 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
3645 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 1, -10);
3646 }
3647
3648 template <class S>
test34()3649 void test34()
3650 {
3651 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 2, -10);
3652 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
3653 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
3654 test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3655 test(S("abcdefghij"), 9, 2, S(""), 0, 0, 1);
3656 test(S("abcdefghij"), 9, 2, S(""), 0, 1, 1);
3657 test(S("abcdefghij"), 9, 2, S(""), 1, 0, 0);
3658 test(S("abcdefghij"), 9, 2, S("abcde"), 0, 0, 1);
3659 test(S("abcdefghij"), 9, 2, S("abcde"), 0, 1, 9);
3660 test(S("abcdefghij"), 9, 2, S("abcde"), 0, 2, 9);
3661 test(S("abcdefghij"), 9, 2, S("abcde"), 0, 4, 9);
3662 test(S("abcdefghij"), 9, 2, S("abcde"), 0, 5, 9);
3663 test(S("abcdefghij"), 9, 2, S("abcde"), 0, 6, 9);
3664 test(S("abcdefghij"), 9, 2, S("abcde"), 1, 0, 1);
3665 test(S("abcdefghij"), 9, 2, S("abcde"), 1, 1, 8);
3666 test(S("abcdefghij"), 9, 2, S("abcde"), 1, 2, 8);
3667 test(S("abcdefghij"), 9, 2, S("abcde"), 1, 3, 8);
3668 test(S("abcdefghij"), 9, 2, S("abcde"), 1, 4, 8);
3669 test(S("abcdefghij"), 9, 2, S("abcde"), 1, 5, 8);
3670 test(S("abcdefghij"), 9, 2, S("abcde"), 2, 0, 1);
3671 test(S("abcdefghij"), 9, 2, S("abcde"), 2, 1, 7);
3672 test(S("abcdefghij"), 9, 2, S("abcde"), 2, 2, 7);
3673 test(S("abcdefghij"), 9, 2, S("abcde"), 2, 3, 7);
3674 test(S("abcdefghij"), 9, 2, S("abcde"), 2, 4, 7);
3675 test(S("abcdefghij"), 9, 2, S("abcde"), 4, 0, 1);
3676 test(S("abcdefghij"), 9, 2, S("abcde"), 4, 1, 5);
3677 test(S("abcdefghij"), 9, 2, S("abcde"), 4, 2, 5);
3678 test(S("abcdefghij"), 9, 2, S("abcde"), 5, 0, 1);
3679 test(S("abcdefghij"), 9, 2, S("abcde"), 5, 1, 1);
3680 test(S("abcdefghij"), 9, 2, S("abcde"), 6, 0, 0);
3681 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 0, 1);
3682 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 1, 9);
3683 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 5, 9);
3684 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 9, 9);
3685 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 10, 9);
3686 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 11, 9);
3687 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 0, 1);
3688 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 1, 8);
3689 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 4, 8);
3690 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 8, 8);
3691 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 9, 8);
3692 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 10, 8);
3693 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 0, 1);
3694 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 1, 4);
3695 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 2, 4);
3696 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 4, 4);
3697 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 5, 4);
3698 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 6, 4);
3699 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 0, 1);
3700 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 1, 0);
3701 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 2, 0);
3702 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 0, 1);
3703 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 1, 1);
3704 test(S("abcdefghij"), 9, 2, S("abcdefghij"), 11, 0, 0);
3705 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
3706 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 1, 9);
3707 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 10, 9);
3708 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 19, 9);
3709 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 20, 9);
3710 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 21, 9);
3711 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
3712 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 1, 8);
3713 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 9, 8);
3714 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 18, 8);
3715 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 19, 8);
3716 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 20, 8);
3717 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
3718 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 1, -1);
3719 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 5, -1);
3720 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 9, -1);
3721 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 10, -1);
3722 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 11, -1);
3723 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
3724 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 1, -10);
3725 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 2, -10);
3726 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
3727 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
3728 test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
3729 test(S("abcdefghij"), 10, 0, S(""), 0, 0, 0);
3730 test(S("abcdefghij"), 10, 0, S(""), 0, 1, 0);
3731 test(S("abcdefghij"), 10, 0, S(""), 1, 0, 0);
3732 test(S("abcdefghij"), 10, 0, S("abcde"), 0, 0, 0);
3733 test(S("abcdefghij"), 10, 0, S("abcde"), 0, 1, -1);
3734 test(S("abcdefghij"), 10, 0, S("abcde"), 0, 2, -2);
3735 test(S("abcdefghij"), 10, 0, S("abcde"), 0, 4, -4);
3736 test(S("abcdefghij"), 10, 0, S("abcde"), 0, 5, -5);
3737 test(S("abcdefghij"), 10, 0, S("abcde"), 0, 6, -5);
3738 test(S("abcdefghij"), 10, 0, S("abcde"), 1, 0, 0);
3739 test(S("abcdefghij"), 10, 0, S("abcde"), 1, 1, -1);
3740 test(S("abcdefghij"), 10, 0, S("abcde"), 1, 2, -2);
3741 test(S("abcdefghij"), 10, 0, S("abcde"), 1, 3, -3);
3742 test(S("abcdefghij"), 10, 0, S("abcde"), 1, 4, -4);
3743 test(S("abcdefghij"), 10, 0, S("abcde"), 1, 5, -4);
3744 test(S("abcdefghij"), 10, 0, S("abcde"), 2, 0, 0);
3745 test(S("abcdefghij"), 10, 0, S("abcde"), 2, 1, -1);
3746 test(S("abcdefghij"), 10, 0, S("abcde"), 2, 2, -2);
3747 test(S("abcdefghij"), 10, 0, S("abcde"), 2, 3, -3);
3748 test(S("abcdefghij"), 10, 0, S("abcde"), 2, 4, -3);
3749 test(S("abcdefghij"), 10, 0, S("abcde"), 4, 0, 0);
3750 test(S("abcdefghij"), 10, 0, S("abcde"), 4, 1, -1);
3751 }
3752
3753 template <class S>
test35()3754 void test35()
3755 {
3756 test(S("abcdefghij"), 10, 0, S("abcde"), 4, 2, -1);
3757 test(S("abcdefghij"), 10, 0, S("abcde"), 5, 0, 0);
3758 test(S("abcdefghij"), 10, 0, S("abcde"), 5, 1, 0);
3759 test(S("abcdefghij"), 10, 0, S("abcde"), 6, 0, 0);
3760 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 0, 0);
3761 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 1, -1);
3762 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 5, -5);
3763 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 9, -9);
3764 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 10, -10);
3765 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 11, -10);
3766 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 0, 0);
3767 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 1, -1);
3768 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 4, -4);
3769 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 8, -8);
3770 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 9, -9);
3771 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 10, -9);
3772 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 0, 0);
3773 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 1, -1);
3774 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 2, -2);
3775 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 4, -4);
3776 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 5, -5);
3777 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 6, -5);
3778 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 0, 0);
3779 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 1, -1);
3780 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 2, -1);
3781 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 0, 0);
3782 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 1, 0);
3783 test(S("abcdefghij"), 10, 0, S("abcdefghij"), 11, 0, 0);
3784 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3785 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3786 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3787 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3788 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3789 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3790 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3791 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3792 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3793 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3794 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3795 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3796 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3797 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3798 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3799 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3800 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3801 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3802 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3803 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3804 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3805 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3806 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3807 test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3808 test(S("abcdefghij"), 10, 1, S(""), 0, 0, 0);
3809 test(S("abcdefghij"), 10, 1, S(""), 0, 1, 0);
3810 test(S("abcdefghij"), 10, 1, S(""), 1, 0, 0);
3811 test(S("abcdefghij"), 10, 1, S("abcde"), 0, 0, 0);
3812 test(S("abcdefghij"), 10, 1, S("abcde"), 0, 1, -1);
3813 test(S("abcdefghij"), 10, 1, S("abcde"), 0, 2, -2);
3814 test(S("abcdefghij"), 10, 1, S("abcde"), 0, 4, -4);
3815 test(S("abcdefghij"), 10, 1, S("abcde"), 0, 5, -5);
3816 test(S("abcdefghij"), 10, 1, S("abcde"), 0, 6, -5);
3817 test(S("abcdefghij"), 10, 1, S("abcde"), 1, 0, 0);
3818 test(S("abcdefghij"), 10, 1, S("abcde"), 1, 1, -1);
3819 test(S("abcdefghij"), 10, 1, S("abcde"), 1, 2, -2);
3820 test(S("abcdefghij"), 10, 1, S("abcde"), 1, 3, -3);
3821 test(S("abcdefghij"), 10, 1, S("abcde"), 1, 4, -4);
3822 test(S("abcdefghij"), 10, 1, S("abcde"), 1, 5, -4);
3823 test(S("abcdefghij"), 10, 1, S("abcde"), 2, 0, 0);
3824 test(S("abcdefghij"), 10, 1, S("abcde"), 2, 1, -1);
3825 test(S("abcdefghij"), 10, 1, S("abcde"), 2, 2, -2);
3826 test(S("abcdefghij"), 10, 1, S("abcde"), 2, 3, -3);
3827 test(S("abcdefghij"), 10, 1, S("abcde"), 2, 4, -3);
3828 test(S("abcdefghij"), 10, 1, S("abcde"), 4, 0, 0);
3829 test(S("abcdefghij"), 10, 1, S("abcde"), 4, 1, -1);
3830 test(S("abcdefghij"), 10, 1, S("abcde"), 4, 2, -1);
3831 test(S("abcdefghij"), 10, 1, S("abcde"), 5, 0, 0);
3832 test(S("abcdefghij"), 10, 1, S("abcde"), 5, 1, 0);
3833 test(S("abcdefghij"), 10, 1, S("abcde"), 6, 0, 0);
3834 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 0, 0);
3835 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 1, -1);
3836 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 5, -5);
3837 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 9, -9);
3838 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 10, -10);
3839 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 11, -10);
3840 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 0, 0);
3841 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 1, -1);
3842 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 4, -4);
3843 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 8, -8);
3844 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 9, -9);
3845 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 10, -9);
3846 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 0, 0);
3847 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 1, -1);
3848 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 2, -2);
3849 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 4, -4);
3850 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 5, -5);
3851 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 6, -5);
3852 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 0, 0);
3853 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 1, -1);
3854 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 2, -1);
3855 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 0, 0);
3856 }
3857
3858 template <class S>
test36()3859 void test36()
3860 {
3861 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 1, 0);
3862 test(S("abcdefghij"), 10, 1, S("abcdefghij"), 11, 0, 0);
3863 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
3864 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
3865 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
3866 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
3867 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
3868 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
3869 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
3870 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
3871 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
3872 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
3873 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
3874 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
3875 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
3876 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
3877 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
3878 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
3879 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
3880 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
3881 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
3882 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
3883 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
3884 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
3885 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
3886 test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3887 test(S("abcdefghij"), 11, 0, S(""), 0, 0, 0);
3888 test(S("abcdefghij"), 11, 0, S(""), 0, 1, 0);
3889 test(S("abcdefghij"), 11, 0, S(""), 1, 0, 0);
3890 test(S("abcdefghij"), 11, 0, S("abcde"), 0, 0, 0);
3891 test(S("abcdefghij"), 11, 0, S("abcde"), 0, 1, 0);
3892 test(S("abcdefghij"), 11, 0, S("abcde"), 0, 2, 0);
3893 test(S("abcdefghij"), 11, 0, S("abcde"), 0, 4, 0);
3894 test(S("abcdefghij"), 11, 0, S("abcde"), 0, 5, 0);
3895 test(S("abcdefghij"), 11, 0, S("abcde"), 0, 6, 0);
3896 test(S("abcdefghij"), 11, 0, S("abcde"), 1, 0, 0);
3897 test(S("abcdefghij"), 11, 0, S("abcde"), 1, 1, 0);
3898 test(S("abcdefghij"), 11, 0, S("abcde"), 1, 2, 0);
3899 test(S("abcdefghij"), 11, 0, S("abcde"), 1, 3, 0);
3900 test(S("abcdefghij"), 11, 0, S("abcde"), 1, 4, 0);
3901 test(S("abcdefghij"), 11, 0, S("abcde"), 1, 5, 0);
3902 test(S("abcdefghij"), 11, 0, S("abcde"), 2, 0, 0);
3903 test(S("abcdefghij"), 11, 0, S("abcde"), 2, 1, 0);
3904 test(S("abcdefghij"), 11, 0, S("abcde"), 2, 2, 0);
3905 test(S("abcdefghij"), 11, 0, S("abcde"), 2, 3, 0);
3906 test(S("abcdefghij"), 11, 0, S("abcde"), 2, 4, 0);
3907 test(S("abcdefghij"), 11, 0, S("abcde"), 4, 0, 0);
3908 test(S("abcdefghij"), 11, 0, S("abcde"), 4, 1, 0);
3909 test(S("abcdefghij"), 11, 0, S("abcde"), 4, 2, 0);
3910 test(S("abcdefghij"), 11, 0, S("abcde"), 5, 0, 0);
3911 test(S("abcdefghij"), 11, 0, S("abcde"), 5, 1, 0);
3912 test(S("abcdefghij"), 11, 0, S("abcde"), 6, 0, 0);
3913 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 0, 0);
3914 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 1, 0);
3915 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 5, 0);
3916 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 9, 0);
3917 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 10, 0);
3918 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 11, 0);
3919 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 0, 0);
3920 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 1, 0);
3921 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 4, 0);
3922 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 8, 0);
3923 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 9, 0);
3924 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 10, 0);
3925 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 0, 0);
3926 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 1, 0);
3927 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 2, 0);
3928 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 4, 0);
3929 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 5, 0);
3930 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 6, 0);
3931 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 0, 0);
3932 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 1, 0);
3933 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 2, 0);
3934 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 0, 0);
3935 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 1, 0);
3936 test(S("abcdefghij"), 11, 0, S("abcdefghij"), 11, 0, 0);
3937 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3938 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
3939 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
3940 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
3941 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
3942 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
3943 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3944 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
3945 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
3946 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
3947 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
3948 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
3949 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3950 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
3951 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
3952 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
3953 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
3954 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
3955 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3956 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
3957 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
3958 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3959 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3960 test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3961 }
3962
3963 template <class S>
test37()3964 void test37()
3965 {
3966 test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 0, 0);
3967 test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 1, 0);
3968 test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 1, 0, 0);
3969 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 0, 0);
3970 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 1, -1);
3971 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 2, -2);
3972 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 4, -4);
3973 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 5, -5);
3974 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 6, -5);
3975 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 0, 0);
3976 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 1, -1);
3977 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 2, -2);
3978 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 3, -3);
3979 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 4, -4);
3980 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 5, -4);
3981 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 0, 0);
3982 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 1, -1);
3983 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 2, -2);
3984 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 3, -3);
3985 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 4, -3);
3986 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 0, 0);
3987 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 1, -1);
3988 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 2, -1);
3989 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 0, 0);
3990 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 1, 0);
3991 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 6, 0, 0);
3992 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 0, 0);
3993 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 1, -1);
3994 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 5, -5);
3995 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 9, -9);
3996 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 10, -10);
3997 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 11, -10);
3998 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 0, 0);
3999 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 1, -1);
4000 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 4, -4);
4001 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 8, -8);
4002 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 9, -9);
4003 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 10, -9);
4004 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 0, 0);
4005 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 1, -1);
4006 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 2, -2);
4007 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 4, -4);
4008 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 5, -5);
4009 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 6, -5);
4010 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 0, 0);
4011 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 1, -1);
4012 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 2, -1);
4013 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 0, 0);
4014 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 1, 0);
4015 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 11, 0, 0);
4016 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4017 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4018 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4019 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4020 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4021 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4022 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4023 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4024 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4025 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4026 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4027 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4028 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4029 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4030 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4031 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4032 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4033 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4034 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4035 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4036 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4037 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4038 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4039 test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4040 test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 0, 1);
4041 test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 1, 1);
4042 test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 1, 0, 0);
4043 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 0, 1);
4044 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 1, 0);
4045 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 2, -1);
4046 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 4, -3);
4047 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 5, -4);
4048 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 6, -4);
4049 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 0, 1);
4050 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 1, -1);
4051 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 2, -1);
4052 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 3, -1);
4053 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 4, -1);
4054 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 5, -1);
4055 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 0, 1);
4056 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 1, -2);
4057 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 2, -2);
4058 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 3, -2);
4059 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 4, -2);
4060 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 0, 1);
4061 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 1, -4);
4062 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 2, -4);
4063 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 0, 1);
4064 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 1, 1);
4065 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 6, 0, 0);
4066 }
4067
4068 template <class S>
test38()4069 void test38()
4070 {
4071 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 0, 1);
4072 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 1, 0);
4073 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 5, -4);
4074 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 9, -8);
4075 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 10, -9);
4076 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 11, -9);
4077 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 0, 1);
4078 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 1, -1);
4079 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 4, -1);
4080 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 8, -1);
4081 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 9, -1);
4082 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 10, -1);
4083 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 0, 1);
4084 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 1, -5);
4085 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 2, -5);
4086 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 4, -5);
4087 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 5, -5);
4088 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 6, -5);
4089 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 0, 1);
4090 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 1, -9);
4091 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 2, -9);
4092 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 0, 1);
4093 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 1, 1);
4094 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 11, 0, 0);
4095 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
4096 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
4097 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
4098 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
4099 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
4100 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
4101 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
4102 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
4103 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
4104 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
4105 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
4106 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
4107 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
4108 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
4109 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
4110 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
4111 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
4112 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
4113 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
4114 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
4115 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
4116 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
4117 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
4118 test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
4119 test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 0, 10);
4120 test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 1, 10);
4121 test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 1, 0, 0);
4122 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 0, 10);
4123 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 1, 9);
4124 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 2, 8);
4125 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 4, 6);
4126 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 5, 5);
4127 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 6, 5);
4128 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 0, 10);
4129 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 1, -1);
4130 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 2, -1);
4131 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 3, -1);
4132 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 4, -1);
4133 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 5, -1);
4134 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 0, 10);
4135 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 1, -2);
4136 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 2, -2);
4137 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 3, -2);
4138 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 4, -2);
4139 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 0, 10);
4140 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 1, -4);
4141 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 2, -4);
4142 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 0, 10);
4143 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 1, 10);
4144 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 6, 0, 0);
4145 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 0, 10);
4146 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 1, 9);
4147 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 5, 5);
4148 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 9, 1);
4149 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 10, 0);
4150 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 11, 0);
4151 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 0, 10);
4152 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 1, -1);
4153 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 4, -1);
4154 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 8, -1);
4155 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 9, -1);
4156 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 10, -1);
4157 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 0, 10);
4158 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 1, -5);
4159 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 2, -5);
4160 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 4, -5);
4161 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 5, -5);
4162 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 6, -5);
4163 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 0, 10);
4164 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 1, -9);
4165 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 2, -9);
4166 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 0, 10);
4167 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 1, 10);
4168 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 11, 0, 0);
4169 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
4170 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9);
4171 }
4172
4173 template <class S>
test39()4174 void test39()
4175 {
4176 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0);
4177 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9);
4178 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10);
4179 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10);
4180 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
4181 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1);
4182 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1);
4183 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1);
4184 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1);
4185 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1);
4186 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
4187 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10);
4188 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10);
4189 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10);
4190 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10);
4191 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10);
4192 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
4193 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19);
4194 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19);
4195 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
4196 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
4197 test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
4198 test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 0, 19);
4199 test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 1, 19);
4200 test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 1, 0, 0);
4201 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 0, 19);
4202 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 1, 18);
4203 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 2, 17);
4204 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 4, 15);
4205 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 5, 14);
4206 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 6, 14);
4207 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 0, 19);
4208 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 1, -1);
4209 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 2, -1);
4210 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 3, -1);
4211 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 4, -1);
4212 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 5, -1);
4213 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 0, 19);
4214 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 1, -2);
4215 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 2, -2);
4216 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 3, -2);
4217 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 4, -2);
4218 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 0, 19);
4219 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 1, -4);
4220 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 2, -4);
4221 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 0, 19);
4222 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 1, 19);
4223 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 6, 0, 0);
4224 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 0, 19);
4225 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 1, 18);
4226 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 5, 14);
4227 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 9, 10);
4228 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 10, 9);
4229 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 11, 9);
4230 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 0, 19);
4231 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 1, -1);
4232 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 4, -1);
4233 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 8, -1);
4234 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 9, -1);
4235 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 10, -1);
4236 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 0, 19);
4237 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 1, -5);
4238 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 2, -5);
4239 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 4, -5);
4240 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 5, -5);
4241 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 6, -5);
4242 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 0, 19);
4243 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 1, -9);
4244 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 2, -9);
4245 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 0, 19);
4246 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 1, 19);
4247 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 11, 0, 0);
4248 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 0, 19);
4249 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 1, 18);
4250 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 10, 9);
4251 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 19, 0);
4252 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 20, -1);
4253 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 21, -1);
4254 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 0, 19);
4255 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 1, -1);
4256 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 9, -1);
4257 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 18, -1);
4258 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 19, -1);
4259 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 20, -1);
4260 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 0, 19);
4261 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 1, -10);
4262 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 5, -10);
4263 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 9, -10);
4264 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 10, -10);
4265 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 11, -10);
4266 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 0, 19);
4267 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 1, -19);
4268 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 2, -19);
4269 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 0, 19);
4270 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 1, 19);
4271 test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 21, 0, 0);
4272 test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 0, 20);
4273 test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 1, 20);
4274 test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 1, 0, 0);
4275 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 0, 20);
4276 }
4277
4278 template <class S>
test40()4279 void test40()
4280 {
4281 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 1, 19);
4282 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 2, 18);
4283 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 4, 16);
4284 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 5, 15);
4285 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 6, 15);
4286 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 0, 20);
4287 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 1, -1);
4288 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 2, -1);
4289 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 3, -1);
4290 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 4, -1);
4291 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 5, -1);
4292 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 0, 20);
4293 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 1, -2);
4294 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 2, -2);
4295 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 3, -2);
4296 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 4, -2);
4297 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 0, 20);
4298 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 1, -4);
4299 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 2, -4);
4300 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 0, 20);
4301 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 1, 20);
4302 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 6, 0, 0);
4303 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 0, 20);
4304 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 1, 19);
4305 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 5, 15);
4306 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 9, 11);
4307 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 10, 10);
4308 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 11, 10);
4309 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 0, 20);
4310 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 1, -1);
4311 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 4, -1);
4312 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 8, -1);
4313 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 9, -1);
4314 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 10, -1);
4315 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 0, 20);
4316 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 1, -5);
4317 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 2, -5);
4318 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 4, -5);
4319 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 5, -5);
4320 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 6, -5);
4321 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 0, 20);
4322 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 1, -9);
4323 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 2, -9);
4324 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 0, 20);
4325 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 1, 20);
4326 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 11, 0, 0);
4327 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 0, 20);
4328 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 1, 19);
4329 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 10, 10);
4330 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 19, 1);
4331 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 20, 0);
4332 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 21, 0);
4333 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 0, 20);
4334 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 1, -1);
4335 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 9, -1);
4336 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 18, -1);
4337 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 19, -1);
4338 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 20, -1);
4339 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 0, 20);
4340 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 1, -10);
4341 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 5, -10);
4342 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 9, -10);
4343 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 10, -10);
4344 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 11, -10);
4345 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 0, 20);
4346 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 1, -19);
4347 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 2, -19);
4348 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 0, 20);
4349 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 1, 20);
4350 test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 21, 0, 0);
4351 test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 0, 20);
4352 test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 1, 20);
4353 test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 1, 0, 0);
4354 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 0, 20);
4355 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 1, 19);
4356 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 2, 18);
4357 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 4, 16);
4358 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 5, 15);
4359 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 6, 15);
4360 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 0, 20);
4361 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 1, -1);
4362 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 2, -1);
4363 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 3, -1);
4364 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 4, -1);
4365 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 5, -1);
4366 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 0, 20);
4367 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 1, -2);
4368 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 2, -2);
4369 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 3, -2);
4370 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 4, -2);
4371 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 0, 20);
4372 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 1, -4);
4373 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 2, -4);
4374 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 0, 20);
4375 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 1, 20);
4376 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 6, 0, 0);
4377 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 0, 20);
4378 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 1, 19);
4379 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 5, 15);
4380 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 9, 11);
4381 }
4382
4383 template <class S>
test41()4384 void test41()
4385 {
4386 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 10, 10);
4387 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 11, 10);
4388 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 0, 20);
4389 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 1, -1);
4390 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 4, -1);
4391 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 8, -1);
4392 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 9, -1);
4393 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 10, -1);
4394 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 0, 20);
4395 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 1, -5);
4396 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 2, -5);
4397 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 4, -5);
4398 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 5, -5);
4399 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 6, -5);
4400 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 0, 20);
4401 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 1, -9);
4402 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 2, -9);
4403 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 0, 20);
4404 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 1, 20);
4405 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 11, 0, 0);
4406 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 0, 20);
4407 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 1, 19);
4408 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 10, 10);
4409 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 19, 1);
4410 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 20, 0);
4411 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 21, 0);
4412 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 0, 20);
4413 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 1, -1);
4414 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 9, -1);
4415 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 18, -1);
4416 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 19, -1);
4417 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 20, -1);
4418 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 0, 20);
4419 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 1, -10);
4420 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 5, -10);
4421 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 9, -10);
4422 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 10, -10);
4423 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 11, -10);
4424 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 0, 20);
4425 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 1, -19);
4426 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 2, -19);
4427 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 0, 20);
4428 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 1, 20);
4429 test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 21, 0, 0);
4430 test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 0, 0);
4431 test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 1, 0);
4432 test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 1, 0, 0);
4433 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 0, 0);
4434 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 1, -1);
4435 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 2, -2);
4436 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 4, -4);
4437 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 5, -5);
4438 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 6, -5);
4439 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 0, 0);
4440 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 1, -1);
4441 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 2, -2);
4442 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 3, -3);
4443 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 4, -4);
4444 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 5, -4);
4445 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 0, 0);
4446 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 1, -1);
4447 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 2, -2);
4448 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 3, -3);
4449 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 4, -3);
4450 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 0, 0);
4451 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 1, -1);
4452 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 2, -1);
4453 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 0, 0);
4454 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 1, 0);
4455 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 6, 0, 0);
4456 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 0, 0);
4457 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 1, -1);
4458 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 5, -5);
4459 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 9, -9);
4460 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 10, -10);
4461 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 11, -10);
4462 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 0, 0);
4463 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 1, -1);
4464 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 4, -4);
4465 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 8, -8);
4466 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 9, -9);
4467 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 10, -9);
4468 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 0, 0);
4469 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 1, -1);
4470 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 2, -2);
4471 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 4, -4);
4472 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 5, -5);
4473 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 6, -5);
4474 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 0, 0);
4475 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 1, -1);
4476 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 2, -1);
4477 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 0, 0);
4478 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 1, 0);
4479 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 11, 0, 0);
4480 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4481 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4482 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4483 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4484 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4485 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4486 }
4487
4488 template <class S>
test42()4489 void test42()
4490 {
4491 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4492 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4493 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4494 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4495 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4496 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4497 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4498 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4499 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4500 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4501 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4502 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4503 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4504 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4505 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4506 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4507 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4508 test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4509 test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 0, 1);
4510 test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 1, 1);
4511 test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 1, 0, 0);
4512 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 0, 1);
4513 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 1, 1);
4514 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 2, 1);
4515 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 4, 1);
4516 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 5, 1);
4517 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 6, 1);
4518 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 0, 1);
4519 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 1, 0);
4520 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 2, -1);
4521 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 3, -2);
4522 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 4, -3);
4523 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 5, -3);
4524 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 0, 1);
4525 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 1, -1);
4526 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 2, -1);
4527 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 3, -1);
4528 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 4, -1);
4529 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 0, 1);
4530 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 1, -3);
4531 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 2, -3);
4532 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 0, 1);
4533 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 1, 1);
4534 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 6, 0, 0);
4535 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 0, 1);
4536 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 1, 1);
4537 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 5, 1);
4538 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 9, 1);
4539 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 10, 1);
4540 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 11, 1);
4541 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 0, 1);
4542 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 1, 0);
4543 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 4, -3);
4544 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 8, -7);
4545 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 9, -8);
4546 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 10, -8);
4547 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 0, 1);
4548 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 1, -4);
4549 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 2, -4);
4550 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 4, -4);
4551 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 5, -4);
4552 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 6, -4);
4553 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 0, 1);
4554 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 1, -8);
4555 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 2, -8);
4556 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 0, 1);
4557 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 1, 1);
4558 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 11, 0, 0);
4559 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
4560 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
4561 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
4562 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
4563 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
4564 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
4565 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
4566 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
4567 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
4568 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
4569 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
4570 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
4571 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
4572 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
4573 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
4574 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
4575 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
4576 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
4577 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
4578 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
4579 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
4580 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
4581 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
4582 test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
4583 test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 0, 9);
4584 test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 1, 9);
4585 test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 1, 0, 0);
4586 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 0, 9);
4587 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 1, 1);
4588 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 2, 1);
4589 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 4, 1);
4590 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 5, 1);
4591 }
4592
4593 template <class S>
test43()4594 void test43()
4595 {
4596 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 6, 1);
4597 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 0, 9);
4598 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 1, 8);
4599 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 2, 7);
4600 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 3, 6);
4601 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 4, 5);
4602 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 5, 5);
4603 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 0, 9);
4604 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 1, -1);
4605 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 2, -1);
4606 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 3, -1);
4607 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 4, -1);
4608 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 0, 9);
4609 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 1, -3);
4610 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 2, -3);
4611 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 0, 9);
4612 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 1, 9);
4613 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 6, 0, 0);
4614 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 0, 9);
4615 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 1, 1);
4616 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 5, 1);
4617 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 9, 1);
4618 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 10, 1);
4619 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 11, 1);
4620 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 0, 9);
4621 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 1, 8);
4622 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 4, 5);
4623 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 8, 1);
4624 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 9, 0);
4625 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 10, 0);
4626 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 0, 9);
4627 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 1, -4);
4628 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 2, -4);
4629 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 4, -4);
4630 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 5, -4);
4631 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 6, -4);
4632 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 0, 9);
4633 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 1, -8);
4634 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 2, -8);
4635 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 0, 9);
4636 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 1, 9);
4637 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 11, 0, 0);
4638 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
4639 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1);
4640 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1);
4641 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1);
4642 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1);
4643 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1);
4644 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
4645 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8);
4646 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0);
4647 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9);
4648 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10);
4649 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10);
4650 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
4651 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9);
4652 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9);
4653 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9);
4654 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9);
4655 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9);
4656 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
4657 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18);
4658 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18);
4659 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
4660 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
4661 test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
4662 test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 0, 18);
4663 test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 1, 18);
4664 test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 1, 0, 0);
4665 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 0, 18);
4666 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 1, 1);
4667 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 2, 1);
4668 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 4, 1);
4669 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 5, 1);
4670 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 6, 1);
4671 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 0, 18);
4672 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 1, 17);
4673 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 2, 16);
4674 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 3, 15);
4675 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 4, 14);
4676 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 5, 14);
4677 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 0, 18);
4678 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 1, -1);
4679 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 2, -1);
4680 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 3, -1);
4681 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 4, -1);
4682 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 0, 18);
4683 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 1, -3);
4684 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 2, -3);
4685 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 0, 18);
4686 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 1, 18);
4687 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 6, 0, 0);
4688 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 0, 18);
4689 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 1, 1);
4690 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 5, 1);
4691 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 9, 1);
4692 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 10, 1);
4693 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 11, 1);
4694 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 0, 18);
4695 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 1, 17);
4696 }
4697
4698 template <class S>
test44()4699 void test44()
4700 {
4701 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 4, 14);
4702 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 8, 10);
4703 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 9, 9);
4704 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 10, 9);
4705 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 0, 18);
4706 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 1, -4);
4707 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 2, -4);
4708 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 4, -4);
4709 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 5, -4);
4710 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 6, -4);
4711 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 0, 18);
4712 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 1, -8);
4713 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 2, -8);
4714 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 0, 18);
4715 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 1, 18);
4716 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 11, 0, 0);
4717 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 0, 18);
4718 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 1, 1);
4719 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 10, 1);
4720 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 19, 1);
4721 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 20, 1);
4722 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 21, 1);
4723 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 0, 18);
4724 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 1, 17);
4725 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 9, 9);
4726 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 18, 0);
4727 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 19, -1);
4728 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 20, -1);
4729 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 0, 18);
4730 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 1, -9);
4731 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 5, -9);
4732 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 9, -9);
4733 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 10, -9);
4734 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 11, -9);
4735 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 0, 18);
4736 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 1, -18);
4737 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 2, -18);
4738 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 0, 18);
4739 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 1, 18);
4740 test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 21, 0, 0);
4741 test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 0, 19);
4742 test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 1, 19);
4743 test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 1, 0, 0);
4744 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 0, 19);
4745 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 1, 1);
4746 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 2, 1);
4747 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 4, 1);
4748 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 5, 1);
4749 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 6, 1);
4750 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 0, 19);
4751 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 1, 18);
4752 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 2, 17);
4753 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 3, 16);
4754 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 4, 15);
4755 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 5, 15);
4756 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 0, 19);
4757 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 1, -1);
4758 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 2, -1);
4759 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 3, -1);
4760 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 4, -1);
4761 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 0, 19);
4762 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 1, -3);
4763 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 2, -3);
4764 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 0, 19);
4765 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 1, 19);
4766 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 6, 0, 0);
4767 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 0, 19);
4768 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 1, 1);
4769 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 5, 1);
4770 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 9, 1);
4771 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 10, 1);
4772 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 11, 1);
4773 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 0, 19);
4774 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 1, 18);
4775 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 4, 15);
4776 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 8, 11);
4777 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 9, 10);
4778 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 10, 10);
4779 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 0, 19);
4780 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 1, -4);
4781 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 2, -4);
4782 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 4, -4);
4783 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 5, -4);
4784 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 6, -4);
4785 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 0, 19);
4786 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 1, -8);
4787 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 2, -8);
4788 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 0, 19);
4789 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 1, 19);
4790 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 11, 0, 0);
4791 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 0, 19);
4792 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 1, 1);
4793 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 10, 1);
4794 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 19, 1);
4795 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 20, 1);
4796 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 21, 1);
4797 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 0, 19);
4798 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 1, 18);
4799 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 9, 10);
4800 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 18, 1);
4801 }
4802
4803 template <class S>
test45()4804 void test45()
4805 {
4806 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 19, 0);
4807 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 20, 0);
4808 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 0, 19);
4809 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 1, -9);
4810 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 5, -9);
4811 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 9, -9);
4812 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 10, -9);
4813 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 11, -9);
4814 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 0, 19);
4815 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 1, -18);
4816 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 2, -18);
4817 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 0, 19);
4818 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 1, 19);
4819 test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 21, 0, 0);
4820 test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 0, 19);
4821 test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 1, 19);
4822 test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 1, 0, 0);
4823 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 0, 19);
4824 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 1, 1);
4825 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 2, 1);
4826 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 4, 1);
4827 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 5, 1);
4828 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 6, 1);
4829 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 0, 19);
4830 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 1, 18);
4831 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 2, 17);
4832 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 3, 16);
4833 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 4, 15);
4834 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 5, 15);
4835 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 0, 19);
4836 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 1, -1);
4837 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 2, -1);
4838 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 3, -1);
4839 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 4, -1);
4840 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 0, 19);
4841 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 1, -3);
4842 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 2, -3);
4843 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 0, 19);
4844 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 1, 19);
4845 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 6, 0, 0);
4846 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 0, 19);
4847 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 1, 1);
4848 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 5, 1);
4849 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 9, 1);
4850 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 10, 1);
4851 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 11, 1);
4852 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 0, 19);
4853 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 1, 18);
4854 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 4, 15);
4855 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 8, 11);
4856 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 9, 10);
4857 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 10, 10);
4858 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 0, 19);
4859 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 1, -4);
4860 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 2, -4);
4861 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 4, -4);
4862 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 5, -4);
4863 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 6, -4);
4864 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 0, 19);
4865 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 1, -8);
4866 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 2, -8);
4867 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 0, 19);
4868 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 1, 19);
4869 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 11, 0, 0);
4870 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 0, 19);
4871 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 1, 1);
4872 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 10, 1);
4873 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 19, 1);
4874 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 20, 1);
4875 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 21, 1);
4876 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 0, 19);
4877 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 1, 18);
4878 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 9, 10);
4879 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 18, 1);
4880 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 19, 0);
4881 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 20, 0);
4882 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 0, 19);
4883 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 1, -9);
4884 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 5, -9);
4885 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 9, -9);
4886 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 10, -9);
4887 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 11, -9);
4888 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 0, 19);
4889 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 1, -18);
4890 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 2, -18);
4891 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 0, 19);
4892 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 1, 19);
4893 test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 21, 0, 0);
4894 test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 0, 0);
4895 test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 1, 0);
4896 test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 1, 0, 0);
4897 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 0, 0);
4898 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 1, -1);
4899 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 2, -2);
4900 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 4, -4);
4901 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 5, -5);
4902 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 6, -5);
4903 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 0, 0);
4904 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 1, -1);
4905 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 2, -2);
4906 }
4907
4908 template <class S>
test46()4909 void test46()
4910 {
4911 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 3, -3);
4912 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 4, -4);
4913 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 5, -4);
4914 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 0, 0);
4915 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 1, -1);
4916 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 2, -2);
4917 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 3, -3);
4918 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 4, -3);
4919 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 0, 0);
4920 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 1, -1);
4921 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 2, -1);
4922 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 0, 0);
4923 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 1, 0);
4924 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 6, 0, 0);
4925 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 0, 0);
4926 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 1, -1);
4927 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 5, -5);
4928 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 9, -9);
4929 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 10, -10);
4930 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 11, -10);
4931 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 0, 0);
4932 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 1, -1);
4933 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 4, -4);
4934 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 8, -8);
4935 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 9, -9);
4936 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 10, -9);
4937 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 0, 0);
4938 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 1, -1);
4939 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 2, -2);
4940 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 4, -4);
4941 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 5, -5);
4942 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 6, -5);
4943 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 0, 0);
4944 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 1, -1);
4945 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 2, -1);
4946 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 0, 0);
4947 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 1, 0);
4948 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 11, 0, 0);
4949 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4950 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4951 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4952 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4953 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4954 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4955 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4956 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4957 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4958 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4959 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4960 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4961 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4962 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4963 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4964 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4965 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4966 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4967 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4968 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4969 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4970 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4971 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4972 test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4973 test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 0, 1);
4974 test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 1, 1);
4975 test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 1, 0, 0);
4976 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 0, 1);
4977 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 1, 10);
4978 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 2, 10);
4979 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 4, 10);
4980 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 5, 10);
4981 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 6, 10);
4982 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 0, 1);
4983 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 1, 9);
4984 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 2, 9);
4985 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 3, 9);
4986 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 4, 9);
4987 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 5, 9);
4988 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 0, 1);
4989 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 1, 8);
4990 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 2, 8);
4991 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 3, 8);
4992 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 4, 8);
4993 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 0, 1);
4994 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 1, 6);
4995 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 2, 6);
4996 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 0, 1);
4997 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 1, 1);
4998 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 6, 0, 0);
4999 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 0, 1);
5000 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 1, 10);
5001 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 5, 10);
5002 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 9, 10);
5003 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 10, 10);
5004 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 11, 10);
5005 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 0, 1);
5006 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 1, 9);
5007 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 4, 9);
5008 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 8, 9);
5009 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 9, 9);
5010 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 10, 9);
5011 }
5012
5013 template <class S>
test47()5014 void test47()
5015 {
5016 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 0, 1);
5017 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 1, 5);
5018 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 2, 5);
5019 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 4, 5);
5020 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 5, 5);
5021 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 6, 5);
5022 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 0, 1);
5023 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 1, 1);
5024 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 2, 1);
5025 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 0, 1);
5026 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 1, 1);
5027 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 11, 0, 0);
5028 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
5029 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, 10);
5030 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, 10);
5031 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, 10);
5032 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, 10);
5033 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, 10);
5034 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
5035 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, 9);
5036 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, 9);
5037 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, 9);
5038 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, 9);
5039 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, 9);
5040 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
5041 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, 0);
5042 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -4);
5043 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -8);
5044 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
5045 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
5046 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
5047 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -9);
5048 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -9);
5049 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
5050 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
5051 test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5052 test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 0, 5);
5053 test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 1, 5);
5054 test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 1, 0, 0);
5055 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 0, 5);
5056 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 1, 10);
5057 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 2, 10);
5058 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 4, 10);
5059 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 5, 10);
5060 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 6, 10);
5061 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 0, 5);
5062 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 1, 9);
5063 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 2, 9);
5064 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 3, 9);
5065 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 4, 9);
5066 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 5, 9);
5067 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 0, 5);
5068 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 1, 8);
5069 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 2, 8);
5070 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 3, 8);
5071 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 4, 8);
5072 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 0, 5);
5073 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 1, 6);
5074 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 2, 6);
5075 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 0, 5);
5076 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 1, 5);
5077 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 6, 0, 0);
5078 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 0, 5);
5079 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 1, 10);
5080 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 5, 10);
5081 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 9, 10);
5082 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 10, 10);
5083 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 11, 10);
5084 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 0, 5);
5085 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 1, 9);
5086 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 4, 9);
5087 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 8, 9);
5088 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 9, 9);
5089 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 10, 9);
5090 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 0, 5);
5091 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 1, 5);
5092 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 2, 5);
5093 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 4, 5);
5094 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 5, 5);
5095 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 6, 5);
5096 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 0, 5);
5097 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 1, 1);
5098 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 2, 1);
5099 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 0, 5);
5100 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 1, 5);
5101 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 11, 0, 0);
5102 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
5103 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 1, 10);
5104 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 10, 10);
5105 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 19, 10);
5106 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 20, 10);
5107 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 21, 10);
5108 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
5109 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 1, 9);
5110 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 9, 9);
5111 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 18, 9);
5112 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 19, 9);
5113 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 20, 9);
5114 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
5115 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 1, 4);
5116 }
5117
5118 template <class S>
test48()5119 void test48()
5120 {
5121 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 5, 0);
5122 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 9, -4);
5123 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 10, -5);
5124 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 11, -5);
5125 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
5126 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 1, -9);
5127 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 2, -9);
5128 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
5129 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
5130 test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
5131 test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 0, 9);
5132 test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 1, 9);
5133 test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 1, 0, 0);
5134 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 0, 9);
5135 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 1, 10);
5136 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 2, 10);
5137 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 4, 10);
5138 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 5, 10);
5139 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 6, 10);
5140 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 0, 9);
5141 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 1, 9);
5142 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 2, 9);
5143 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 3, 9);
5144 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 4, 9);
5145 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 5, 9);
5146 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 0, 9);
5147 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 1, 8);
5148 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 2, 8);
5149 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 3, 8);
5150 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 4, 8);
5151 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 0, 9);
5152 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 1, 6);
5153 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 2, 6);
5154 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 0, 9);
5155 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 1, 9);
5156 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 6, 0, 0);
5157 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 0, 9);
5158 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 1, 10);
5159 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 5, 10);
5160 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 9, 10);
5161 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 10, 10);
5162 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 11, 10);
5163 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 0, 9);
5164 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 1, 9);
5165 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 4, 9);
5166 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 8, 9);
5167 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 9, 9);
5168 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 10, 9);
5169 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 0, 9);
5170 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 1, 5);
5171 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 2, 5);
5172 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 4, 5);
5173 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 5, 5);
5174 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 6, 5);
5175 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 0, 9);
5176 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 1, 1);
5177 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 2, 1);
5178 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 0, 9);
5179 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 1, 9);
5180 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 11, 0, 0);
5181 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
5182 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 1, 10);
5183 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 10, 10);
5184 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 19, 10);
5185 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 20, 10);
5186 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 21, 10);
5187 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
5188 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 1, 9);
5189 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 9, 9);
5190 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 18, 9);
5191 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 19, 9);
5192 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 20, 9);
5193 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
5194 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 1, 8);
5195 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 5, 4);
5196 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 9, 0);
5197 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 10, -1);
5198 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 11, -1);
5199 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
5200 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 1, -9);
5201 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 2, -9);
5202 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
5203 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
5204 test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
5205 test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 0, 10);
5206 test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 1, 10);
5207 test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 1, 0, 0);
5208 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 0, 10);
5209 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 1, 10);
5210 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 2, 10);
5211 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 4, 10);
5212 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 5, 10);
5213 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 6, 10);
5214 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 0, 10);
5215 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 1, 9);
5216 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 2, 9);
5217 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 3, 9);
5218 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 4, 9);
5219 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 5, 9);
5220 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 0, 10);
5221 }
5222
5223 template <class S>
test49()5224 void test49()
5225 {
5226 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 1, 8);
5227 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 2, 8);
5228 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 3, 8);
5229 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 4, 8);
5230 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 0, 10);
5231 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 1, 6);
5232 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 2, 6);
5233 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 0, 10);
5234 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 1, 10);
5235 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 6, 0, 0);
5236 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 0, 10);
5237 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 1, 10);
5238 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 5, 10);
5239 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 9, 10);
5240 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 10, 10);
5241 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 11, 10);
5242 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 0, 10);
5243 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 1, 9);
5244 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 4, 9);
5245 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 8, 9);
5246 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 9, 9);
5247 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 10, 9);
5248 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 0, 10);
5249 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 1, 5);
5250 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 2, 5);
5251 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 4, 5);
5252 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 5, 5);
5253 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 6, 5);
5254 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 0, 10);
5255 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 1, 1);
5256 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 2, 1);
5257 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 0, 10);
5258 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 1, 10);
5259 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 11, 0, 0);
5260 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
5261 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 1, 10);
5262 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 10, 10);
5263 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 19, 10);
5264 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 20, 10);
5265 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 21, 10);
5266 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
5267 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 1, 9);
5268 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 9, 9);
5269 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 18, 9);
5270 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 19, 9);
5271 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 20, 9);
5272 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
5273 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 1, 9);
5274 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 5, 5);
5275 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 9, 1);
5276 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 10, 0);
5277 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 11, 0);
5278 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
5279 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 1, -9);
5280 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 2, -9);
5281 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
5282 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
5283 test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
5284 test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 0, 10);
5285 test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 1, 10);
5286 test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 1, 0, 0);
5287 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 0, 10);
5288 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 1, 10);
5289 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 2, 10);
5290 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 4, 10);
5291 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 5, 10);
5292 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 6, 10);
5293 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 0, 10);
5294 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 1, 9);
5295 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 2, 9);
5296 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 3, 9);
5297 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 4, 9);
5298 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 5, 9);
5299 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 0, 10);
5300 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 1, 8);
5301 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 2, 8);
5302 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 3, 8);
5303 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 4, 8);
5304 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 0, 10);
5305 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 1, 6);
5306 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 2, 6);
5307 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 0, 10);
5308 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 1, 10);
5309 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 6, 0, 0);
5310 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 0, 10);
5311 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 1, 10);
5312 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 5, 10);
5313 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 9, 10);
5314 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 10, 10);
5315 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 11, 10);
5316 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 0, 10);
5317 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 1, 9);
5318 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 4, 9);
5319 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 8, 9);
5320 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 9, 9);
5321 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 10, 9);
5322 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 0, 10);
5323 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 1, 5);
5324 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 2, 5);
5325 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 4, 5);
5326 }
5327
5328 template <class S>
test50()5329 void test50()
5330 {
5331 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 5, 5);
5332 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 6, 5);
5333 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 0, 10);
5334 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 1, 1);
5335 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 2, 1);
5336 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 0, 10);
5337 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 1, 10);
5338 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 11, 0, 0);
5339 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 0, 10);
5340 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 1, 10);
5341 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 10, 10);
5342 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 19, 10);
5343 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 20, 10);
5344 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 21, 10);
5345 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 0, 10);
5346 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 1, 9);
5347 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 9, 9);
5348 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 18, 9);
5349 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 19, 9);
5350 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 20, 9);
5351 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 0, 10);
5352 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 1, 9);
5353 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 5, 5);
5354 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 9, 1);
5355 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 10, 0);
5356 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 11, 0);
5357 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 0, 10);
5358 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 1, -9);
5359 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 2, -9);
5360 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 0, 10);
5361 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 1, 10);
5362 test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 21, 0, 0);
5363 test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 0, 0);
5364 test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 1, 0);
5365 test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 1, 0, 0);
5366 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 0, 0);
5367 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 1, -1);
5368 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 2, -2);
5369 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 4, -4);
5370 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 5, -5);
5371 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 6, -5);
5372 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 0, 0);
5373 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 1, -1);
5374 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 2, -2);
5375 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 3, -3);
5376 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 4, -4);
5377 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 5, -4);
5378 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 0, 0);
5379 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 1, -1);
5380 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 2, -2);
5381 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 3, -3);
5382 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 4, -3);
5383 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 0, 0);
5384 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 1, -1);
5385 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 2, -1);
5386 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 0, 0);
5387 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 1, 0);
5388 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 6, 0, 0);
5389 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 0, 0);
5390 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 1, -1);
5391 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 5, -5);
5392 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 9, -9);
5393 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 10, -10);
5394 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 11, -10);
5395 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 0, 0);
5396 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 1, -1);
5397 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 4, -4);
5398 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 8, -8);
5399 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 9, -9);
5400 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 10, -9);
5401 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 0, 0);
5402 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 1, -1);
5403 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 2, -2);
5404 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 4, -4);
5405 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 5, -5);
5406 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 6, -5);
5407 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 0, 0);
5408 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 1, -1);
5409 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 2, -1);
5410 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 0, 0);
5411 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 1, 0);
5412 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 11, 0, 0);
5413 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5414 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
5415 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
5416 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
5417 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
5418 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
5419 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5420 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
5421 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
5422 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
5423 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
5424 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
5425 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5426 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
5427 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
5428 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
5429 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
5430 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
5431 }
5432
5433 template <class S>
test51()5434 void test51()
5435 {
5436 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5437 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
5438 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
5439 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5440 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5441 test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5442 test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 0, 1);
5443 test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 1, 1);
5444 test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 1, 0, 0);
5445 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 0, 1);
5446 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 1, 19);
5447 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 2, 19);
5448 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 4, 19);
5449 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 5, 19);
5450 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 6, 19);
5451 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 0, 1);
5452 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 1, 18);
5453 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 2, 18);
5454 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 3, 18);
5455 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 4, 18);
5456 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 5, 18);
5457 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 0, 1);
5458 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 1, 17);
5459 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 2, 17);
5460 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 3, 17);
5461 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 4, 17);
5462 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 0, 1);
5463 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 1, 15);
5464 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 2, 15);
5465 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 0, 1);
5466 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 1, 1);
5467 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 6, 0, 0);
5468 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 0, 1);
5469 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 1, 19);
5470 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 5, 19);
5471 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 9, 19);
5472 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 10, 19);
5473 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 11, 19);
5474 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 0, 1);
5475 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 1, 18);
5476 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 4, 18);
5477 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 8, 18);
5478 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 9, 18);
5479 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 10, 18);
5480 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 0, 1);
5481 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 1, 14);
5482 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 2, 14);
5483 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 4, 14);
5484 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 5, 14);
5485 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 6, 14);
5486 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 0, 1);
5487 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 1, 10);
5488 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 2, 10);
5489 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 0, 1);
5490 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 1, 1);
5491 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 11, 0, 0);
5492 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
5493 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 1, 19);
5494 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 10, 19);
5495 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 19, 19);
5496 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 20, 19);
5497 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 21, 19);
5498 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
5499 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 1, 18);
5500 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 9, 18);
5501 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 18, 18);
5502 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 19, 18);
5503 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 20, 18);
5504 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
5505 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 1, 9);
5506 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 5, 9);
5507 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 9, 9);
5508 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 10, 9);
5509 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 11, 9);
5510 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
5511 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 1, 0);
5512 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 2, 0);
5513 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
5514 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
5515 test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5516 test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 0, 1);
5517 test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 1, 1);
5518 test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 1, 0, 0);
5519 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 0, 1);
5520 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 1, 19);
5521 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 2, 19);
5522 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 4, 19);
5523 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 5, 19);
5524 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 6, 19);
5525 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 0, 1);
5526 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 1, 18);
5527 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 2, 18);
5528 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 3, 18);
5529 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 4, 18);
5530 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 5, 18);
5531 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 0, 1);
5532 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 1, 17);
5533 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 2, 17);
5534 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 3, 17);
5535 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 4, 17);
5536 }
5537
5538 template <class S>
test52()5539 void test52()
5540 {
5541 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 0, 1);
5542 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 1, 15);
5543 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 2, 15);
5544 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 0, 1);
5545 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 1, 1);
5546 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 6, 0, 0);
5547 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 0, 1);
5548 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 1, 19);
5549 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 5, 19);
5550 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 9, 19);
5551 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 10, 19);
5552 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 11, 19);
5553 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 0, 1);
5554 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 1, 18);
5555 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 4, 18);
5556 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 8, 18);
5557 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 9, 18);
5558 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 10, 18);
5559 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 0, 1);
5560 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 1, 14);
5561 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 2, 14);
5562 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 4, 14);
5563 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 5, 14);
5564 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 6, 14);
5565 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 0, 1);
5566 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 1, 10);
5567 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 2, 10);
5568 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 0, 1);
5569 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 1, 1);
5570 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 11, 0, 0);
5571 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
5572 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 1, 19);
5573 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 10, 19);
5574 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 19, 19);
5575 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 20, 19);
5576 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 21, 19);
5577 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
5578 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 1, 18);
5579 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 9, 18);
5580 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 18, 18);
5581 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 19, 18);
5582 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 20, 18);
5583 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
5584 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 1, 9);
5585 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 5, 9);
5586 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 9, 9);
5587 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 10, 9);
5588 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 11, 9);
5589 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
5590 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 1, 0);
5591 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 2, 0);
5592 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
5593 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
5594 test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
5595 test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 0, 0);
5596 test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 1, 0);
5597 test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 1, 0, 0);
5598 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 0, 0);
5599 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 1, -1);
5600 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 2, -2);
5601 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 4, -4);
5602 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 5, -5);
5603 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 6, -5);
5604 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 0, 0);
5605 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 1, -1);
5606 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 2, -2);
5607 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 3, -3);
5608 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 4, -4);
5609 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 5, -4);
5610 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 0, 0);
5611 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 1, -1);
5612 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 2, -2);
5613 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 3, -3);
5614 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 4, -3);
5615 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 0, 0);
5616 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 1, -1);
5617 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 2, -1);
5618 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 0, 0);
5619 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 1, 0);
5620 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 6, 0, 0);
5621 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 0, 0);
5622 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 1, -1);
5623 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 5, -5);
5624 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 9, -9);
5625 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 10, -10);
5626 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 11, -10);
5627 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 0, 0);
5628 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 1, -1);
5629 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 4, -4);
5630 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 8, -8);
5631 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 9, -9);
5632 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 10, -9);
5633 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 0, 0);
5634 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 1, -1);
5635 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 2, -2);
5636 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 4, -4);
5637 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 5, -5);
5638 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 6, -5);
5639 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 0, 0);
5640 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 1, -1);
5641 }
5642
5643 template <class S>
test53()5644 void test53()
5645 {
5646 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 2, -1);
5647 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 0, 0);
5648 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 1, 0);
5649 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 11, 0, 0);
5650 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5651 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
5652 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
5653 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
5654 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
5655 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
5656 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5657 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
5658 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
5659 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
5660 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
5661 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
5662 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5663 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
5664 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
5665 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
5666 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
5667 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
5668 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5669 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
5670 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
5671 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5672 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5673 test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5674 test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 0, 0);
5675 test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 1, 0);
5676 test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 1, 0, 0);
5677 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 0, 0);
5678 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 1, -1);
5679 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 2, -2);
5680 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 4, -4);
5681 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 5, -5);
5682 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 6, -5);
5683 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 0, 0);
5684 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 1, -1);
5685 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 2, -2);
5686 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 3, -3);
5687 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 4, -4);
5688 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 5, -4);
5689 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 0, 0);
5690 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 1, -1);
5691 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 2, -2);
5692 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 3, -3);
5693 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 4, -3);
5694 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 0, 0);
5695 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 1, -1);
5696 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 2, -1);
5697 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 0, 0);
5698 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 1, 0);
5699 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 6, 0, 0);
5700 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 0, 0);
5701 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 1, -1);
5702 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 5, -5);
5703 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 9, -9);
5704 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 10, -10);
5705 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 11, -10);
5706 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 0, 0);
5707 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 1, -1);
5708 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 4, -4);
5709 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 8, -8);
5710 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 9, -9);
5711 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 10, -9);
5712 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 0, 0);
5713 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 1, -1);
5714 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 2, -2);
5715 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 4, -4);
5716 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 5, -5);
5717 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 6, -5);
5718 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 0, 0);
5719 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 1, -1);
5720 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 2, -1);
5721 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 0, 0);
5722 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 1, 0);
5723 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 11, 0, 0);
5724 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
5725 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
5726 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
5727 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
5728 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
5729 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
5730 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
5731 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
5732 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
5733 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
5734 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
5735 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
5736 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
5737 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
5738 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
5739 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
5740 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
5741 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
5742 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
5743 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
5744 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
5745 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
5746 }
5747
5748 template <class S>
test54()5749 void test54()
5750 {
5751 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
5752 test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5753 test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 0, 0);
5754 test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 1, 0);
5755 test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 1, 0, 0);
5756 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 0, 0);
5757 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 1, 0);
5758 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 2, 0);
5759 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 4, 0);
5760 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 5, 0);
5761 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 6, 0);
5762 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 0, 0);
5763 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 1, 0);
5764 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 2, 0);
5765 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 3, 0);
5766 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 4, 0);
5767 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 5, 0);
5768 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 0, 0);
5769 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 1, 0);
5770 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 2, 0);
5771 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 3, 0);
5772 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 4, 0);
5773 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 0, 0);
5774 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 1, 0);
5775 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 2, 0);
5776 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 0, 0);
5777 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 1, 0);
5778 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 6, 0, 0);
5779 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 0, 0);
5780 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 1, 0);
5781 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 5, 0);
5782 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 9, 0);
5783 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 10, 0);
5784 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 11, 0);
5785 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 0, 0);
5786 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 1, 0);
5787 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 4, 0);
5788 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 8, 0);
5789 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 9, 0);
5790 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 10, 0);
5791 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 0, 0);
5792 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 1, 0);
5793 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 2, 0);
5794 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 4, 0);
5795 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 5, 0);
5796 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 6, 0);
5797 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 0, 0);
5798 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 1, 0);
5799 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 2, 0);
5800 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 0, 0);
5801 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 1, 0);
5802 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 11, 0, 0);
5803 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5804 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
5805 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
5806 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
5807 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
5808 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
5809 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5810 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
5811 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
5812 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
5813 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
5814 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
5815 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5816 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
5817 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
5818 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
5819 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
5820 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
5821 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5822 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
5823 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
5824 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5825 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5826 test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5827 }
5828
5829 template<class S>
test55()5830 void test55()
5831 {
5832 test_npos(S(""), 0, 0, S(""), 0, 0);
5833 test_npos(S(""), 0, 0, S("abcde"), 0, -5);
5834 test_npos(S("abcde"), 0, 0, S("abcdefghij"), 0, -10);
5835 test_npos(S("abcde"), 0, 0, S("abcdefghij"), 1, -9);
5836 test_npos(S("abcde"), 0, 0, S("abcdefghij"), 5, -5);
5837 }
5838
main(int,char **)5839 int main(int, char**)
5840 {
5841 {
5842 typedef std::string S;
5843 test0<S>();
5844 test1<S>();
5845 test2<S>();
5846 test3<S>();
5847 test4<S>();
5848 test5<S>();
5849 test6<S>();
5850 test7<S>();
5851 test8<S>();
5852 test9<S>();
5853 test10<S>();
5854 test11<S>();
5855 test12<S>();
5856 test13<S>();
5857 test14<S>();
5858 test15<S>();
5859 test16<S>();
5860 test17<S>();
5861 test18<S>();
5862 test19<S>();
5863 test20<S>();
5864 test21<S>();
5865 test22<S>();
5866 test23<S>();
5867 test24<S>();
5868 test25<S>();
5869 test26<S>();
5870 test27<S>();
5871 test28<S>();
5872 test29<S>();
5873 test30<S>();
5874 test31<S>();
5875 test32<S>();
5876 test33<S>();
5877 test34<S>();
5878 test35<S>();
5879 test36<S>();
5880 test37<S>();
5881 test38<S>();
5882 test39<S>();
5883 test40<S>();
5884 test41<S>();
5885 test42<S>();
5886 test43<S>();
5887 test44<S>();
5888 test45<S>();
5889 test46<S>();
5890 test47<S>();
5891 test48<S>();
5892 test49<S>();
5893 test50<S>();
5894 test51<S>();
5895 test52<S>();
5896 test53<S>();
5897 test54<S>();
5898 test55<S>();
5899 }
5900 #if TEST_STD_VER >= 11
5901 {
5902 typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
5903 test0<S>();
5904 test1<S>();
5905 test2<S>();
5906 test3<S>();
5907 test4<S>();
5908 test5<S>();
5909 test6<S>();
5910 test7<S>();
5911 test8<S>();
5912 test9<S>();
5913 test10<S>();
5914 test11<S>();
5915 test12<S>();
5916 test13<S>();
5917 test14<S>();
5918 test15<S>();
5919 test16<S>();
5920 test17<S>();
5921 test18<S>();
5922 test19<S>();
5923 test20<S>();
5924 test21<S>();
5925 test22<S>();
5926 test23<S>();
5927 test24<S>();
5928 test25<S>();
5929 test26<S>();
5930 test27<S>();
5931 test28<S>();
5932 test29<S>();
5933 test30<S>();
5934 test31<S>();
5935 test32<S>();
5936 test33<S>();
5937 test34<S>();
5938 test35<S>();
5939 test36<S>();
5940 test37<S>();
5941 test38<S>();
5942 test39<S>();
5943 test40<S>();
5944 test41<S>();
5945 test42<S>();
5946 test43<S>();
5947 test44<S>();
5948 test45<S>();
5949 test46<S>();
5950 test47<S>();
5951 test48<S>();
5952 test49<S>();
5953 test50<S>();
5954 test51<S>();
5955 test52<S>();
5956 test53<S>();
5957 test54<S>();
5958 test55<S>();
5959 }
5960 #endif
5961
5962 return 0;
5963 }
5964