• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 // Copyright (c) 2019-2020 Krystian Stasiowski (sdkrystian at gmail dot com)
4 //
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // Official repository: https://github.com/boostorg/static_string
9 //
10 
11 // Test that header file is self-contained.
12 #include <boost/static_string/static_string.hpp>
13 #include "constexpr_tests.hpp"
14 #include "compile_fail.hpp"
15 
16 #include <boost/core/lightweight_test.hpp>
17 #include <cstdlib>
18 #include <cwchar>
19 #include <sstream>
20 #include <string>
21 
22 namespace boost {
23 namespace static_strings {
24 
25 template class basic_static_string<420, char>;
26 
27 using string_view = basic_string_view<char, std::char_traits<char>>;
28 
29 template <class S>
30 bool
testS(const S & s,typename S::size_type pos,typename S::size_type n)31 testS(const S& s, typename S::size_type pos, typename S::size_type n)
32 {
33   if (pos <= s.size())
34   {
35     S str = s.substr(pos, n);
36     typename S::size_type rlen = (std::min)(n, s.size() - pos);
37     return (S::traits_type::compare(s.data() + pos, str.data(), rlen) == 0);
38   }
39   else
40   {
41     BOOST_TEST_THROWS((s.substr(pos, n)), std::out_of_range);
42     return true;
43   }
44 }
45 
46 template <class S>
47 bool
testSV(const S & s,typename S::size_type pos,typename S::size_type n)48 testSV(const S& s, typename S::size_type pos, typename S::size_type n)
49 {
50   if (pos <= s.size())
51   {
52     typename S::string_view_type str = s.subview(pos, n);
53     typename S::size_type rlen = (std::min)(n, s.size() - pos);
54     return (S::traits_type::compare(s.data() + pos, str.data(), rlen) == 0);
55   }
56   else
57   {
58     BOOST_TEST_THROWS((s.subview(pos, n)), std::out_of_range);
59     return true;
60   }
61 }
62 
63 template <class S>
64 bool
testAS(S s,const typename S::value_type * str,typename S::size_type n,S expected)65 testAS(S s, const typename S::value_type* str, typename S::size_type n, S expected)
66 {
67   s.assign(str, n);
68   return s == expected;
69 }
70 
71 template <class S>
72 bool
testI(S s,typename S::size_type pos,const typename S::value_type * str,typename S::size_type n,S expected)73 testI(S s, typename S::size_type pos, const typename S::value_type* str, typename S::size_type n, S expected)
74 {
75   const typename S::size_type old_size = s.size();
76   if (pos <= old_size)
77   {
78     s.insert(pos, str, n);
79     return s == expected;
80   }
81   else
82   {
83     BOOST_TEST_THROWS((s.insert(pos, str, n)), std::out_of_range);
84     return true;
85   }
86 }
87 
88 template <class S>
89 bool
testE(S s,typename S::size_type pos,typename S::size_type n,S expected)90 testE(S s, typename S::size_type pos, typename S::size_type n, S expected)
91 {
92   const typename S::size_type old_size = s.size();
93   if (pos <= old_size)
94   {
95     s.erase(pos, n);
96     return s[s.size()] == typename S::value_type() && s == expected;
97   }
98   else
99   {
100     BOOST_TEST_THROWS(s.erase(pos, n), std::out_of_range);
101     return true;
102   }
103 }
104 
105 template <class S>
106 bool
testA(S s,const typename S::value_type * str,typename S::size_type n,S expected)107 testA(S s, const typename S::value_type* str, typename S::size_type n, S expected)
108 {
109   return s.append(str, n) == expected;
110 }
111 
112 int
sign(int x)113 sign(int x)
114 {
115   if (x == 0)
116     return 0;
117   if (x < 0)
118     return -1;
119   return 1;
120 }
121 
122 template <class S>
123 bool
testC(const S & s,typename S::size_type pos,typename S::size_type n1,const typename S::value_type * str,typename S::size_type n2,int x)124 testC(const S& s, typename S::size_type pos, typename S::size_type n1, const typename S::value_type* str, typename S::size_type n2, int x)
125 {
126   if (pos <= s.size())
127     return sign(s.compare(pos, n1, str, n2)) == sign(x);
128   else
129   {
130     BOOST_TEST_THROWS(s.compare(pos, n1, str, n2), std::out_of_range);
131     return true;
132   }
133 }
134 
135 template <class S>
136 bool
testF(const S & s,const typename S::value_type * str,typename S::size_type pos,typename S::size_type n,typename S::size_type x)137 testF(const S& s, const typename S::value_type* str, typename S::size_type pos, typename S::size_type n, typename S::size_type x)
138 {
139   return s.find(str, pos, n) == x;
140 }
141 
142 template <class S>
143 bool
testRF(const S & s,const typename S::value_type * str,typename S::size_type pos,typename S::size_type n,typename S::size_type x)144 testRF(const S& s, const typename S::value_type* str, typename S::size_type pos, typename S::size_type n, typename S::size_type x)
145 {
146   return s.rfind(str, pos, n) == x;
147 }
148 
149 template <class S>
150 bool
testFF(const S & s,const typename S::value_type * str,typename S::size_type pos,typename S::size_type n,typename S::size_type x)151 testFF(const S& s, const typename S::value_type* str, typename S::size_type pos, typename S::size_type n, typename S::size_type x)
152 {
153   return s.find_first_of(str, pos, n) == x;
154 }
155 
156 template <class S>
157 bool
testFL(const S & s,const typename S::value_type * str,typename S::size_type pos,typename S::size_type n,typename S::size_type x)158 testFL(const S& s, const typename S::value_type* str, typename S::size_type pos, typename S::size_type n, typename S::size_type x)
159 {
160   return s.find_last_of(str, pos, n) == x;
161 }
162 
163 template <class S>
164 bool
testFFN(const S & s,const typename S::value_type * str,typename S::size_type pos,typename S::size_type n,typename S::size_type x)165 testFFN(const S& s, const typename S::value_type* str, typename S::size_type pos, typename S::size_type n, typename S::size_type x)
166 {
167   return s.find_first_not_of(str, pos, n) == x;
168 }
169 
170 template <class S>
171 bool
testFLN(const S & s,const typename S::value_type * str,typename S::size_type pos,typename S::size_type n,typename S::size_type x)172 testFLN(const S& s, const typename S::value_type* str, typename S::size_type pos, typename S::size_type n, typename S::size_type x)
173 {
174   return s.find_last_not_of(str, pos, n) == x;
175 }
176 
177 template <class S>
178 bool
testR(S s,typename S::size_type pos1,typename S::size_type n1,const typename S::value_type * str,S expected)179 testR(S s, typename S::size_type pos1, typename S::size_type n1, const typename S::value_type* str, S expected)
180 {
181   typename S::const_iterator first = s.begin() + pos1;
182   typename S::const_iterator last = s.begin() + pos1 + n1;
183   s.replace(first, last, str);
184   return s == expected;
185 }
186 
187 template <class S>
188 bool
testR(S s,typename S::size_type pos,typename S::size_type n1,typename S::size_type n2,typename S::value_type c,S expected)189 testR(S s, typename S::size_type pos, typename S::size_type n1, typename S::size_type n2, typename S::value_type c, S expected)
190 {
191   const typename S::size_type old_size = s.size();
192   if (pos <= old_size)
193   {
194     s.replace(pos, n1, n2, c);
195     return s == expected;
196   }
197   else
198   {
199     BOOST_TEST_THROWS((s.replace(pos, n1, n2, c)), std::out_of_range);
200     return true;
201   }
202 }
203 
204 template <class S>
205 bool
testR(S s,typename S::size_type pos,typename S::size_type n1,const typename S::value_type * str,typename S::size_type n2,S expected)206 testR(S s, typename S::size_type pos, typename S::size_type n1, const typename S::value_type* str, typename S::size_type n2, S expected)
207 {
208   const typename S::size_type old_size = s.size();
209   S s0 = s;
210   if (n1 > old_size)
211     s.size();
212   if (pos <= old_size)
213   {
214     if (pos + n1 > s0.size())
215       // this is a precondition violation for the const_iterator overload
216       return s.replace(pos, n1, str, n2) == expected;
217     else
218       return s.replace(pos, n1, str, n2) == expected &&
219         s0.replace(s0.begin() + pos, s0.begin() + pos + n1, str, str + n2) == expected;
220   }
221   else
222   {
223     BOOST_TEST_THROWS((s.replace(pos, n1, str, n2)), std::out_of_range);
224     return true;
225   }
226 }
227 
228 template<typename Arithmetic>
229 bool
testTS(Arithmetic value,const char * str_expected="",const wchar_t * wstr_expected=L"",bool test_expected=false)230 testTS(Arithmetic value, const char* str_expected = "", const wchar_t* wstr_expected = L"", bool test_expected = false)
231 {
232   const auto str = to_static_string(value);
233   const auto wstr = to_static_wstring(value);
234   if (std::is_floating_point<Arithmetic>::value)
235   {
236     const auto std_res = std::to_string(value);
237     const auto wstd_res = std::to_wstring(value);
238     return str == std_res.data() && wstr == wstd_res.data();
239   }
240   else
241   {
242     if (std::is_signed<Arithmetic>::value)
243     {
244       return Arithmetic(std::strtoll(str.begin(), nullptr, 10)) == value &&
245         Arithmetic(std::wcstoll(wstr.begin(), nullptr, 10)) == value &&
246         (test_expected ? str == str_expected && wstr == wstr_expected : true);
247     }
248     else
249     {
250       return Arithmetic(std::strtoull(str.begin(), nullptr, 10)) == value &&
251         Arithmetic(std::wcstoull(wstr.begin(), nullptr, 10)) == value &&
252         (test_expected ? str == str_expected && wstr == wstr_expected : true);
253     }
254   }
255 }
256 
257 // done
258 static
259 void
testConstruct()260 testConstruct()
261 {
262     {
263         static_string<1> s;
264         BOOST_TEST(s.empty());
265         BOOST_TEST(s.size() == 0);
266         BOOST_TEST(s == "");
267         BOOST_TEST(*s.end() == 0);
268     }
269     {
270         static_string<4> s1(3, 'x');
271         BOOST_TEST(! s1.empty());
272         BOOST_TEST(s1.size() == 3);
273         BOOST_TEST(s1 == "xxx");
274         BOOST_TEST(*s1.end() == 0);
275         BOOST_TEST_THROWS(
276             (static_string<2>(3, 'x')),
277             std::length_error);
278     }
279     {
280         static_string<5> s1("12345");
281         BOOST_TEST(*s1.end() == 0);
282         static_string<3> s2(s1, 2);
283         BOOST_TEST(s2 == "345");
284         BOOST_TEST(*s2.end() == 0);
285         static_string<0> s3(s1, 5);
286         BOOST_TEST(s3.empty());
287         BOOST_TEST(s3.front() == 0);
288         BOOST_TEST(*s3.end() == 0);
289     }
290     {
291         static_string<5> s1("12345");
292         static_string<2> s2(s1, 1, 2);
293         BOOST_TEST(s2 == "23");
294         BOOST_TEST(*s2.end() == 0);
295         static_string<0> s3(s1, 5, 1);
296         BOOST_TEST(s3.empty());
297         BOOST_TEST(s3.front() == 0);
298         BOOST_TEST(*s3.end() == 0);
299         BOOST_TEST_THROWS(
300             (static_string<5>(s1, 6)),
301             std::out_of_range);
302     }
303     {
304         static_string<5> s1("UVXYZ", 3);
305         BOOST_TEST(s1 == "UVX");
306         BOOST_TEST(*s1.end() == 0);
307         static_string<5> s2("X\0""Y\0""Z", 3);
308         BOOST_TEST(std::memcmp(
309             s2.data(), "X\0""Y", 3) == 0);
310         BOOST_TEST(*s2.end() == 0);
311     }
312     {
313         static_string<5> s1("12345");
314         static_string<3> s2(
315             s1.begin() + 1, s1.begin() + 3);
316         BOOST_TEST(s2 == "23");
317         BOOST_TEST(*s2.end() == 0);
318     }
319     {
320         static_string<5> s1("12345");
321         static_string<5> s2(s1);
322         BOOST_TEST(s2 == "12345");
323         BOOST_TEST(*s2.end() == 0);
324         static_string<6> s3(s1);
325         BOOST_TEST(s3 == "12345");
326         BOOST_TEST(*s3.end() == 0);
327         BOOST_TEST_THROWS(
328             (static_string<4>(s1)),
329             std::length_error);
330     }
331     {
332         static_string<3> s1({'1', '2', '3'});
333         BOOST_TEST(s1 == "123");
334         BOOST_TEST(*s1.end() == 0);
335         BOOST_TEST(
336             static_string<0>({}) == static_string<0>());
337         BOOST_TEST_THROWS(
338             (static_string<2>({'1', '2', '3'})),
339             std::length_error);
340     }
341     {
342         static_string<3> s1(
343             string_view("123"));
344         BOOST_TEST(s1 == "123");
345         BOOST_TEST(*s1.end() == 0);
346         BOOST_TEST_THROWS(
347             (static_string<2>(string_view("123"))),
348             std::length_error);
349     }
350     {
351         static_string<5> s1(
352             std::string("12345"), 2, 2);
353         BOOST_TEST(s1 == "34");
354         BOOST_TEST(*s1.end() == 0);
355         BOOST_TEST_THROWS(
356             (static_string<2>(std::string("12345"), 1, 3)),
357             std::length_error);
358     }
359     {
360       BOOST_TEST_THROWS(static_string<5>("12345678"), std::length_error);
361     }
362 }
363 
364 //done
365 static
366 void
testAssignment()367 testAssignment()
368 {
369     // assign(size_type count, CharT ch)
370     BOOST_TEST(static_string<3>{}.assign(1, '*') == "*");
371     BOOST_TEST(static_string<3>{}.assign(3, '*') == "***");
372     BOOST_TEST(static_string<3>{"abc"}.assign(3, '*') == "***");
373     BOOST_TEST_THROWS(static_string<1>{"a"}.assign(2, '*'), std::length_error);
374 
375     // assign(static_string const& s) noexcept
376     BOOST_TEST(static_string<3>{}.assign(static_string<3>{"abc"}) == "abc");
377     BOOST_TEST(static_string<3>{"*"}.assign(static_string<3>{"abc"}) == "abc");
378     BOOST_TEST(static_string<3>{"***"}.assign(static_string<3>{"abc"}) == "abc");
379 
380     // assign(static_string<M, CharT, Traits> const& s)
381     BOOST_TEST(static_string<3>{}.assign(static_string<5>{"abc"}) == "abc");
382     BOOST_TEST(static_string<3>{"*"}.assign(static_string<5>{"abc"}) == "abc");
383     BOOST_TEST(static_string<3>{"***"}.assign(static_string<5>{"abc"}) == "abc");
384     {
385       static_string<3> s("***");
386       BOOST_TEST(s.assign(s) == s);
387     }
388     BOOST_TEST_THROWS(static_string<3>{}.assign(static_string<5>{"abcde"}), std::length_error);
389 
390     // assign(static_string<M, CharT, Traits> const& s, size_type pos, size_type count = npos)
391     BOOST_TEST(static_string<4>{}.assign(static_string<5>{"abcde"}, 1) == "bcde");
392     BOOST_TEST(static_string<3>{}.assign(static_string<5>{"abcde"}, 1, 3) == "bcd");
393     BOOST_TEST(static_string<3>{"*"}.assign(static_string<5>{"abcde"}, 1, 3) == "bcd");
394     BOOST_TEST(static_string<3>{"***"}.assign(static_string<5>{"abcde"}, 1, 3) == "bcd");
395     BOOST_TEST_THROWS(static_string<3>{}.assign(static_string<5>{"abcde"}, 0), std::length_error);
396 
397     // assign(CharT const* s, size_type count)
398     BOOST_TEST(static_string<3>{}.assign("abc", 3) == "abc");
399     BOOST_TEST(static_string<3>{"*"}.assign("abc", 3) == "abc");
400     BOOST_TEST_THROWS(static_string<1>{}.assign("abc", 3), std::length_error);
401 
402     // assign(CharT const* s)
403     BOOST_TEST(static_string<3>{}.assign("abc") == "abc");
404     BOOST_TEST(static_string<3>{"*"}.assign("abc") == "abc");
405     BOOST_TEST_THROWS(static_string<1>{}.assign("abc"), std::length_error);
406 
407     // assign(InputIt first, InputIt last)
408     {
409         static_string<4> const cs{"abcd"};
410         static_string<4> s{"ad"};
411         BOOST_TEST(static_string<4>{}.assign(cs.begin(), cs.end()) == "abcd");
412         BOOST_TEST(static_string<4>{"*"}.assign(cs.begin(), cs.end()) == "abcd");
413         BOOST_TEST_THROWS(static_string<2>{"*"}.assign(cs.begin(), cs.end()), std::length_error);
414     }
415 
416     // assign(std::initializer_list<CharT> ilist)
417     BOOST_TEST(static_string<3>{}.assign({'a', 'b', 'c'}) == "abc");
418     BOOST_TEST(static_string<3>{"*"}.assign({'a', 'b', 'c'}) == "abc");
419     BOOST_TEST(static_string<3>{"***"}.assign({'a', 'b', 'c'}) == "abc");
420     BOOST_TEST_THROWS(static_string<1>{}.assign({'a', 'b', 'c'}), std::length_error);
421 
422     // assign(T const& t)
423     {
424         struct T
425         {
426             operator string_view() const noexcept
427             {
428                 return "abc";
429             }
430         };
431         BOOST_TEST(static_string<3>{}.assign(T{}) == "abc");
432         BOOST_TEST(static_string<3>{"*"}.assign(T{}) == "abc");
433         BOOST_TEST(static_string<3>{"***"}.assign(T{}) == "abc");
434         BOOST_TEST_THROWS(static_string<2>{"**"}.assign(T{}), std::length_error);
435     }
436 
437     // assign(T const& t, size_type pos, size_type count = npos)
438     {
439         struct T
440         {
441             operator string_view() const noexcept
442             {
443                 return "abcde";
444             }
445         };
446         BOOST_TEST(static_string<5>{}.assign(T{}, 0) == "abcde");
447         BOOST_TEST(static_string<5>{}.assign(T{}, 0, 5) == "abcde");
448         BOOST_TEST(static_string<5>{}.assign(T{}, 1, 3) == "bcd");
449         BOOST_TEST(static_string<5>{"*"}.assign(T{}, 1) == "bcde");
450         BOOST_TEST_THROWS(static_string<2>{"**"}.assign(T{}, 6, 3), std::out_of_range);
451         BOOST_TEST_THROWS(static_string<2>{"**"}.assign(T{}, 1, 3), std::length_error);
452     }
453 
454     //---
455 
456     {
457         static_string<3> s1("123");
458         static_string<3> s2;
459         s2 = s1;
460         BOOST_TEST(s2 == "123");
461         BOOST_TEST(*s2.end() == 0);
462     }
463     {
464         static_string<3> s1("123");
465         static_string<5> s2;
466         s2 = s1;
467         BOOST_TEST(s2 == "123");
468         BOOST_TEST(*s2.end() == 0);
469         static_string<1> s3;
470         BOOST_TEST_THROWS(
471             s3 = s1,
472             std::length_error);
473     }
474 
475     {
476         static_string<3> s1;
477         s1 = "123";
478         BOOST_TEST(s1 == "123");
479         BOOST_TEST(*s1.end() == 0);
480         static_string<1> s2;
481         BOOST_TEST_THROWS(
482             s2 = "123",
483             std::length_error);
484     }
485     {
486         static_string<1> s1;
487         s1 = 'x';
488         BOOST_TEST(s1 == "x");
489         BOOST_TEST(*s1.end() == 0);
490         static_string<0> s2;
491         BOOST_TEST_THROWS(
492             s2 = 'x',
493             std::length_error);
494     }
495     {
496         static_string<3> s1;
497         s1 = {'1', '2', '3'};
498         BOOST_TEST(s1 == "123");
499         BOOST_TEST(*s1.end() == 0);
500         static_string<1> s2;
501         BOOST_TEST_THROWS(
502             (s2 = {'1', '2', '3'}),
503             std::length_error);
504     }
505     {
506         static_string<3> s1;
507         s1 = string_view("123");
508         BOOST_TEST(s1 == "123");
509         BOOST_TEST(*s1.end() == 0);
510         static_string<1> s2;
511         BOOST_TEST_THROWS(
512             s2 = string_view("123"),
513             std::length_error);
514     }
515 
516     {
517         static_string<4> s1;
518         s1.assign(3, 'x');
519         BOOST_TEST(s1 == "xxx");
520         BOOST_TEST(*s1.end() == 0);
521         static_string<2> s2;
522         BOOST_TEST_THROWS(
523             s2.assign(3, 'x'),
524             std::length_error);
525     }
526     {
527         static_string<5> s1("12345");
528         BOOST_TEST(*s1.end() == 0);
529         static_string<5> s2;
530         s2.assign(s1);
531         BOOST_TEST(s2 == "12345");
532         BOOST_TEST(*s2.end() == 0);
533     }
534     {
535         static_string<5> s1("12345");
536         BOOST_TEST(*s1.end() == 0);
537         static_string<7> s2;
538         s2.assign(s1);
539         BOOST_TEST(s2 == "12345");
540         BOOST_TEST(*s2.end() == 0);
541         static_string<3> s3;
542         BOOST_TEST_THROWS(
543             s3.assign(s1),
544             std::length_error);
545     }
546     {
547         static_string<5> s1("12345");
548         static_string<5> s2;
549         s2.assign(s1, 1);
550         BOOST_TEST(s2 == "2345");
551         BOOST_TEST(*s2.end() == 0);
552         s2.assign(s1, 1, 2);
553         BOOST_TEST(s2 == "23");
554         BOOST_TEST(*s2.end() == 0);
555         s2.assign(s1, 1, 100);
556         BOOST_TEST(s2 == "2345");
557         BOOST_TEST(*s2.end() == 0);
558         BOOST_TEST_THROWS(
559             (s2.assign(s1, 6)),
560             std::out_of_range);
561         static_string<3> s3;
562         BOOST_TEST_THROWS(
563             s3.assign(s1, 1),
564             std::length_error);
565     }
566     {
567         static_string<5> s1;
568         s1.assign("12");
569         BOOST_TEST(s1 == "12");
570         BOOST_TEST(*s1.end() == 0);
571         s1.assign("12345");
572         BOOST_TEST(s1 == "12345");
573         BOOST_TEST(*s1.end() == 0);
574     }
575     {
576         static_string<5> s1;
577         s1.assign("12345", 3);
578         BOOST_TEST(s1 == "123");
579         BOOST_TEST(*s1.end() == 0);
580     }
581     {
582         static_string<5> s1("12345");
583         static_string<3> s2;
584         s2.assign(s1.begin(), s1.begin() + 2);
585         BOOST_TEST(s2 == "12");
586         BOOST_TEST(*s2.end() == 0);
587         BOOST_TEST_THROWS(
588             (s2.assign(s1.begin(), s1.end())),
589             std::length_error);
590     }
591     {
592         static_string<5> s1;
593         s1.assign({'1', '2', '3'});
594         BOOST_TEST(s1 == "123");
595         BOOST_TEST(*s1.end() == 0);
596         static_string<1> s2;
597         BOOST_TEST_THROWS(
598             (s2.assign({'1', '2', '3'})),
599             std::length_error);
600     }
601     {
602         static_string<5> s1;
603         s1.assign(string_view("123"));
604         BOOST_TEST(s1 == "123");
605         BOOST_TEST(*s1.end() == 0);
606         s1.assign(string_view("12345"));
607         BOOST_TEST(s1 == "12345");
608         BOOST_TEST(*s1.end() == 0);
609         BOOST_TEST_THROWS(
610             s1.assign(string_view("1234567")),
611             std::length_error);
612     }
613     {
614         static_string<5> s1;
615         s1.assign(std::string("12345"), 2, 2);
616         BOOST_TEST(s1 == "34");
617         BOOST_TEST(*s1.end() == 0);
618         s1.assign(std::string("12345"), 3);
619         BOOST_TEST(s1 == "45");
620         BOOST_TEST(*s1.end() == 0);
621         static_string<2> s2;
622         BOOST_TEST_THROWS(
623             (s2.assign(std::string("12345"), 1, 3)),
624             std::length_error);
625     }
626 
627     using S = static_string<400>;
628     BOOST_TEST(testAS(S(), "", 0, S()));
629     BOOST_TEST(testAS(S(), "12345", 3, S("123")));
630     BOOST_TEST(testAS(S(), "12345", 4, S("1234")));
631     BOOST_TEST(testAS(S(), "12345678901234567890", 0, S()));
632     BOOST_TEST(testAS(S(), "12345678901234567890", 1, S("1")));
633     BOOST_TEST(testAS(S(), "12345678901234567890", 3, S("123")));
634     BOOST_TEST(testAS(S(), "12345678901234567890", 20, S("12345678901234567890")));
635 
636     BOOST_TEST(testAS(S("12345"), "", 0, S()));
637     BOOST_TEST(testAS(S("12345"), "12345", 5, S("12345")));
638     BOOST_TEST(testAS(S("12345"), "1234567890", 10, S("1234567890")));
639 
640     BOOST_TEST(testAS(S("12345678901234567890"), "", 0, S()));
641     BOOST_TEST(testAS(S("12345678901234567890"), "12345", 5, S("12345")));
642     BOOST_TEST(testAS(S("12345678901234567890"), "12345678901234567890", 20,
643                S("12345678901234567890")));
644     BOOST_TEST(testAS(S(), "", 0, S()));
645     BOOST_TEST(testAS(S(), "12345", 3, S("123")));
646     BOOST_TEST(testAS(S(), "12345", 4, S("1234")));
647     BOOST_TEST(testAS(S(), "12345678901234567890", 0, S()));
648     BOOST_TEST(testAS(S(), "12345678901234567890", 1, S("1")));
649     BOOST_TEST(testAS(S(), "12345678901234567890", 3, S("123")));
650     BOOST_TEST(testAS(S(), "12345678901234567890", 20, S("12345678901234567890")));
651 
652     BOOST_TEST(testAS(S("12345"), "", 0, S()));
653     BOOST_TEST(testAS(S("12345"), "12345", 5, S("12345")));
654     BOOST_TEST(testAS(S("12345"), "1234567890", 10, S("1234567890")));
655 
656     BOOST_TEST(testAS(S("12345678901234567890"), "", 0, S()));
657     BOOST_TEST(testAS(S("12345678901234567890"), "12345", 5, S("12345")));
658     BOOST_TEST(testAS(S("12345678901234567890"), "12345678901234567890", 20,
659                S("12345678901234567890")));
660 
661     S s_short = "123/";
662     S s_long = "Lorem ipsum dolor sit amet, consectetur/";
663 
664     s_short.assign(s_short.data(), s_short.size());
665     BOOST_TEST(s_short == "123/");
666     s_short.assign(s_short.data() + 2, s_short.size() - 2);
667     BOOST_TEST(s_short == "3/");
668 
669     s_long.assign(s_long.data(), s_long.size());
670     BOOST_TEST(s_long == "Lorem ipsum dolor sit amet, consectetur/");
671 
672     s_long.assign(s_long.data() + 2, 8);
673     BOOST_TEST(s_long == "rem ipsu");
674 }
675 
676 // done
677 static
678 void
testElements()679 testElements()
680 {
681     using cfs3 = static_string<3> const;
682 
683     // at(size_type pos)
684     BOOST_TEST(static_string<3>{"abc"}.at(0) == 'a');
685     BOOST_TEST(static_string<3>{"abc"}.at(2) == 'c');
686     BOOST_TEST_THROWS(static_string<3>{""}.at(0), std::out_of_range);
687     BOOST_TEST_THROWS(static_string<3>{"abc"}.at(4), std::out_of_range);
688 
689     // at(size_type pos) const
690     BOOST_TEST(cfs3{"abc"}.at(0) == 'a');
691     BOOST_TEST(cfs3{"abc"}.at(2) == 'c');
692     BOOST_TEST_THROWS(cfs3{""}.at(0), std::out_of_range);
693     BOOST_TEST_THROWS(cfs3{"abc"}.at(4), std::out_of_range);
694 
695     // operator[](size_type pos)
696     BOOST_TEST(static_string<3>{"abc"}[0] == 'a');
697     BOOST_TEST(static_string<3>{"abc"}[2] == 'c');
698     BOOST_TEST(static_string<3>{"abc"}[3] == 0);
699     BOOST_TEST(static_string<3>{""}[0] == 0);
700 
701     // operator[](size_type pos) const
702     BOOST_TEST(cfs3{"abc"}[0] == 'a');
703     BOOST_TEST(cfs3{"abc"}[2] == 'c');
704     BOOST_TEST(cfs3{"abc"}[3] == 0);
705     BOOST_TEST(cfs3{""}[0] == 0);
706 
707     // front()
708     BOOST_TEST(static_string<3>{"a"}.front() == 'a');
709     BOOST_TEST(static_string<3>{"abc"}.front() == 'a');
710 
711     // front() const
712     BOOST_TEST(cfs3{"a"}.front() == 'a');
713     BOOST_TEST(cfs3{"abc"}.front() == 'a');
714 
715     // back()
716     BOOST_TEST(static_string<3>{"a"}.back() == 'a');
717     BOOST_TEST(static_string<3>{"abc"}.back() == 'c');
718 
719     // back() const
720     BOOST_TEST(cfs3{"a"}.back() == 'a');
721     BOOST_TEST(cfs3{"abc"}.back() == 'c');
722 
723     // data() noexcept
724     // data() const noexcept
725     // c_str() const noexcept
726     // operator string_view_type() const noexcept
727 
728     //---
729 
730     {
731         static_string<5> s("12345");
732         BOOST_TEST(s.at(1) == '2');
733         BOOST_TEST(s.at(4) == '5');
734         BOOST_TEST_THROWS(
735             s.at(5) = 0,
736             std::out_of_range);
737     }
738     {
739         static_string<5> const s("12345");
740         BOOST_TEST(s.at(1) == '2');
741         BOOST_TEST(s.at(4) == '5');
742         BOOST_TEST_THROWS(
743             s.at(5),
744             std::out_of_range);
745     }
746     {
747         static_string<5> s("12345");
748         BOOST_TEST(s[1] == '2');
749         BOOST_TEST(s[4] == '5');
750         s[1] = '_';
751         BOOST_TEST(s == "1_345");
752     }
753     {
754         static_string<5> const s("12345");
755         BOOST_TEST(s[1] == '2');
756         BOOST_TEST(s[4] == '5');
757         BOOST_TEST(s[5] == 0);
758     }
759     {
760         static_string<3> s("123");
761         BOOST_TEST(s.front() == '1');
762         BOOST_TEST(s.back() == '3');
763         s.front() = '_';
764         BOOST_TEST(s == "_23");
765         s.back() = '_';
766         BOOST_TEST(s == "_2_");
767     }
768     {
769         static_string<3> const s("123");
770         BOOST_TEST(s.front() == '1');
771         BOOST_TEST(s.back() == '3');
772     }
773     {
774         static_string<3> s("123");
775         BOOST_TEST(std::memcmp(
776             s.data(), "123", 3) == 0);
777     }
778     {
779         static_string<3> const s("123");
780         BOOST_TEST(std::memcmp(
781             s.data(), "123", 3) == 0);
782     }
783     {
784         static_string<3> s("123");
785         BOOST_TEST(std::memcmp(
786             s.c_str(), "123\0", 4) == 0);
787     }
788     {
789         static_string<3> s("123");
790         string_view sv = s;
791         BOOST_TEST(static_string<5>(sv) == "123");
792     }
793 }
794 
795 // done
796 static
797 void
testIterators()798 testIterators()
799 {
800     {
801         static_string<3> s;
802         BOOST_TEST(std::distance(s.begin(), s.end()) == 0);
803         BOOST_TEST(std::distance(s.rbegin(), s.rend()) == 0);
804         s = "123";
805         BOOST_TEST(std::distance(s.begin(), s.end()) == 3);
806         BOOST_TEST(std::distance(s.rbegin(), s.rend()) == 3);
807     }
808     {
809         static_string<3> const s("123");
810         BOOST_TEST(std::distance(s.begin(), s.end()) == 3);
811         BOOST_TEST(std::distance(s.cbegin(), s.cend()) == 3);
812         BOOST_TEST(std::distance(s.rbegin(), s.rend()) == 3);
813         BOOST_TEST(std::distance(s.crbegin(), s.crend()) == 3);
814     }
815 }
816 
817 // done
818 static
819 void
testCapacity()820 testCapacity()
821 {
822     // empty()
823     BOOST_TEST(static_string<0>{}.empty());
824     BOOST_TEST(static_string<1>{}.empty());
825     BOOST_TEST(! static_string<1>{"a"}.empty());
826     BOOST_TEST(! static_string<3>{"abc"}.empty());
827 
828     // size()
829     BOOST_TEST(static_string<0>{}.size() == 0);
830     BOOST_TEST(static_string<1>{}.size() == 0);
831     BOOST_TEST(static_string<1>{"a"}.size() == 1);
832     BOOST_TEST(static_string<3>{"abc"}.size() == 3);
833     BOOST_TEST(static_string<5>{"abc"}.size() == 3);
834 
835     // length()
836     BOOST_TEST(static_string<0>{}.length() == 0);
837     BOOST_TEST(static_string<1>{}.length() == 0);
838     BOOST_TEST(static_string<1>{"a"}.length() == 1);
839     BOOST_TEST(static_string<3>{"abc"}.length() == 3);
840     BOOST_TEST(static_string<5>{"abc"}.length() == 3);
841 
842     // max_size()
843     BOOST_TEST(static_string<0>{}.max_size() == 0);
844     BOOST_TEST(static_string<1>{}.max_size() == 1);
845     BOOST_TEST(static_string<1>{"a"}.max_size() == 1);
846     BOOST_TEST(static_string<3>{"abc"}.max_size() == 3);
847     BOOST_TEST(static_string<5>{"abc"}.max_size() == 5);
848 
849     // reserve(std::size_t n)
850     static_string<3>{}.reserve(0);
851     static_string<3>{}.reserve(1);
852     static_string<3>{}.reserve(3);
853     BOOST_TEST_THROWS(static_string<0>{}.reserve(1), std::length_error);
854     BOOST_TEST_THROWS(static_string<3>{}.reserve(4), std::length_error);
855 
856     // capacity()
857     BOOST_TEST(static_string<0>{}.capacity() == 0);
858     BOOST_TEST(static_string<1>{}.capacity() == 1);
859     BOOST_TEST(static_string<1>{"a"}.capacity() == 1);
860     BOOST_TEST(static_string<3>{"abc"}.capacity() == 3);
861     BOOST_TEST(static_string<5>{"abc"}.capacity() == 5);
862 
863     //---
864 
865     static_string<3> s;
866     BOOST_TEST(s.empty());
867     BOOST_TEST(s.size() == 0);
868     BOOST_TEST(s.length() == 0);
869     BOOST_TEST(s.max_size() == 3);
870     BOOST_TEST(s.capacity() == 3);
871     s = "123";
872     BOOST_TEST(! s.empty());
873     BOOST_TEST(s.size() == 3);
874     BOOST_TEST(s.length() == 3);
875     s.reserve(0);
876     s.reserve(3);
877     BOOST_TEST_THROWS(
878         s.reserve(4),
879         std::length_error);
880     s.shrink_to_fit();
881     BOOST_TEST(! s.empty());
882     BOOST_TEST(s.size() == 3);
883     BOOST_TEST(s.length() == 3);
884     BOOST_TEST(*s.end() == 0);
885 }
886 
887 // done
888 static
889 void
testClear()890 testClear()
891 {
892     // clear()
893     static_string<3> s("123");
894     s.clear();
895     BOOST_TEST(s.empty());
896     BOOST_TEST(*s.end() == 0);
897 }
898 
899 // done
900 static
901 void
testInsert()902 testInsert()
903 {
904     using sv = string_view;
905     using S = static_string<100>;
906 
907     // insert(size_type index, size_type count, CharT ch)
908     // The overload resolution is ambiguous
909     // here because 0 is also a pointer type
910     //BOOST_TEST(static_string<3>{"bc"}.insert(0, 1, 'a') == "abc");
911     BOOST_TEST(static_string<3>{"bc"}.insert(std::size_t(0), 1, 'a') == "abc");
912     BOOST_TEST(static_string<3>{"ac"}.insert(1, 1, 'b') == "abc");
913     BOOST_TEST(static_string<3>{"ab"}.insert(2, 1, 'c') == "abc");
914     BOOST_TEST_THROWS(static_string<4>{"abc"}.insert(4, 1, '*'), std::out_of_range);
915     BOOST_TEST_THROWS(static_string<3>{"abc"}.insert(1, 1, '*'), std::length_error);
916 
917     // insert(size_type index, CharT const* s)
918     BOOST_TEST(static_string<3>{"bc"}.insert(0, "a") == "abc");
919     BOOST_TEST_THROWS(static_string<4>{"abc"}.insert(4, "*"), std::out_of_range);
920     BOOST_TEST_THROWS(static_string<3>{"abc"}.insert(1, "*"), std::length_error);
921 
922     // insert(size_type index, CharT const* s, size_type count)
923     BOOST_TEST(static_string<4>{"ad"}.insert(1, "bcd", 2) == "abcd");
924     BOOST_TEST_THROWS(static_string<4>{"abc"}.insert(4, "*"), std::out_of_range);
925     BOOST_TEST_THROWS(static_string<3>{"abc"}.insert(1, "*"), std::length_error);
926 
927     // insert(size_type index, string_view_type sv)
928     BOOST_TEST(static_string<3>{"ac"}.insert(1, sv{"b"}) == "abc");
929     BOOST_TEST_THROWS(static_string<4>{"abc"}.insert(4, sv{"*"}), std::out_of_range);
930     BOOST_TEST_THROWS(static_string<3>{"abc"}.insert(1, sv{"*"}), std::length_error);
931 
932     // insert(size_type index, string_view_type sv, size_type index_str, size_type count = npos)
933     BOOST_TEST(static_string<4>{"ad"}.insert(1, sv{"abcd"}, 1, 2) == "abcd");
934     BOOST_TEST(static_string<4>{"ad"}.insert(1, sv{"abc"}, 1) == "abcd");
935     BOOST_TEST_THROWS((static_string<4>{"ad"}.insert(1, sv{"bc"}, 3, 0)), std::out_of_range);
936     BOOST_TEST_THROWS((static_string<3>{"ad"}.insert(1, sv{"bc"}, 0, 2)), std::length_error);
937 
938     // insert(const_iterator pos, CharT ch)
939     {
940         static_string<3> s{"ac"};
941         BOOST_TEST(s.insert(s.begin() + 1, 'b') == s.begin() + 1);
942         BOOST_TEST(s == "abc");
943         BOOST_TEST_THROWS(s.insert(s.begin() + 1, '*'), std::length_error);
944     }
945 
946     // insert(const_iterator pos, size_type count, CharT ch)
947     {
948         static_string<4> s{"ac"};
949         BOOST_TEST(s.insert(s.begin() + 1, 2, 'b') == s.begin() + 1);
950         BOOST_TEST(s == "abbc");
951         BOOST_TEST_THROWS(s.insert(s.begin() + 1, 2, '*'), std::length_error);
952     }
953 
954     // insert(const_iterator pos, InputIt first, InputIt last)
955     {
956         static_string<4> const cs{"abcd"};
957         static_string<4> s{"ad"};
958         BOOST_TEST(s.insert(s.begin() + 1, cs.begin() + 1, cs.begin() + 3) == s.begin() + 1);
959         BOOST_TEST(s == "abcd");
960     }
961 
962     // insert(const_iterator pos, std::initializer_list<CharT> ilist)
963     {
964         static_string<4> s{"ad"};
965         BOOST_TEST(s.insert(s.begin() + 1, {'b', 'c'}) == s.begin() + 1);
966         BOOST_TEST(s == "abcd");
967     }
968 
969     // insert(size_type, static_string) checked
970     {
971         static_string<10> s1 = "ad";
972         static_string<10> s2 = "bc";
973         BOOST_TEST(s1.insert(1, s2) == "abcd");
974     }
975 
976      // insert(size_type, static_string, size_type, size_type)
977     {
978         static_string<10> s1 = "ad";
979         static_string<10> s2 = "abcd";
980         BOOST_TEST(s1.insert(1, s2, 1, 2) == "abcd");
981     }
982 
983     // insert(size_type index, T const& t)
984     {
985         struct T
986         {
987             operator string_view() const noexcept
988             {
989                 return "b";
990             }
991         };
992         BOOST_TEST(static_string<3>{"ac"}.insert(1, T{}) == "abc");
993         BOOST_TEST_THROWS(static_string<4>{"abc"}.insert(4, T{}), std::out_of_range);
994         BOOST_TEST_THROWS(static_string<3>{"abc"}.insert(1, T{}), std::length_error);
995     }
996 
997     // insert(size_type index, T const& t, size_type index_str, size_type count = npos)
998     {
999         struct T
1000         {
1001             operator string_view() const noexcept
1002             {
1003                 return "abcd";
1004             }
1005         };
1006         BOOST_TEST(static_string<6>{"ae"}.insert(1, T{}, 1) == "abcde");
1007         BOOST_TEST(static_string<6>{"abe"}.insert(2, T{}, 2) == "abcde");
1008         BOOST_TEST(static_string<4>{"ac"}.insert(1, T{}, 1, 1) == "abc");
1009         BOOST_TEST(static_string<4>{"ad"}.insert(1, T{}, 1, 2) == "abcd");
1010         BOOST_TEST_THROWS(static_string<4>{"abc"}.insert(4, T{}), std::out_of_range);
1011         BOOST_TEST_THROWS(static_string<3>{"abc"}.insert(1, T{}), std::length_error);
1012     }
1013     // insert(const_iterator, InputIterator, InputIterator)
1014     {
1015       std::stringstream a("defghi");
1016       static_string<30> b = "abcjklmnop";
1017       b.insert(b.begin() + 3,
1018         std::istream_iterator<char>(a),
1019         std::istream_iterator<char>());
1020       BOOST_TEST(b == "abcdefghijklmnop");
1021     }
1022     //---
1023 
1024     {
1025         // Using 7 as the size causes a miscompile in MSVC14.2 x64 Release
1026         static_string<8> s1("12345");
1027         s1.insert(2, 2, '_');
1028         BOOST_TEST(s1 == "12__345");
1029         BOOST_TEST(*s1.end() == 0);
1030         static_string<6> s2("12345");
1031         BOOST_TEST_THROWS(
1032             (s2.insert(2, 2, '_')),
1033             std::length_error);
1034         static_string<6> s3("12345");
1035         BOOST_TEST_THROWS(
1036             (s3.insert(6, 2, '_')),
1037             std::out_of_range);
1038     }
1039     {
1040         static_string<7> s1("12345");
1041         s1.insert(2, "__");
1042         BOOST_TEST(s1 == "12__345");
1043         BOOST_TEST(*s1.end() == 0);
1044         static_string<6> s2("12345");
1045         BOOST_TEST_THROWS(
1046             (s2.insert(2, "__")),
1047             std::length_error);
1048         static_string<6> s3("12345");
1049         BOOST_TEST_THROWS(
1050             (s2.insert(6, "__")),
1051             std::out_of_range);
1052     }
1053     {
1054         static_string<7> s1("12345");
1055         s1.insert(2, "TUV", 2);
1056         BOOST_TEST(s1 == "12TU345");
1057         BOOST_TEST(*s1.end() == 0);
1058         static_string<6> s2("12345");
1059         BOOST_TEST_THROWS(
1060             (s2.insert(2, "TUV", 2)),
1061             std::length_error);
1062         static_string<6> s3("12345");
1063         BOOST_TEST_THROWS(
1064             (s3.insert(6, "TUV", 2)),
1065             std::out_of_range);
1066     }
1067     {
1068         static_string<7> s1("12345");
1069         s1.insert(2, static_string<3>("TU"));
1070         BOOST_TEST(s1 == "12TU345");
1071         BOOST_TEST(*s1.end() == 0);
1072         static_string<6> s2("12345");
1073         BOOST_TEST_THROWS(
1074             (s2.insert(2, static_string<3>("TUV"))),
1075             std::length_error);
1076         static_string<6> s3("12345");
1077         BOOST_TEST_THROWS(
1078             (s3.insert(6, static_string<3>("TUV"))),
1079             std::out_of_range);
1080     }
1081     {
1082         static_string<7> s1("12345");
1083         s1.insert(2, static_string<3>("TUV"), 1);
1084         BOOST_TEST(s1 == "12UV345");
1085         BOOST_TEST(*s1.end() == 0);
1086         s1 = "12345";
1087         s1.insert(2, static_string<3>("TUV"), 1, 1);
1088         BOOST_TEST(s1 == "12U345");
1089         BOOST_TEST(*s1.end() == 0);
1090         static_string<6> s2("12345");
1091         BOOST_TEST_THROWS(
1092             (s2.insert(2, static_string<3>("TUV"), 1, 2)),
1093             std::length_error);
1094         static_string<6> s3("12345");
1095         BOOST_TEST_THROWS(
1096             (s3.insert(6, static_string<3>("TUV"), 1, 2)),
1097             std::out_of_range);
1098     }
1099     {
1100         static_string<4> s1("123");
1101         s1.insert(s1.begin() + 1, '_');
1102         BOOST_TEST(s1 == "1_23");
1103         BOOST_TEST(*s1.end() == 0);
1104         static_string<3> s2("123");
1105         BOOST_TEST_THROWS(
1106             (s2.insert(s2.begin() + 1, '_')),
1107             std::length_error);
1108     }
1109     {
1110         static_string<4> s1("12");
1111         s1.insert(s1.begin() + 1, 2, '_');
1112         BOOST_TEST(s1 == "1__2");
1113         BOOST_TEST(*s1.end() == 0);
1114         static_string<4> s2("123");
1115         BOOST_TEST_THROWS(
1116             (s2.insert(s2.begin() + 1, 2, ' ')),
1117             std::length_error);
1118     }
1119     {
1120         static_string<3> s1("123");
1121         static_string<5> s2("UV");
1122         s2.insert(s2.begin() + 1, s1.begin(), s1.end());
1123         BOOST_TEST(s2 == "U123V");
1124         BOOST_TEST(*s2.end() == 0);
1125         static_string<4> s3("UV");
1126         BOOST_TEST_THROWS(
1127             (s3.insert(s3.begin() + 1, s1.begin(), s1.end())),
1128             std::length_error);
1129     }
1130     {
1131         static_string<5> s1("123");
1132         s1.insert(1, string_view("UV"));
1133         BOOST_TEST(s1 == "1UV23");
1134         BOOST_TEST(*s1.end() == 0);
1135         static_string<4> s2("123");
1136         BOOST_TEST_THROWS(
1137             (s2.insert(1, string_view("UV"))),
1138             std::length_error);
1139         static_string<5> s3("123");
1140         BOOST_TEST_THROWS(
1141             (s3.insert(5, string_view("UV"))),
1142             std::out_of_range);
1143     }
1144     {
1145         static_string<5> s1("123");
1146         s1.insert(1, std::string("UV"));
1147         BOOST_TEST(s1 == "1UV23");
1148         BOOST_TEST(*s1.end() == 0);
1149         BOOST_TEST_THROWS(
1150             (s1.insert(1, std::string("UV"))),
1151             std::length_error);
1152     }
1153     {
1154         static_string<6> s1("123");
1155         s1.insert(1, std::string("UVX"), 1);
1156         BOOST_TEST(s1 == "1VX23");
1157         BOOST_TEST(*s1.end() == 0);
1158         s1.insert(4, std::string("PQR"), 1, 1);
1159         BOOST_TEST(s1 == "1VX2Q3");
1160         BOOST_TEST(*s1.end() == 0);
1161         BOOST_TEST_THROWS(
1162             (s1.insert(4, std::string("PQR"), 1, 1)),
1163             std::length_error);
1164     }
1165     // test insert with source inside self
1166 
1167     {
1168       static_string<30> fs1 = "0123456789";
1169       BOOST_TEST(fs1.insert(0, fs1.data(), 4) == "01230123456789");
1170     }
1171     {
1172       static_string<30> fs1 = "0123456789";
1173       BOOST_TEST(fs1.insert(5, fs1.data(), 4) == "01234012356789");
1174     }
1175     {
1176       static_string<30> fs1 = "0123456789";
1177       BOOST_TEST(fs1.insert(5, fs1.data(), 10) == "01234012345678956789");
1178     }
1179     {
1180       static_string<30> fs1 = "0123456789";
1181       BOOST_TEST(fs1.insert(5, fs1.data() + 6, 3) == "0123467856789");
1182     }
1183 
1184     S s_short = "123/";
1185     S s_long = "Lorem ipsum dolor sit amet, consectetur/";
1186 
1187     BOOST_TEST(s_short.insert(0, s_short.data(), s_short.size()) == "123/123/");
1188     BOOST_TEST(s_short.insert(0, s_short.data(), s_short.size()) == "123/123/123/123/");
1189     BOOST_TEST(s_short.insert(0, s_short.data(), s_short.size()) == "123/123/123/123/123/123/123/123/");
1190     BOOST_TEST(s_long.insert(0, s_long.data(), s_long.size()) == "Lorem ipsum dolor sit amet, consectetur/Lorem ipsum dolor sit amet, consectetur/");
1191 
1192     BOOST_TEST(testI(S("abcde"), 6, "12345", 0, S("can't happen")));
1193     BOOST_TEST(testI(S("abcde"), 6, "12345", 1, S("can't happen")));
1194     BOOST_TEST(testI(S("abcde"), 6, "12345", 2, S("can't happen")));
1195     BOOST_TEST(testI(S("abcde"), 6, "12345", 4, S("can't happen")));
1196     BOOST_TEST(testI(S("abcde"), 6, "12345", 5, S("can't happen")));
1197     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 0, S("can't happen")));
1198     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 1, S("can't happen")));
1199     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 5, S("can't happen")));
1200     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 9, S("can't happen")));
1201     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 10, S("can't happen")));
1202     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 0, S("can't happen")));
1203     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 1, S("can't happen")));
1204     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 10, S("can't happen")));
1205     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 19, S("can't happen")));
1206     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 20, S("can't happen")));
1207     BOOST_TEST(testI(S("abcdefghij"), 0, "", 0, S("abcdefghij")));
1208     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 0, S("abcdefghij")));
1209     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 1, S("1abcdefghij")));
1210     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 2, S("12abcdefghij")));
1211     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 4, S("1234abcdefghij")));
1212     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 5, S("12345abcdefghij")));
1213     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 0, S("abcdefghij")));
1214     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 1, S("1abcdefghij")));
1215     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 5, S("12345abcdefghij")));
1216     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 9, S("123456789abcdefghij")));
1217     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 10, S("1234567890abcdefghij")));
1218     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 0, S("abcdefghij")));
1219     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 1, S("1abcdefghij")));
1220     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 10, S("1234567890abcdefghij")));
1221     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 19, S("1234567890123456789abcdefghij")));
1222     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 20, S("12345678901234567890abcdefghij")));
1223     BOOST_TEST(testI(S("abcdefghij"), 1, "", 0, S("abcdefghij")));
1224     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 0, S("abcdefghij")));
1225     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 1, S("a1bcdefghij")));
1226     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 2, S("a12bcdefghij")));
1227     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 4, S("a1234bcdefghij")));
1228     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 5, S("a12345bcdefghij")));
1229     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 0, S("abcdefghij")));
1230     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 1, S("a1bcdefghij")));
1231     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 5, S("a12345bcdefghij")));
1232     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 9, S("a123456789bcdefghij")));
1233     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 10, S("a1234567890bcdefghij")));
1234     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 0, S("abcdefghij")));
1235     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 1, S("a1bcdefghij")));
1236     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 10, S("a1234567890bcdefghij")));
1237     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 19, S("a1234567890123456789bcdefghij")));
1238     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 20, S("a12345678901234567890bcdefghij")));
1239     BOOST_TEST(testI(S("abcdefghij"), 5, "", 0, S("abcdefghij")));
1240     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 0, S("abcdefghij")));
1241     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 1, S("abcde1fghij")));
1242     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 2, S("abcde12fghij")));
1243     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 4, S("abcde1234fghij")));
1244     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 5, S("abcde12345fghij")));
1245     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 0, S("abcdefghij")));
1246     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 1, S("abcde1fghij")));
1247     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 5, S("abcde12345fghij")));
1248     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 9, S("abcde123456789fghij")));
1249     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 10, S("abcde1234567890fghij")));
1250     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 0, S("abcdefghij")));
1251     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 1, S("abcde1fghij")));
1252     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 10, S("abcde1234567890fghij")));
1253     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 19, S("abcde1234567890123456789fghij")));
1254     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 20, S("abcde12345678901234567890fghij")));
1255     BOOST_TEST(testI(S("abcdefghij"), 9, "", 0, S("abcdefghij")));
1256     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 0, S("abcdefghij")));
1257     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 1, S("abcdefghi1j")));
1258     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 2, S("abcdefghi12j")));
1259     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 4, S("abcdefghi1234j")));
1260     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 5, S("abcdefghi12345j")));
1261     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 0, S("abcdefghij")));
1262     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 1, S("abcdefghi1j")));
1263     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 5, S("abcdefghi12345j")));
1264     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 9, S("abcdefghi123456789j")));
1265     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 10, S("abcdefghi1234567890j")));
1266     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 0, S("abcdefghij")));
1267     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 1, S("abcdefghi1j")));
1268     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 10, S("abcdefghi1234567890j")));
1269     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 19, S("abcdefghi1234567890123456789j")));
1270     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 20, S("abcdefghi12345678901234567890j")));
1271     BOOST_TEST(testI(S("abcdefghij"), 10, "", 0, S("abcdefghij")));
1272     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 0, S("abcdefghij")));
1273     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 1, S("abcdefghij1")));
1274     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 2, S("abcdefghij12")));
1275     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 4, S("abcdefghij1234")));
1276     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 5, S("abcdefghij12345")));
1277     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 0, S("abcdefghij")));
1278     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 1, S("abcdefghij1")));
1279     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 5, S("abcdefghij12345")));
1280     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 9, S("abcdefghij123456789")));
1281     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 10, S("abcdefghij1234567890")));
1282     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 0, S("abcdefghij")));
1283     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 1, S("abcdefghij1")));
1284     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 10, S("abcdefghij1234567890")));
1285     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 19, S("abcdefghij1234567890123456789")));
1286     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 20, S("abcdefghij12345678901234567890")));
1287     BOOST_TEST(testI(S("abcdefghij"), 11, "", 0, S("can't happen")));
1288     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 0, S("can't happen")));
1289     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 1, S("can't happen")));
1290     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 2, S("can't happen")));
1291     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 4, S("can't happen")));
1292     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 5, S("can't happen")));
1293     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 0, S("can't happen")));
1294     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 1, S("can't happen")));
1295     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 5, S("can't happen")));
1296     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 9, S("can't happen")));
1297     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 10, S("can't happen")));
1298     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 0, S("can't happen")));
1299     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 1, S("can't happen")));
1300     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 10, S("can't happen")));
1301     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 19, S("can't happen")));
1302     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 20, S("can't happen")));
1303     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "", 0, S("abcdefghijklmnopqrst")));
1304     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 0, S("abcdefghijklmnopqrst")));
1305     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 1, S("1abcdefghijklmnopqrst")));
1306     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 2, S("12abcdefghijklmnopqrst")));
1307     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 4, S("1234abcdefghijklmnopqrst")));
1308     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 5, S("12345abcdefghijklmnopqrst")));
1309     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 0, S("abcdefghijklmnopqrst")));
1310     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 1, S("1abcdefghijklmnopqrst")));
1311     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 5, S("12345abcdefghijklmnopqrst")));
1312     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 9, S("123456789abcdefghijklmnopqrst")));
1313     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 10, S("1234567890abcdefghijklmnopqrst")));
1314     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1315     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 1, S("1abcdefghijklmnopqrst")));
1316     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 10, S("1234567890abcdefghijklmnopqrst")));
1317     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 19, S("1234567890123456789abcdefghijklmnopqrst")));
1318     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 20, S("12345678901234567890abcdefghijklmnopqrst")));
1319     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "", 0, S("abcdefghijklmnopqrst")));
1320     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 0, S("abcdefghijklmnopqrst")));
1321     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 1, S("a1bcdefghijklmnopqrst")));
1322     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 2, S("a12bcdefghijklmnopqrst")));
1323     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 4, S("a1234bcdefghijklmnopqrst")));
1324     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 5, S("a12345bcdefghijklmnopqrst")));
1325     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 0, S("abcdefghijklmnopqrst")));
1326     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 1, S("a1bcdefghijklmnopqrst")));
1327     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 5, S("a12345bcdefghijklmnopqrst")));
1328     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 9, S("a123456789bcdefghijklmnopqrst")));
1329     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 10, S("a1234567890bcdefghijklmnopqrst")));
1330     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1331     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 1, S("a1bcdefghijklmnopqrst")));
1332     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 10, S("a1234567890bcdefghijklmnopqrst")));
1333     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 19, S("a1234567890123456789bcdefghijklmnopqrst")));
1334     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 20, S("a12345678901234567890bcdefghijklmnopqrst")));
1335     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "", 0, S("abcdefghijklmnopqrst")));
1336     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 0, S("abcdefghijklmnopqrst")));
1337     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 1, S("abcdefghij1klmnopqrst")));
1338     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 2, S("abcdefghij12klmnopqrst")));
1339     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 4, S("abcdefghij1234klmnopqrst")));
1340     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 5, S("abcdefghij12345klmnopqrst")));
1341     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 0, S("abcdefghijklmnopqrst")));
1342     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 1, S("abcdefghij1klmnopqrst")));
1343     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 5, S("abcdefghij12345klmnopqrst")));
1344     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 9, S("abcdefghij123456789klmnopqrst")));
1345     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 10, S("abcdefghij1234567890klmnopqrst")));
1346     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1347     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 1, S("abcdefghij1klmnopqrst")));
1348     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 10, S("abcdefghij1234567890klmnopqrst")));
1349     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 19, S("abcdefghij1234567890123456789klmnopqrst")));
1350     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 20, S("abcdefghij12345678901234567890klmnopqrst")));
1351     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "", 0, S("abcdefghijklmnopqrst")));
1352     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 0, S("abcdefghijklmnopqrst")));
1353     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 1, S("abcdefghijklmnopqrs1t")));
1354     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 2, S("abcdefghijklmnopqrs12t")));
1355     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 4, S("abcdefghijklmnopqrs1234t")));
1356     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 5, S("abcdefghijklmnopqrs12345t")));
1357     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 0, S("abcdefghijklmnopqrst")));
1358     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 1, S("abcdefghijklmnopqrs1t")));
1359     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 5, S("abcdefghijklmnopqrs12345t")));
1360     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 9, S("abcdefghijklmnopqrs123456789t")));
1361     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 10, S("abcdefghijklmnopqrs1234567890t")));
1362     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1363     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 1, S("abcdefghijklmnopqrs1t")));
1364     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 10, S("abcdefghijklmnopqrs1234567890t")));
1365     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 19, S("abcdefghijklmnopqrs1234567890123456789t")));
1366     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 20, S("abcdefghijklmnopqrs12345678901234567890t")));
1367     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "", 0, S("abcdefghijklmnopqrst")));
1368     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 0, S("abcdefghijklmnopqrst")));
1369     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 1, S("abcdefghijklmnopqrst1")));
1370     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 2, S("abcdefghijklmnopqrst12")));
1371     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 4, S("abcdefghijklmnopqrst1234")));
1372     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 5, S("abcdefghijklmnopqrst12345")));
1373     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 0, S("abcdefghijklmnopqrst")));
1374     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 1, S("abcdefghijklmnopqrst1")));
1375     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 5, S("abcdefghijklmnopqrst12345")));
1376     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 9, S("abcdefghijklmnopqrst123456789")));
1377     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 10, S("abcdefghijklmnopqrst1234567890")));
1378     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1379     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 1, S("abcdefghijklmnopqrst1")));
1380     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 10, S("abcdefghijklmnopqrst1234567890")));
1381     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 19, S("abcdefghijklmnopqrst1234567890123456789")));
1382     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 20, S("abcdefghijklmnopqrst12345678901234567890")));
1383     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "", 0, S("can't happen")));
1384     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 0, S("can't happen")));
1385     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 1, S("can't happen")));
1386     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 2, S("can't happen")));
1387     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 4, S("can't happen")));
1388     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 5, S("can't happen")));
1389     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 0, S("can't happen")));
1390     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 1, S("can't happen")));
1391     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 5, S("can't happen")));
1392     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 9, S("can't happen")));
1393     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 10, S("can't happen")));
1394     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 0, S("can't happen")));
1395     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 1, S("can't happen")));
1396     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 10, S("can't happen")));
1397     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 19, S("can't happen")));
1398     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 20, S("can't happen")));
1399     BOOST_TEST(testI(S("abcde"), 6, "", 0, S("can't happen")));
1400     BOOST_TEST(testI(S("abcde"), 6, "12345", 0, S("can't happen")));
1401     BOOST_TEST(testI(S("abcde"), 6, "12345", 1, S("can't happen")));
1402     BOOST_TEST(testI(S("abcde"), 6, "12345", 2, S("can't happen")));
1403     BOOST_TEST(testI(S("abcde"), 6, "12345", 4, S("can't happen")));
1404     BOOST_TEST(testI(S("abcde"), 6, "12345", 5, S("can't happen")));
1405     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 0, S("can't happen")));
1406     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 1, S("can't happen")));
1407     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 5, S("can't happen")));
1408     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 9, S("can't happen")));
1409     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 10, S("can't happen")));
1410     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 0, S("can't happen")));
1411     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 1, S("can't happen")));
1412     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 10, S("can't happen")));
1413     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 19, S("can't happen")));
1414     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 20, S("can't happen")));
1415     BOOST_TEST(testI(S("abcdefghij"), 0, "", 0, S("abcdefghij")));
1416     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 0, S("abcdefghij")));
1417     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 1, S("1abcdefghij")));
1418     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 2, S("12abcdefghij")));
1419     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 4, S("1234abcdefghij")));
1420     BOOST_TEST(testI(S("abcdefghij"), 0, "12345", 5, S("12345abcdefghij")));
1421     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 0, S("abcdefghij")));
1422     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 1, S("1abcdefghij")));
1423     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 5, S("12345abcdefghij")));
1424     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 9, S("123456789abcdefghij")));
1425     BOOST_TEST(testI(S("abcdefghij"), 0, "1234567890", 10, S("1234567890abcdefghij")));
1426     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 0, S("abcdefghij")));
1427     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 1, S("1abcdefghij")));
1428     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 10, S("1234567890abcdefghij")));
1429     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 19, S("1234567890123456789abcdefghij")));
1430     BOOST_TEST(testI(S("abcdefghij"), 0, "12345678901234567890", 20, S("12345678901234567890abcdefghij")));
1431     BOOST_TEST(testI(S("abcdefghij"), 1, "", 0, S("abcdefghij")));
1432     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 0, S("abcdefghij")));
1433     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 1, S("a1bcdefghij")));
1434     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 2, S("a12bcdefghij")));
1435     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 4, S("a1234bcdefghij")));
1436     BOOST_TEST(testI(S("abcdefghij"), 1, "12345", 5, S("a12345bcdefghij")));
1437     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 0, S("abcdefghij")));
1438     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 1, S("a1bcdefghij")));
1439     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 5, S("a12345bcdefghij")));
1440     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 9, S("a123456789bcdefghij")));
1441     BOOST_TEST(testI(S("abcdefghij"), 1, "1234567890", 10, S("a1234567890bcdefghij")));
1442     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 0, S("abcdefghij")));
1443     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 1, S("a1bcdefghij")));
1444     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 10, S("a1234567890bcdefghij")));
1445     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 19, S("a1234567890123456789bcdefghij")));
1446     BOOST_TEST(testI(S("abcdefghij"), 1, "12345678901234567890", 20, S("a12345678901234567890bcdefghij")));
1447     BOOST_TEST(testI(S("abcdefghij"), 5, "", 0, S("abcdefghij")));
1448     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 0, S("abcdefghij")));
1449     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 1, S("abcde1fghij")));
1450     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 2, S("abcde12fghij")));
1451     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 4, S("abcde1234fghij")));
1452     BOOST_TEST(testI(S("abcdefghij"), 5, "12345", 5, S("abcde12345fghij")));
1453     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 0, S("abcdefghij")));
1454     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 1, S("abcde1fghij")));
1455     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 5, S("abcde12345fghij")));
1456     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 9, S("abcde123456789fghij")));
1457     BOOST_TEST(testI(S("abcdefghij"), 5, "1234567890", 10, S("abcde1234567890fghij")));
1458     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 0, S("abcdefghij")));
1459     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 1, S("abcde1fghij")));
1460     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 10, S("abcde1234567890fghij")));
1461     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 19, S("abcde1234567890123456789fghij")));
1462     BOOST_TEST(testI(S("abcdefghij"), 5, "12345678901234567890", 20, S("abcde12345678901234567890fghij")));
1463     BOOST_TEST(testI(S("abcdefghij"), 9, "", 0, S("abcdefghij")));
1464     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 0, S("abcdefghij")));
1465     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 1, S("abcdefghi1j")));
1466     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 2, S("abcdefghi12j")));
1467     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 4, S("abcdefghi1234j")));
1468     BOOST_TEST(testI(S("abcdefghij"), 9, "12345", 5, S("abcdefghi12345j")));
1469     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 0, S("abcdefghij")));
1470     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 1, S("abcdefghi1j")));
1471     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 5, S("abcdefghi12345j")));
1472     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 9, S("abcdefghi123456789j")));
1473     BOOST_TEST(testI(S("abcdefghij"), 9, "1234567890", 10, S("abcdefghi1234567890j")));
1474     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 0, S("abcdefghij")));
1475     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 1, S("abcdefghi1j")));
1476     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 10, S("abcdefghi1234567890j")));
1477     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 19, S("abcdefghi1234567890123456789j")));
1478     BOOST_TEST(testI(S("abcdefghij"), 9, "12345678901234567890", 20, S("abcdefghi12345678901234567890j")));
1479     BOOST_TEST(testI(S("abcdefghij"), 10, "", 0, S("abcdefghij")));
1480     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 0, S("abcdefghij")));
1481     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 1, S("abcdefghij1")));
1482     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 2, S("abcdefghij12")));
1483     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 4, S("abcdefghij1234")));
1484     BOOST_TEST(testI(S("abcdefghij"), 10, "12345", 5, S("abcdefghij12345")));
1485     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 0, S("abcdefghij")));
1486     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 1, S("abcdefghij1")));
1487     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 5, S("abcdefghij12345")));
1488     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 9, S("abcdefghij123456789")));
1489     BOOST_TEST(testI(S("abcdefghij"), 10, "1234567890", 10, S("abcdefghij1234567890")));
1490     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 0, S("abcdefghij")));
1491     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 1, S("abcdefghij1")));
1492     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 10, S("abcdefghij1234567890")));
1493     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 19, S("abcdefghij1234567890123456789")));
1494     BOOST_TEST(testI(S("abcdefghij"), 10, "12345678901234567890", 20, S("abcdefghij12345678901234567890")));
1495     BOOST_TEST(testI(S("abcdefghij"), 11, "", 0, S("can't happen")));
1496     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 0, S("can't happen")));
1497     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 1, S("can't happen")));
1498     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 2, S("can't happen")));
1499     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 4, S("can't happen")));
1500     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 5, S("can't happen")));
1501     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 0, S("can't happen")));
1502     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 1, S("can't happen")));
1503     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 5, S("can't happen")));
1504     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 9, S("can't happen")));
1505     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 10, S("can't happen")));
1506     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 0, S("can't happen")));
1507     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 1, S("can't happen")));
1508     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 10, S("can't happen")));
1509     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 19, S("can't happen")));
1510     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 20, S("can't happen")));
1511     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "", 0, S("abcdefghijklmnopqrst")));
1512     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 0, S("abcdefghijklmnopqrst")));
1513     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 1, S("1abcdefghijklmnopqrst")));
1514     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 2, S("12abcdefghijklmnopqrst")));
1515     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 4, S("1234abcdefghijklmnopqrst")));
1516     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345", 5, S("12345abcdefghijklmnopqrst")));
1517     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 0, S("abcdefghijklmnopqrst")));
1518     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 1, S("1abcdefghijklmnopqrst")));
1519     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 5, S("12345abcdefghijklmnopqrst")));
1520     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 9, S("123456789abcdefghijklmnopqrst")));
1521     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "1234567890", 10, S("1234567890abcdefghijklmnopqrst")));
1522     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1523     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 1, S("1abcdefghijklmnopqrst")));
1524     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 10, S("1234567890abcdefghijklmnopqrst")));
1525     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 19, S("1234567890123456789abcdefghijklmnopqrst")));
1526     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 0, "12345678901234567890", 20, S("12345678901234567890abcdefghijklmnopqrst")));
1527     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "", 0, S("abcdefghijklmnopqrst")));
1528     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 0, S("abcdefghijklmnopqrst")));
1529     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 1, S("a1bcdefghijklmnopqrst")));
1530     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 2, S("a12bcdefghijklmnopqrst")));
1531     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 4, S("a1234bcdefghijklmnopqrst")));
1532     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345", 5, S("a12345bcdefghijklmnopqrst")));
1533     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 0, S("abcdefghijklmnopqrst")));
1534     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 1, S("a1bcdefghijklmnopqrst")));
1535     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 5, S("a12345bcdefghijklmnopqrst")));
1536     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 9, S("a123456789bcdefghijklmnopqrst")));
1537     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "1234567890", 10, S("a1234567890bcdefghijklmnopqrst")));
1538     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1539     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 1, S("a1bcdefghijklmnopqrst")));
1540     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 10, S("a1234567890bcdefghijklmnopqrst")));
1541     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 19, S("a1234567890123456789bcdefghijklmnopqrst")));
1542     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 1, "12345678901234567890", 20, S("a12345678901234567890bcdefghijklmnopqrst")));
1543     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "", 0, S("abcdefghijklmnopqrst")));
1544     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 0, S("abcdefghijklmnopqrst")));
1545     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 1, S("abcdefghij1klmnopqrst")));
1546     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 2, S("abcdefghij12klmnopqrst")));
1547     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 4, S("abcdefghij1234klmnopqrst")));
1548     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345", 5, S("abcdefghij12345klmnopqrst")));
1549     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 0, S("abcdefghijklmnopqrst")));
1550     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 1, S("abcdefghij1klmnopqrst")));
1551     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 5, S("abcdefghij12345klmnopqrst")));
1552     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 9, S("abcdefghij123456789klmnopqrst")));
1553     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "1234567890", 10, S("abcdefghij1234567890klmnopqrst")));
1554     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1555     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 1, S("abcdefghij1klmnopqrst")));
1556     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 10, S("abcdefghij1234567890klmnopqrst")));
1557     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 19, S("abcdefghij1234567890123456789klmnopqrst")));
1558     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 10, "12345678901234567890", 20, S("abcdefghij12345678901234567890klmnopqrst")));
1559     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "", 0, S("abcdefghijklmnopqrst")));
1560     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 0, S("abcdefghijklmnopqrst")));
1561     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 1, S("abcdefghijklmnopqrs1t")));
1562     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 2, S("abcdefghijklmnopqrs12t")));
1563     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 4, S("abcdefghijklmnopqrs1234t")));
1564     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345", 5, S("abcdefghijklmnopqrs12345t")));
1565     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 0, S("abcdefghijklmnopqrst")));
1566     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 1, S("abcdefghijklmnopqrs1t")));
1567     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 5, S("abcdefghijklmnopqrs12345t")));
1568     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 9, S("abcdefghijklmnopqrs123456789t")));
1569     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "1234567890", 10, S("abcdefghijklmnopqrs1234567890t")));
1570     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1571     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 1, S("abcdefghijklmnopqrs1t")));
1572     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 10, S("abcdefghijklmnopqrs1234567890t")));
1573     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 19, S("abcdefghijklmnopqrs1234567890123456789t")));
1574     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 19, "12345678901234567890", 20, S("abcdefghijklmnopqrs12345678901234567890t")));
1575     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "", 0, S("abcdefghijklmnopqrst")));
1576     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 0, S("abcdefghijklmnopqrst")));
1577     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 1, S("abcdefghijklmnopqrst1")));
1578     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 2, S("abcdefghijklmnopqrst12")));
1579     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 4, S("abcdefghijklmnopqrst1234")));
1580     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345", 5, S("abcdefghijklmnopqrst12345")));
1581     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 0, S("abcdefghijklmnopqrst")));
1582     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 1, S("abcdefghijklmnopqrst1")));
1583     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 5, S("abcdefghijklmnopqrst12345")));
1584     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 9, S("abcdefghijklmnopqrst123456789")));
1585     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "1234567890", 10, S("abcdefghijklmnopqrst1234567890")));
1586     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
1587     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 1, S("abcdefghijklmnopqrst1")));
1588     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 10, S("abcdefghijklmnopqrst1234567890")));
1589     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 19, S("abcdefghijklmnopqrst1234567890123456789")));
1590     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 20, "12345678901234567890", 20, S("abcdefghijklmnopqrst12345678901234567890")));
1591     BOOST_TEST(testI(S("abcde"), 6, "", 0, S("can't happen")));
1592     BOOST_TEST(testI(S("abcde"), 6, "12345", 0, S("can't happen")));
1593     BOOST_TEST(testI(S("abcde"), 6, "12345", 1, S("can't happen")));
1594     BOOST_TEST(testI(S("abcde"), 6, "12345", 2, S("can't happen")));
1595     BOOST_TEST(testI(S("abcde"), 6, "12345", 4, S("can't happen")));
1596     BOOST_TEST(testI(S("abcde"), 6, "12345", 5, S("can't happen")));
1597     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 0, S("can't happen")));
1598     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 1, S("can't happen")));
1599     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 5, S("can't happen")));
1600     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 9, S("can't happen")));
1601     BOOST_TEST(testI(S("abcde"), 6, "1234567890", 10, S("can't happen")));
1602     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 0, S("can't happen")));
1603     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 1, S("can't happen")));
1604     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 10, S("can't happen")));
1605     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 19, S("can't happen")));
1606     BOOST_TEST(testI(S("abcde"), 6, "12345678901234567890", 20, S("can't happen")));
1607     BOOST_TEST(testI(S("abcdefghij"), 11, "", 0, S("can't happen")));
1608     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 0, S("can't happen")));
1609     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 1, S("can't happen")));
1610     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 2, S("can't happen")));
1611     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 4, S("can't happen")));
1612     BOOST_TEST(testI(S("abcdefghij"), 11, "12345", 5, S("can't happen")));
1613     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 0, S("can't happen")));
1614     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 1, S("can't happen")));
1615     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 5, S("can't happen")));
1616     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 9, S("can't happen")));
1617     BOOST_TEST(testI(S("abcdefghij"), 11, "1234567890", 10, S("can't happen")));
1618     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 0, S("can't happen")));
1619     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 1, S("can't happen")));
1620     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 10, S("can't happen")));
1621     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 19, S("can't happen")));
1622     BOOST_TEST(testI(S("abcdefghij"), 11, "12345678901234567890", 20, S("can't happen")));
1623     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "", 0, S("can't happen")));
1624     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 0, S("can't happen")));
1625     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 1, S("can't happen")));
1626     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 2, S("can't happen")));
1627     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 4, S("can't happen")));
1628     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345", 5, S("can't happen")));
1629     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 0, S("can't happen")));
1630     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 1, S("can't happen")));
1631     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 5, S("can't happen")));
1632     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 9, S("can't happen")));
1633     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "1234567890", 10, S("can't happen")));
1634     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 0, S("can't happen")));
1635     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 1, S("can't happen")));
1636     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 10, S("can't happen")));
1637     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 19, S("can't happen")));
1638     BOOST_TEST(testI(S("abcdefghijklmnopqrst"), 21, "12345678901234567890", 20, S("can't happen")));
1639 }
1640 
1641 // done
1642 static
1643 void
testErase()1644 testErase()
1645 {
1646     // erase(size_type index = 0, size_type count = npos)
1647     BOOST_TEST(static_string<3>{"abc"}.erase() == "");
1648     BOOST_TEST(static_string<3>{"abc"}.erase(1) == "a");
1649     BOOST_TEST(static_string<3>{"abc"}.erase(2) == "ab");
1650     BOOST_TEST(static_string<3>{"abc"}.erase(1, 1) == "ac");
1651     BOOST_TEST(static_string<3>{"abc"}.erase(0, 2) == "c");
1652     BOOST_TEST(static_string<3>{"abc"}.erase(3, 0) == "abc");
1653     BOOST_TEST(static_string<3>{"abc"}.erase(3, 4) == "abc");
1654     BOOST_TEST_THROWS(static_string<3>{"abc"}.erase(4, 0), std::out_of_range);
1655 
1656     // erase(const_iterator pos)
1657     {
1658         static_string<3> s{"abc"};
1659         BOOST_TEST(s.erase(s.begin() + 1) == s.begin() + 1);
1660         BOOST_TEST(s == "ac");
1661     }
1662 
1663     // erase(const_iterator first, const_iterator last)
1664     {
1665         static_string<4> s{"abcd"};
1666         BOOST_TEST(s.erase(s.begin() + 1, s.begin() + 3) == s.begin() + 1);
1667         BOOST_TEST(s == "ad");
1668     }
1669 
1670     //---
1671 
1672     {
1673         static_string<9> s1("123456789");
1674         BOOST_TEST(s1.erase(1, 1) == "13456789");
1675         BOOST_TEST(s1 == "13456789");
1676         BOOST_TEST(*s1.end() == 0);
1677         BOOST_TEST(s1.erase(5) == "13456");
1678         BOOST_TEST(s1 == "13456");
1679         BOOST_TEST(*s1.end() == 0);
1680         BOOST_TEST_THROWS(
1681             s1.erase(7),
1682             std::out_of_range);
1683     }
1684     {
1685         static_string<9> s1("123456789");
1686         BOOST_TEST(*s1.erase(s1.begin() + 5) == '7');
1687         BOOST_TEST(s1 == "12345789");
1688         BOOST_TEST(*s1.end() == 0);
1689     }
1690     {
1691         static_string<9> s1("123456789");
1692         BOOST_TEST(*s1.erase(
1693             s1.begin() + 5, s1.begin() + 7) == '8');
1694         BOOST_TEST(s1 == "1234589");
1695         BOOST_TEST(*s1.end() == 0);
1696     }
1697 
1698     using S = static_string<400>;
1699 
1700     BOOST_TEST(testE(S(""), 0, 0, S("")));
1701     BOOST_TEST(testE(S(""), 0, 1, S("")));
1702     BOOST_TEST(testE(S(""), 1, 0, S("can't happen")));
1703     BOOST_TEST(testE(S("abcde"), 0, 0, S("abcde")));
1704     BOOST_TEST(testE(S("abcde"), 0, 1, S("bcde")));
1705     BOOST_TEST(testE(S("abcde"), 0, 2, S("cde")));
1706     BOOST_TEST(testE(S("abcde"), 0, 4, S("e")));
1707     BOOST_TEST(testE(S("abcde"), 0, 5, S("")));
1708     BOOST_TEST(testE(S("abcde"), 0, 6, S("")));
1709     BOOST_TEST(testE(S("abcde"), 1, 0, S("abcde")));
1710     BOOST_TEST(testE(S("abcde"), 1, 1, S("acde")));
1711     BOOST_TEST(testE(S("abcde"), 1, 2, S("ade")));
1712     BOOST_TEST(testE(S("abcde"), 1, 3, S("ae")));
1713     BOOST_TEST(testE(S("abcde"), 1, 4, S("a")));
1714     BOOST_TEST(testE(S("abcde"), 1, 5, S("a")));
1715     BOOST_TEST(testE(S("abcde"), 2, 0, S("abcde")));
1716     BOOST_TEST(testE(S("abcde"), 2, 1, S("abde")));
1717     BOOST_TEST(testE(S("abcde"), 2, 2, S("abe")));
1718     BOOST_TEST(testE(S("abcde"), 2, 3, S("ab")));
1719     BOOST_TEST(testE(S("abcde"), 2, 4, S("ab")));
1720     BOOST_TEST(testE(S("abcde"), 4, 0, S("abcde")));
1721     BOOST_TEST(testE(S("abcde"), 4, 1, S("abcd")));
1722     BOOST_TEST(testE(S("abcde"), 4, 2, S("abcd")));
1723     BOOST_TEST(testE(S("abcde"), 5, 0, S("abcde")));
1724     BOOST_TEST(testE(S("abcde"), 5, 1, S("abcde")));
1725     BOOST_TEST(testE(S("abcde"), 6, 0, S("can't happen")));
1726     BOOST_TEST(testE(S("abcdefghij"), 0, 0, S("abcdefghij")));
1727     BOOST_TEST(testE(S("abcdefghij"), 0, 1, S("bcdefghij")));
1728     BOOST_TEST(testE(S("abcdefghij"), 0, 5, S("fghij")));
1729     BOOST_TEST(testE(S("abcdefghij"), 0, 9, S("j")));
1730     BOOST_TEST(testE(S("abcdefghij"), 0, 10, S("")));
1731     BOOST_TEST(testE(S("abcdefghij"), 0, 11, S("")));
1732     BOOST_TEST(testE(S("abcdefghij"), 1, 0, S("abcdefghij")));
1733     BOOST_TEST(testE(S("abcdefghij"), 1, 1, S("acdefghij")));
1734     BOOST_TEST(testE(S("abcdefghij"), 1, 4, S("afghij")));
1735     BOOST_TEST(testE(S("abcdefghij"), 1, 8, S("aj")));
1736     BOOST_TEST(testE(S("abcdefghij"), 1, 9, S("a")));
1737     BOOST_TEST(testE(S("abcdefghij"), 1, 10, S("a")));
1738     BOOST_TEST(testE(S("abcdefghij"), 5, 0, S("abcdefghij")));
1739     BOOST_TEST(testE(S("abcdefghij"), 5, 1, S("abcdeghij")));
1740     BOOST_TEST(testE(S("abcdefghij"), 5, 2, S("abcdehij")));
1741     BOOST_TEST(testE(S("abcdefghij"), 5, 4, S("abcdej")));
1742     BOOST_TEST(testE(S("abcdefghij"), 5, 5, S("abcde")));
1743     BOOST_TEST(testE(S("abcdefghij"), 5, 6, S("abcde")));
1744     BOOST_TEST(testE(S("abcdefghij"), 9, 0, S("abcdefghij")));
1745     BOOST_TEST(testE(S("abcdefghij"), 9, 1, S("abcdefghi")));
1746     BOOST_TEST(testE(S("abcdefghij"), 9, 2, S("abcdefghi")));
1747     BOOST_TEST(testE(S("abcdefghij"), 10, 0, S("abcdefghij")));
1748     BOOST_TEST(testE(S("abcdefghij"), 10, 1, S("abcdefghij")));
1749     BOOST_TEST(testE(S("abcdefghij"), 11, 0, S("can't happen")));
1750     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst")));
1751     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 1, S("bcdefghijklmnopqrst")));
1752     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 10, S("klmnopqrst")));
1753     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 19, S("t")));
1754     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 20, S("")));
1755     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 21, S("")));
1756     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst")));
1757     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 1, S("acdefghijklmnopqrst")));
1758     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 9, S("aklmnopqrst")));
1759     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 18, S("at")));
1760     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 19, S("a")));
1761     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 20, S("a")));
1762     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst")));
1763     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijlmnopqrst")));
1764     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijpqrst")));
1765     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijt")));
1766     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij")));
1767     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij")));
1768     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst")));
1769     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrs")));
1770     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrs")));
1771     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst")));
1772     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst")));
1773     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 21, 0, S("can't happen")));
1774 
1775     BOOST_TEST(testE(S(""), 0, 0, S("")));
1776     BOOST_TEST(testE(S(""), 0, 1, S("")));
1777     BOOST_TEST(testE(S(""), 1, 0, S("can't happen")));
1778     BOOST_TEST(testE(S("abcde"), 0, 0, S("abcde")));
1779     BOOST_TEST(testE(S("abcde"), 0, 1, S("bcde")));
1780     BOOST_TEST(testE(S("abcde"), 0, 2, S("cde")));
1781     BOOST_TEST(testE(S("abcde"), 0, 4, S("e")));
1782     BOOST_TEST(testE(S("abcde"), 0, 5, S("")));
1783     BOOST_TEST(testE(S("abcde"), 0, 6, S("")));
1784     BOOST_TEST(testE(S("abcde"), 1, 0, S("abcde")));
1785     BOOST_TEST(testE(S("abcde"), 1, 1, S("acde")));
1786     BOOST_TEST(testE(S("abcde"), 1, 2, S("ade")));
1787     BOOST_TEST(testE(S("abcde"), 1, 3, S("ae")));
1788     BOOST_TEST(testE(S("abcde"), 1, 4, S("a")));
1789     BOOST_TEST(testE(S("abcde"), 1, 5, S("a")));
1790     BOOST_TEST(testE(S("abcde"), 2, 0, S("abcde")));
1791     BOOST_TEST(testE(S("abcde"), 2, 1, S("abde")));
1792     BOOST_TEST(testE(S("abcde"), 2, 2, S("abe")));
1793     BOOST_TEST(testE(S("abcde"), 2, 3, S("ab")));
1794     BOOST_TEST(testE(S("abcde"), 2, 4, S("ab")));
1795     BOOST_TEST(testE(S("abcde"), 4, 0, S("abcde")));
1796     BOOST_TEST(testE(S("abcde"), 4, 1, S("abcd")));
1797     BOOST_TEST(testE(S("abcde"), 4, 2, S("abcd")));
1798     BOOST_TEST(testE(S("abcde"), 5, 0, S("abcde")));
1799     BOOST_TEST(testE(S("abcde"), 5, 1, S("abcde")));
1800     BOOST_TEST(testE(S("abcde"), 6, 0, S("can't happen")));
1801     BOOST_TEST(testE(S("abcdefghij"), 0, 0, S("abcdefghij")));
1802     BOOST_TEST(testE(S("abcdefghij"), 0, 1, S("bcdefghij")));
1803     BOOST_TEST(testE(S("abcdefghij"), 0, 5, S("fghij")));
1804     BOOST_TEST(testE(S("abcdefghij"), 0, 9, S("j")));
1805     BOOST_TEST(testE(S("abcdefghij"), 0, 10, S("")));
1806     BOOST_TEST(testE(S("abcdefghij"), 0, 11, S("")));
1807     BOOST_TEST(testE(S("abcdefghij"), 1, 0, S("abcdefghij")));
1808     BOOST_TEST(testE(S("abcdefghij"), 1, 1, S("acdefghij")));
1809     BOOST_TEST(testE(S("abcdefghij"), 1, 4, S("afghij")));
1810     BOOST_TEST(testE(S("abcdefghij"), 1, 8, S("aj")));
1811     BOOST_TEST(testE(S("abcdefghij"), 1, 9, S("a")));
1812     BOOST_TEST(testE(S("abcdefghij"), 1, 10, S("a")));
1813     BOOST_TEST(testE(S("abcdefghij"), 5, 0, S("abcdefghij")));
1814     BOOST_TEST(testE(S("abcdefghij"), 5, 1, S("abcdeghij")));
1815     BOOST_TEST(testE(S("abcdefghij"), 5, 2, S("abcdehij")));
1816     BOOST_TEST(testE(S("abcdefghij"), 5, 4, S("abcdej")));
1817     BOOST_TEST(testE(S("abcdefghij"), 5, 5, S("abcde")));
1818     BOOST_TEST(testE(S("abcdefghij"), 5, 6, S("abcde")));
1819     BOOST_TEST(testE(S("abcdefghij"), 9, 0, S("abcdefghij")));
1820     BOOST_TEST(testE(S("abcdefghij"), 9, 1, S("abcdefghi")));
1821     BOOST_TEST(testE(S("abcdefghij"), 9, 2, S("abcdefghi")));
1822     BOOST_TEST(testE(S("abcdefghij"), 10, 0, S("abcdefghij")));
1823     BOOST_TEST(testE(S("abcdefghij"), 10, 1, S("abcdefghij")));
1824     BOOST_TEST(testE(S("abcdefghij"), 11, 0, S("can't happen")));
1825     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst")));
1826     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 1, S("bcdefghijklmnopqrst")));
1827     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 10, S("klmnopqrst")));
1828     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 19, S("t")));
1829     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 20, S("")));
1830     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 0, 21, S("")));
1831     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst")));
1832     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 1, S("acdefghijklmnopqrst")));
1833     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 9, S("aklmnopqrst")));
1834     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 18, S("at")));
1835     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 19, S("a")));
1836     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 1, 20, S("a")));
1837     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst")));
1838     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijlmnopqrst")));
1839     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijpqrst")));
1840     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijt")));
1841     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij")));
1842     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij")));
1843     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst")));
1844     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrs")));
1845     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrs")));
1846     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst")));
1847     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst")));
1848     BOOST_TEST(testE(S("abcdefghijklmnopqrst"), 21, 0, S("can't happen")));
1849 }
1850 
1851 // done
1852 static
1853 void
testPushBack()1854 testPushBack()
1855 {
1856     // push_back(CharT ch);
1857     {
1858         static_string<2> s;
1859         s.push_back('a');
1860         BOOST_TEST(s == "a");
1861         s.push_back('b');
1862         BOOST_TEST(s == "ab");
1863         BOOST_TEST_THROWS(s.push_back('c'), std::length_error);
1864     }
1865 
1866     //---
1867 
1868     {
1869         static_string<3> s1("12");
1870         s1.push_back('3');
1871         BOOST_TEST(s1 == "123");
1872         BOOST_TEST_THROWS(
1873             s1.push_back('4'),
1874             std::length_error);
1875         static_string<0> s2;
1876         BOOST_TEST_THROWS(
1877             s2.push_back('_'),
1878             std::length_error);
1879     }
1880 }
1881 
1882 // done
1883 static
1884 void
testPopBack()1885 testPopBack()
1886 {
1887     // pop_back()
1888     {
1889         static_string<3> s{"abc"};
1890         BOOST_TEST(*s.end() == 0);
1891         s.pop_back();
1892         BOOST_TEST(s == "ab");
1893         BOOST_TEST(*s.end() == 0);
1894         s.pop_back();
1895         BOOST_TEST(s == "a");
1896         BOOST_TEST(*s.end() == 0);
1897         s.pop_back();
1898         BOOST_TEST(s.empty());
1899         BOOST_TEST(*s.end() == 0);
1900     }
1901 
1902     //---
1903 
1904     {
1905         static_string<3> s1("123");
1906         s1.pop_back();
1907         BOOST_TEST(s1 == "12");
1908         BOOST_TEST(*s1.end() == 0);
1909         s1.pop_back();
1910         BOOST_TEST(s1 == "1");
1911         BOOST_TEST(*s1.end() == 0);
1912         s1.pop_back();
1913         BOOST_TEST(s1.empty());
1914         BOOST_TEST(*s1.end() == 0);
1915     }
1916 }
1917 
1918 // done
1919 static
1920 void
testAppend()1921 testAppend()
1922 {
1923   using S = static_string<400>;
1924   using sv = string_view;
1925 
1926   // append(size_type count, CharT ch)
1927   BOOST_TEST(static_string<1>{}.append(1, 'a') == "a");
1928   BOOST_TEST(static_string<2>{}.append(2, 'a') == "aa");
1929   BOOST_TEST(static_string<2>{"a"}.append(1, 'b') == "ab");
1930   BOOST_TEST_THROWS(static_string<2>{"ab"}.append(1, 'c'), std::length_error);
1931 
1932   // append(string_view_type sv)
1933   BOOST_TEST(static_string<3>{"a"}.append(sv{"bc"}) == "abc");
1934   BOOST_TEST(static_string<3>{"ab"}.append(sv{"c"}) == "abc");
1935   BOOST_TEST_THROWS(static_string<3>{"abc"}.append(sv{"*"}), std::length_error);
1936 
1937   // append(string_view_type sv, size_type pos, size_type count = npos)
1938   BOOST_TEST(static_string<3>{"a"}.append(sv{"abc"}, 1) == "abc");
1939   BOOST_TEST(static_string<3>{"a"}.append(sv{"abc"}, 1, 2) == "abc");
1940   BOOST_TEST_THROWS(static_string<3>{"abc"}.append(sv{"a"}, 2, 1), std::out_of_range);
1941   BOOST_TEST_THROWS(static_string<3>{"abc"}.append(sv{"abcd"}, 1, 2), std::length_error);
1942 
1943   // append(CharT const* s, size_type count)
1944   BOOST_TEST(static_string<3>{"a"}.append("bc", 0) == "a");
1945   BOOST_TEST(static_string<3>{"a"}.append("bc", 2) == "abc");
1946   BOOST_TEST_THROWS(static_string<3>{"abc"}.append("bc", 2), std::length_error);
1947 
1948   // append(CharT const* s)
1949   BOOST_TEST(static_string<3>{"a"}.append("bc") == "abc");
1950   BOOST_TEST_THROWS(static_string<3>{"abc"}.append("bc"), std::length_error);
1951 
1952   // append(InputIt first, InputIt last)
1953   {
1954       static_string<4> const cs{"abcd"};
1955       static_string<4> s{"ad"};
1956       BOOST_TEST(static_string<4>{"ab"}.append(
1957           cs.begin() + 2, cs.begin() + 4) == "abcd");
1958       BOOST_TEST_THROWS(static_string<2>{"ab"}.append(
1959           cs.begin() + 2, cs.begin() + 4), std::length_error);
1960   }
1961 
1962   // append(std::initializer_list<CharT> ilist)
1963   BOOST_TEST(static_string<4>{"ab"}.append({'c', 'd'}) == "abcd");
1964   BOOST_TEST_THROWS(static_string<3>{"ab"}.append({'c', 'd'}), std::length_error);
1965 
1966   // append(T const& t)
1967   {
1968       struct T
1969       {
1970           operator string_view() const noexcept
1971           {
1972               return "c";
1973           }
1974       };
1975       BOOST_TEST(static_string<3>{"ab"}.append(T{}) == "abc");
1976       BOOST_TEST_THROWS(static_string<3>{"abc"}.append(T{}), std::length_error);
1977   }
1978 
1979   // append(T const& t, size_type pos, size_type count = npos)
1980   {
1981       struct T
1982       {
1983           operator string_view() const noexcept
1984           {
1985               return "abcd";
1986           }
1987       };
1988       BOOST_TEST(static_string<4>{"ab"}.append(T{}, 2) == "abcd");
1989       BOOST_TEST(static_string<3>{"a"}.append(T{}, 1, 2) == "abc");
1990       BOOST_TEST_THROWS(static_string<4>{"abc"}.append(T{}, 5), std::out_of_range);
1991       BOOST_TEST_THROWS(static_string<3>{"abc"}.append(T{}, 3, 1), std::length_error);
1992   }
1993 
1994   //---
1995 
1996   {
1997       static_string<3> s1("1");
1998       s1.append(2, '_');
1999       BOOST_TEST(s1 == "1__");
2000       BOOST_TEST(*s1.end() == 0);
2001       static_string<2> s2("1");
2002       BOOST_TEST_THROWS(
2003           (s2.append(2, '_')),
2004           std::length_error);
2005   }
2006   {
2007       static_string<2> s1("__");
2008       static_string<3> s2("1");
2009       s2.append(s1);
2010       BOOST_TEST(s2 == "1__");
2011       BOOST_TEST(*s2.end() == 0);
2012       static_string<2> s3("1");
2013       BOOST_TEST_THROWS(
2014           s3.append(s1),
2015           std::length_error);
2016   }
2017   {
2018       static_string<3> s1("XYZ");
2019       static_string<4> s2("12");
2020       s2.append(s1, 1);
2021       BOOST_TEST(s2 == "12YZ");
2022       BOOST_TEST(*s2.end() == 0);
2023       static_string<3> s3("12");
2024       s3.append(s1, 1, 1);
2025       BOOST_TEST(s3 == "12Y");
2026       BOOST_TEST(*s3.end() == 0);
2027       static_string<3> s4("12");
2028       BOOST_TEST_THROWS(
2029           (s4.append(s1, 4)),
2030           std::out_of_range);
2031       static_string<3> s5("12");
2032       BOOST_TEST_THROWS(
2033           (s5.append(s1, 1, 2)),
2034           std::length_error);
2035   }
2036   {
2037       static_string<4> s1("12");
2038       s1.append("XYZ", 2);
2039       BOOST_TEST(s1 == "12XY");
2040       BOOST_TEST(*s1.end() == 0);
2041       static_string<3> s3("12");
2042       BOOST_TEST_THROWS(
2043           (s3.append("XYZ", 2)),
2044           std::length_error);
2045   }
2046   {
2047       static_string<5> s1("12");
2048       s1.append("XYZ");
2049       BOOST_TEST(s1 == "12XYZ");
2050       BOOST_TEST(*s1.end() == 0);
2051       static_string<4> s2("12");
2052       BOOST_TEST_THROWS(
2053           s2.append("XYZ"),
2054           std::length_error);
2055   }
2056   {
2057       static_string<3> s1("XYZ");
2058       static_string<5> s2("12");
2059       s2.append(s1.begin(), s1.end());
2060       BOOST_TEST(s2 == "12XYZ");
2061       BOOST_TEST(*s2.end() == 0);
2062       static_string<4> s3("12");
2063       BOOST_TEST_THROWS(
2064           s3.append(s1.begin(), s1.end()),
2065           std::length_error);
2066   }
2067   {
2068       static_string<5> s1("123");
2069       s1.append({'X', 'Y'});
2070       BOOST_TEST(s1 == "123XY");
2071       BOOST_TEST(*s1.end() == 0);
2072       static_string<4> s2("123");
2073       BOOST_TEST_THROWS(
2074           s2.append({'X', 'Y'}),
2075           std::length_error);
2076   }
2077   {
2078       string_view s1("XYZ");
2079       static_string<5> s2("12");
2080       s2.append(s1);
2081       BOOST_TEST(s2 == "12XYZ");
2082       BOOST_TEST(*s2.end() == 0);
2083       static_string<4> s3("12");
2084       BOOST_TEST_THROWS(
2085           s3.append(s1),
2086           std::length_error);
2087   }
2088   {
2089       static_string<6> s1("123");
2090       s1.append(std::string("UVX"), 1);
2091       BOOST_TEST(s1 == "123VX");
2092       BOOST_TEST(*s1.end() == 0);
2093       s1.append(std::string("PQR"), 1, 1);
2094       BOOST_TEST(s1 == "123VXQ");
2095       BOOST_TEST(*s1.end() == 0);
2096       static_string<3> s2("123");
2097       BOOST_TEST_THROWS(
2098           (s2.append(std::string("PQR"), 1, 1)),
2099           std::length_error);
2100   }
2101   BOOST_TEST(testA(S(), "", 0, S()));
2102   BOOST_TEST(testA(S(), "12345", 3, S("123")));
2103   BOOST_TEST(testA(S(), "12345", 4, S("1234")));
2104   BOOST_TEST(testA(S(), "12345678901234567890", 0, S()));
2105   BOOST_TEST(testA(S(), "12345678901234567890", 1, S("1")));
2106   BOOST_TEST(testA(S(), "12345678901234567890", 3, S("123")));
2107   BOOST_TEST(testA(S(), "12345678901234567890", 20, S("12345678901234567890")));
2108 
2109   BOOST_TEST(testA(S("12345"), "", 0, S("12345")));
2110   BOOST_TEST(testA(S("12345"), "12345", 5, S("1234512345")));
2111   BOOST_TEST(testA(S("12345"), "1234567890", 10, S("123451234567890")));
2112 
2113   BOOST_TEST(testA(S("12345678901234567890"), "", 0, S("12345678901234567890")));
2114   BOOST_TEST(testA(S("12345678901234567890"), "12345", 5, S("1234567890123456789012345")));
2115   BOOST_TEST(testA(S("12345678901234567890"), "12345678901234567890", 20,
2116               S("1234567890123456789012345678901234567890")));
2117 
2118   S s_short = "123/";
2119 
2120   s_short.append(s_short.data(), s_short.size());
2121   BOOST_TEST(s_short == "123/123/");
2122   s_short.append(s_short.data(), s_short.size());
2123   BOOST_TEST(s_short == "123/123/123/123/");
2124   s_short.append(s_short.data(), s_short.size());
2125   BOOST_TEST(s_short == "123/123/123/123/123/123/123/123/");
2126 }
2127 
2128 // done
2129 static
2130 void
testPlusEquals()2131 testPlusEquals()
2132 {
2133     using sv = string_view;
2134 
2135     // operator+=(CharT ch)
2136     BOOST_TEST((static_string<3>{"ab"} += 'c') == "abc");
2137     BOOST_TEST_THROWS((static_string<3>{"abc"} += '*'), std::length_error);
2138 
2139     // operator+=(CharT const* s)
2140     BOOST_TEST((static_string<3>{"a"} += "bc") == "abc");
2141     BOOST_TEST_THROWS((static_string<3>{"abc"} += "*"), std::length_error);
2142 
2143     // operator+=(std::initializer_list<CharT> init)
2144     BOOST_TEST((static_string<3>{"a"} += {'b', 'c'}) == "abc");
2145     BOOST_TEST_THROWS((static_string<3>{"abc"} += {'*', '*'}), std::length_error);
2146 
2147     // operator+=(string_view_type const& s)
2148     BOOST_TEST((static_string<3>{"a"} += sv{"bc"}) == "abc");
2149     BOOST_TEST_THROWS((static_string<3>{"abc"} += sv{"*"}), std::length_error);
2150 
2151     //---
2152 
2153     {
2154         static_string<2> s1("__");
2155         static_string<3> s2("1");
2156         s2 += s1;
2157         BOOST_TEST(s2 == "1__");
2158         BOOST_TEST(*s2.end() == 0);
2159         static_string<2> s3("1");
2160         BOOST_TEST_THROWS(
2161             s3 += s1,
2162             std::length_error);
2163     }
2164     {
2165         static_string<3> s1("12");
2166         s1 += '3';
2167         BOOST_TEST(s1 == "123");
2168         BOOST_TEST_THROWS(
2169             s1 += '4',
2170             std::length_error);
2171     }
2172     {
2173         static_string<4> s1("12");
2174         s1 += "34";
2175         BOOST_TEST(s1 == "1234");
2176         BOOST_TEST_THROWS(
2177             s1 += "5",
2178             std::length_error);
2179     }
2180     {
2181         static_string<4> s1("12");
2182         s1 += {'3', '4'};
2183         BOOST_TEST(s1 == "1234");
2184         BOOST_TEST_THROWS(
2185             (s1 += {'5'}),
2186             std::length_error);
2187     }
2188     {
2189         string_view s1("34");
2190         static_string<4> s2("12");
2191         s2 += s1;
2192         BOOST_TEST(s2 == "1234");
2193         BOOST_TEST_THROWS(
2194             s2 += s1,
2195             std::length_error);
2196     }
2197 }
2198 
2199 // done
2200 void
testCompare()2201 testCompare()
2202 {
2203     using str1 = static_string<1>;
2204     using str2 = static_string<2>;
2205     {
2206         str1 s1;
2207         str2 s2;
2208         s1 = "1";
2209         s2 = "22";
2210         BOOST_TEST(s1.compare(s2) < 0);
2211         BOOST_TEST(s2.compare(s1) > 0);
2212 
2213         BOOST_TEST(s1.compare(0, 1, s2) < 0);
2214         BOOST_TEST(s2.compare(0, 2, s1) > 0);
2215 
2216         BOOST_TEST(s1.compare(0, 2, s2, 0, 1) < 0);
2217         BOOST_TEST(s2.compare(0, 1, s1, 0, 2) > 0);
2218 
2219         BOOST_TEST(s1.compare(s2.data()) < 0);
2220         BOOST_TEST(s2.compare(s1.data()) > 0);
2221 
2222         BOOST_TEST(s1.compare(0, 2, s2.data()) < 0);
2223         BOOST_TEST(s2.compare(0, 1, s1.data()) > 0);
2224 
2225         BOOST_TEST(s1.compare(s2.subview()) < 0);
2226         BOOST_TEST(s2.compare(s1.subview()) > 0);
2227 
2228         BOOST_TEST(s1.compare(0, 2, s2.subview()) < 0);
2229         BOOST_TEST(s2.compare(0, 1, s1.subview()) > 0);
2230 
2231         BOOST_TEST(s1.compare(0, 2, s2.subview(), 0, 1) < 0);
2232         BOOST_TEST(s2.compare(0, 1, s1.subview(), 0, 2) > 0);
2233 
2234         BOOST_TEST(s1 < "10");
2235         BOOST_TEST(s2 > "1");
2236         BOOST_TEST("10" > s1);
2237         BOOST_TEST("1" < s2);
2238         BOOST_TEST(s1 < "20");
2239         BOOST_TEST(s2 > "1");
2240         BOOST_TEST(s2 > "2");
2241     }
2242     {
2243         str2 s1("x");
2244         str2 s2("x");
2245         BOOST_TEST(s1 == s2);
2246         BOOST_TEST(s1 <= s2);
2247         BOOST_TEST(s1 >= s2);
2248         BOOST_TEST(! (s1 < s2));
2249         BOOST_TEST(! (s1 > s2));
2250         BOOST_TEST(! (s1 != s2));
2251     }
2252     {
2253         str1 s1("x");
2254         str2 s2("x");
2255         BOOST_TEST(s1 == s2);
2256         BOOST_TEST(s1 <= s2);
2257         BOOST_TEST(s1 >= s2);
2258         BOOST_TEST(! (s1 < s2));
2259         BOOST_TEST(! (s1 > s2));
2260         BOOST_TEST(! (s1 != s2));
2261     }
2262     {
2263         str2 s("x");
2264         BOOST_TEST(s == "x");
2265         BOOST_TEST(s <= "x");
2266         BOOST_TEST(s >= "x");
2267         BOOST_TEST(! (s < "x"));
2268         BOOST_TEST(! (s > "x"));
2269         BOOST_TEST(! (s != "x"));
2270         BOOST_TEST("x" == s);
2271         BOOST_TEST("x" <= s);
2272         BOOST_TEST("x" >= s);
2273         BOOST_TEST(! ("x" < s));
2274         BOOST_TEST(! ("x" > s));
2275         BOOST_TEST(! ("x" != s));
2276     }
2277     {
2278         str2 s("x");
2279         BOOST_TEST(s <= "y");
2280         BOOST_TEST(s < "y");
2281         BOOST_TEST(s != "y");
2282         BOOST_TEST(! (s == "y"));
2283         BOOST_TEST(! (s >= "y"));
2284         BOOST_TEST(! (s > "x"));
2285         BOOST_TEST("y" >= s);
2286         BOOST_TEST("y" > s);
2287         BOOST_TEST("y" != s);
2288         BOOST_TEST(! ("y" == s));
2289         BOOST_TEST(! ("y" <= s));
2290         BOOST_TEST(! ("y" < s));
2291     }
2292     {
2293         str1 s1("x");
2294         str2 s2("y");
2295         BOOST_TEST(s1 <= s2);
2296         BOOST_TEST(s1 < s2);
2297         BOOST_TEST(s1 != s2);
2298         BOOST_TEST(! (s1 == s2));
2299         BOOST_TEST(! (s1 >= s2));
2300         BOOST_TEST(! (s1 > s2));
2301     }
2302     {
2303         str1 s1("x");
2304         str2 s2("xx");
2305         BOOST_TEST(s1 < s2);
2306         BOOST_TEST(s2 > s1);
2307     }
2308     {
2309         str1 s1("x");
2310         str2 s2("yy");
2311         BOOST_TEST(s1 < s2);
2312         BOOST_TEST(s2 > s1);
2313     }
2314 
2315     using S = static_string<400>;
2316     BOOST_TEST(testC(S(""), 0, 0, "", 0, 0));
2317     BOOST_TEST(testC(S(""), 0, 0, "abcde", 0, 0));
2318     BOOST_TEST(testC(S(""), 0, 0, "abcde", 1, -1));
2319     BOOST_TEST(testC(S(""), 0, 0, "abcde", 2, -2));
2320     BOOST_TEST(testC(S(""), 0, 0, "abcde", 4, -4));
2321     BOOST_TEST(testC(S(""), 0, 0, "abcde", 5, -5));
2322     BOOST_TEST(testC(S(""), 0, 0, "abcdefghij", 0, 0));
2323     BOOST_TEST(testC(S(""), 0, 0, "abcdefghij", 1, -1));
2324     BOOST_TEST(testC(S(""), 0, 0, "abcdefghij", 5, -5));
2325     BOOST_TEST(testC(S(""), 0, 0, "abcdefghij", 9, -9));
2326     BOOST_TEST(testC(S(""), 0, 0, "abcdefghij", 10, -10));
2327     BOOST_TEST(testC(S(""), 0, 0, "abcdefghijklmnopqrst", 0, 0));
2328     BOOST_TEST(testC(S(""), 0, 0, "abcdefghijklmnopqrst", 1, -1));
2329     BOOST_TEST(testC(S(""), 0, 0, "abcdefghijklmnopqrst", 10, -10));
2330     BOOST_TEST(testC(S(""), 0, 0, "abcdefghijklmnopqrst", 19, -19));
2331     BOOST_TEST(testC(S(""), 0, 0, "abcdefghijklmnopqrst", 20, -20));
2332     BOOST_TEST(testC(S(""), 0, 1, "", 0, 0));
2333     BOOST_TEST(testC(S(""), 0, 1, "abcde", 0, 0));
2334     BOOST_TEST(testC(S(""), 0, 1, "abcde", 1, -1));
2335     BOOST_TEST(testC(S(""), 0, 1, "abcde", 2, -2));
2336     BOOST_TEST(testC(S(""), 0, 1, "abcde", 4, -4));
2337     BOOST_TEST(testC(S(""), 0, 1, "abcde", 5, -5));
2338     BOOST_TEST(testC(S(""), 0, 1, "abcdefghij", 0, 0));
2339     BOOST_TEST(testC(S(""), 0, 1, "abcdefghij", 1, -1));
2340     BOOST_TEST(testC(S(""), 0, 1, "abcdefghij", 5, -5));
2341     BOOST_TEST(testC(S(""), 0, 1, "abcdefghij", 9, -9));
2342     BOOST_TEST(testC(S(""), 0, 1, "abcdefghij", 10, -10));
2343     BOOST_TEST(testC(S(""), 0, 1, "abcdefghijklmnopqrst", 0, 0));
2344     BOOST_TEST(testC(S(""), 0, 1, "abcdefghijklmnopqrst", 1, -1));
2345     BOOST_TEST(testC(S(""), 0, 1, "abcdefghijklmnopqrst", 10, -10));
2346     BOOST_TEST(testC(S(""), 0, 1, "abcdefghijklmnopqrst", 19, -19));
2347     BOOST_TEST(testC(S(""), 0, 1, "abcdefghijklmnopqrst", 20, -20));
2348     BOOST_TEST(testC(S(""), 1, 0, "", 0, 0));
2349     BOOST_TEST(testC(S(""), 1, 0, "abcde", 0, 0));
2350     BOOST_TEST(testC(S(""), 1, 0, "abcde", 1, 0));
2351     BOOST_TEST(testC(S(""), 1, 0, "abcde", 2, 0));
2352     BOOST_TEST(testC(S(""), 1, 0, "abcde", 4, 0));
2353     BOOST_TEST(testC(S(""), 1, 0, "abcde", 5, 0));
2354     BOOST_TEST(testC(S(""), 1, 0, "abcdefghij", 0, 0));
2355     BOOST_TEST(testC(S(""), 1, 0, "abcdefghij", 1, 0));
2356     BOOST_TEST(testC(S(""), 1, 0, "abcdefghij", 5, 0));
2357     BOOST_TEST(testC(S(""), 1, 0, "abcdefghij", 9, 0));
2358     BOOST_TEST(testC(S(""), 1, 0, "abcdefghij", 10, 0));
2359     BOOST_TEST(testC(S(""), 1, 0, "abcdefghijklmnopqrst", 0, 0));
2360     BOOST_TEST(testC(S(""), 1, 0, "abcdefghijklmnopqrst", 1, 0));
2361     BOOST_TEST(testC(S(""), 1, 0, "abcdefghijklmnopqrst", 10, 0));
2362     BOOST_TEST(testC(S(""), 1, 0, "abcdefghijklmnopqrst", 19, 0));
2363     BOOST_TEST(testC(S(""), 1, 0, "abcdefghijklmnopqrst", 20, 0));
2364     BOOST_TEST(testC(S("abcde"), 0, 0, "", 0, 0));
2365     BOOST_TEST(testC(S("abcde"), 0, 0, "abcde", 0, 0));
2366     BOOST_TEST(testC(S("abcde"), 0, 0, "abcde", 1, -1));
2367     BOOST_TEST(testC(S("abcde"), 0, 0, "abcde", 2, -2));
2368     BOOST_TEST(testC(S("abcde"), 0, 0, "abcde", 4, -4));
2369     BOOST_TEST(testC(S("abcde"), 0, 0, "abcde", 5, -5));
2370     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghij", 0, 0));
2371     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghij", 1, -1));
2372     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghij", 5, -5));
2373     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghij", 9, -9));
2374     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghij", 10, -10));
2375     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 0, 0));
2376     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 1, -1));
2377     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 10, -10));
2378     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 19, -19));
2379     BOOST_TEST(testC(S("abcde"), 0, 0, "abcdefghijklmnopqrst", 20, -20));
2380     BOOST_TEST(testC(S("abcde"), 0, 1, "", 0, 1));
2381     BOOST_TEST(testC(S("abcde"), 0, 1, "abcde", 0, 1));
2382     BOOST_TEST(testC(S("abcde"), 0, 1, "abcde", 1, 0));
2383     BOOST_TEST(testC(S("abcde"), 0, 1, "abcde", 2, -1));
2384     BOOST_TEST(testC(S("abcde"), 0, 1, "abcde", 4, -3));
2385     BOOST_TEST(testC(S("abcde"), 0, 1, "abcde", 5, -4));
2386     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghij", 0, 1));
2387     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghij", 1, 0));
2388     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghij", 5, -4));
2389     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghij", 9, -8));
2390     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghij", 10, -9));
2391     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 0, 1));
2392     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 1, 0));
2393     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 10, -9));
2394     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 19, -18));
2395     BOOST_TEST(testC(S("abcde"), 0, 1, "abcdefghijklmnopqrst", 20, -19));
2396     BOOST_TEST(testC(S("abcde"), 0, 2, "", 0, 2));
2397     BOOST_TEST(testC(S("abcde"), 0, 2, "abcde", 0, 2));
2398     BOOST_TEST(testC(S("abcde"), 0, 2, "abcde", 1, 1));
2399     BOOST_TEST(testC(S("abcde"), 0, 2, "abcde", 2, 0));
2400     BOOST_TEST(testC(S("abcde"), 0, 2, "abcde", 4, -2));
2401     BOOST_TEST(testC(S("abcde"), 0, 2, "abcde", 5, -3));
2402     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghij", 0, 2));
2403     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghij", 1, 1));
2404     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghij", 5, -3));
2405     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghij", 9, -7));
2406     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghij", 10, -8));
2407     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 0, 2));
2408     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 1, 1));
2409     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 10, -8));
2410     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 19, -17));
2411     BOOST_TEST(testC(S("abcde"), 0, 2, "abcdefghijklmnopqrst", 20, -18));
2412     BOOST_TEST(testC(S("abcde"), 0, 4, "", 0, 4));
2413     BOOST_TEST(testC(S("abcde"), 0, 4, "abcde", 0, 4));
2414     BOOST_TEST(testC(S("abcde"), 0, 4, "abcde", 1, 3));
2415     BOOST_TEST(testC(S("abcde"), 0, 4, "abcde", 2, 2));
2416     BOOST_TEST(testC(S("abcde"), 0, 4, "abcde", 4, 0));
2417     BOOST_TEST(testC(S("abcde"), 0, 4, "abcde", 5, -1));
2418     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghij", 0, 4));
2419     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghij", 1, 3));
2420     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghij", 5, -1));
2421     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghij", 9, -5));
2422     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghij", 10, -6));
2423     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 0, 4));
2424     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 1, 3));
2425     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 10, -6));
2426     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 19, -15));
2427     BOOST_TEST(testC(S("abcde"), 0, 4, "abcdefghijklmnopqrst", 20, -16));
2428     BOOST_TEST(testC(S("abcde"), 0, 5, "", 0, 5));
2429     BOOST_TEST(testC(S("abcde"), 0, 5, "abcde", 0, 5));
2430     BOOST_TEST(testC(S("abcde"), 0, 5, "abcde", 1, 4));
2431     BOOST_TEST(testC(S("abcde"), 0, 5, "abcde", 2, 3));
2432     BOOST_TEST(testC(S("abcde"), 0, 5, "abcde", 4, 1));
2433     BOOST_TEST(testC(S("abcde"), 0, 5, "abcde", 5, 0));
2434     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghij", 0, 5));
2435     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghij", 1, 4));
2436     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghij", 5, 0));
2437     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghij", 9, -4));
2438     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghij", 10, -5));
2439     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 0, 5));
2440     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 1, 4));
2441     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 10, -5));
2442     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 19, -14));
2443     BOOST_TEST(testC(S("abcde"), 0, 5, "abcdefghijklmnopqrst", 20, -15));
2444     BOOST_TEST(testC(S("abcde"), 0, 6, "", 0, 5));
2445     BOOST_TEST(testC(S("abcde"), 0, 6, "abcde", 0, 5));
2446     BOOST_TEST(testC(S("abcde"), 0, 6, "abcde", 1, 4));
2447     BOOST_TEST(testC(S("abcde"), 0, 6, "abcde", 2, 3));
2448     BOOST_TEST(testC(S("abcde"), 0, 6, "abcde", 4, 1));
2449     BOOST_TEST(testC(S("abcde"), 0, 6, "abcde", 5, 0));
2450     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghij", 0, 5));
2451     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghij", 1, 4));
2452     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghij", 5, 0));
2453     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghij", 9, -4));
2454     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghij", 10, -5));
2455     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 0, 5));
2456     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 1, 4));
2457     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 10, -5));
2458     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 19, -14));
2459     BOOST_TEST(testC(S("abcde"), 0, 6, "abcdefghijklmnopqrst", 20, -15));
2460     BOOST_TEST(testC(S("abcde"), 1, 0, "", 0, 0));
2461     BOOST_TEST(testC(S("abcde"), 1, 0, "abcde", 0, 0));
2462     BOOST_TEST(testC(S("abcde"), 1, 0, "abcde", 1, -1));
2463     BOOST_TEST(testC(S("abcde"), 1, 0, "abcde", 2, -2));
2464     BOOST_TEST(testC(S("abcde"), 1, 0, "abcde", 4, -4));
2465     BOOST_TEST(testC(S("abcde"), 1, 0, "abcde", 5, -5));
2466     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghij", 0, 0));
2467     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghij", 1, -1));
2468     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghij", 5, -5));
2469     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghij", 9, -9));
2470     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghij", 10, -10));
2471     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 0, 0));
2472     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 1, -1));
2473     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 10, -10));
2474     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 19, -19));
2475     BOOST_TEST(testC(S("abcde"), 1, 0, "abcdefghijklmnopqrst", 20, -20));
2476     BOOST_TEST(testC(S("abcde"), 1, 1, "", 0, 1));
2477     BOOST_TEST(testC(S("abcde"), 1, 1, "abcde", 0, 1));
2478     BOOST_TEST(testC(S("abcde"), 1, 1, "abcde", 1, 1));
2479     BOOST_TEST(testC(S("abcde"), 1, 1, "abcde", 2, 1));
2480     BOOST_TEST(testC(S("abcde"), 1, 1, "abcde", 4, 1));
2481     BOOST_TEST(testC(S("abcde"), 1, 1, "abcde", 5, 1));
2482     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghij", 0, 1));
2483     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghij", 1, 1));
2484     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghij", 5, 1));
2485     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghij", 9, 1));
2486     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghij", 10, 1));
2487     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 0, 1));
2488     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 1, 1));
2489     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 10, 1));
2490     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 19, 1));
2491     BOOST_TEST(testC(S("abcde"), 1, 1, "abcdefghijklmnopqrst", 20, 1));
2492     BOOST_TEST(testC(S("abcde"), 1, 2, "", 0, 2));
2493     BOOST_TEST(testC(S("abcde"), 1, 2, "abcde", 0, 2));
2494     BOOST_TEST(testC(S("abcde"), 1, 2, "abcde", 1, 1));
2495     BOOST_TEST(testC(S("abcde"), 1, 2, "abcde", 2, 1));
2496     BOOST_TEST(testC(S("abcde"), 1, 2, "abcde", 4, 1));
2497     BOOST_TEST(testC(S("abcde"), 1, 2, "abcde", 5, 1));
2498     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghij", 0, 2));
2499     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghij", 1, 1));
2500     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghij", 5, 1));
2501     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghij", 9, 1));
2502     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghij", 10, 1));
2503     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 0, 2));
2504     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 1, 1));
2505     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 10, 1));
2506     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 19, 1));
2507     BOOST_TEST(testC(S("abcde"), 1, 2, "abcdefghijklmnopqrst", 20, 1));
2508     BOOST_TEST(testC(S("abcde"), 1, 3, "", 0, 3));
2509     BOOST_TEST(testC(S("abcde"), 1, 3, "abcde", 0, 3));
2510     BOOST_TEST(testC(S("abcde"), 1, 3, "abcde", 1, 1));
2511     BOOST_TEST(testC(S("abcde"), 1, 3, "abcde", 2, 1));
2512     BOOST_TEST(testC(S("abcde"), 1, 3, "abcde", 4, 1));
2513     BOOST_TEST(testC(S("abcde"), 1, 3, "abcde", 5, 1));
2514     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghij", 0, 3));
2515     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghij", 1, 1));
2516     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghij", 5, 1));
2517     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghij", 9, 1));
2518     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghij", 10, 1));
2519     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 0, 3));
2520     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 1, 1));
2521     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 10, 1));
2522     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 19, 1));
2523     BOOST_TEST(testC(S("abcde"), 1, 3, "abcdefghijklmnopqrst", 20, 1));
2524     BOOST_TEST(testC(S("abcde"), 1, 4, "", 0, 4));
2525     BOOST_TEST(testC(S("abcde"), 1, 4, "abcde", 0, 4));
2526     BOOST_TEST(testC(S("abcde"), 1, 4, "abcde", 1, 1));
2527     BOOST_TEST(testC(S("abcde"), 1, 4, "abcde", 2, 1));
2528     BOOST_TEST(testC(S("abcde"), 1, 4, "abcde", 4, 1));
2529     BOOST_TEST(testC(S("abcde"), 1, 4, "abcde", 5, 1));
2530     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghij", 0, 4));
2531     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghij", 1, 1));
2532     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghij", 5, 1));
2533     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghij", 9, 1));
2534     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghij", 10, 1));
2535     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 0, 4));
2536     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 1, 1));
2537     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 10, 1));
2538     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 19, 1));
2539     BOOST_TEST(testC(S("abcde"), 1, 4, "abcdefghijklmnopqrst", 20, 1));
2540     BOOST_TEST(testC(S("abcde"), 1, 5, "", 0, 4));
2541     BOOST_TEST(testC(S("abcde"), 1, 5, "abcde", 0, 4));
2542     BOOST_TEST(testC(S("abcde"), 1, 5, "abcde", 1, 1));
2543     BOOST_TEST(testC(S("abcde"), 1, 5, "abcde", 2, 1));
2544     BOOST_TEST(testC(S("abcde"), 1, 5, "abcde", 4, 1));
2545     BOOST_TEST(testC(S("abcde"), 1, 5, "abcde", 5, 1));
2546     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghij", 0, 4));
2547     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghij", 1, 1));
2548     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghij", 5, 1));
2549     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghij", 9, 1));
2550     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghij", 10, 1));
2551     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 0, 4));
2552     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 1, 1));
2553     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 10, 1));
2554     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 19, 1));
2555     BOOST_TEST(testC(S("abcde"), 1, 5, "abcdefghijklmnopqrst", 20, 1));
2556     BOOST_TEST(testC(S("abcde"), 2, 0, "", 0, 0));
2557     BOOST_TEST(testC(S("abcde"), 2, 0, "abcde", 0, 0));
2558     BOOST_TEST(testC(S("abcde"), 2, 0, "abcde", 1, -1));
2559     BOOST_TEST(testC(S("abcde"), 2, 0, "abcde", 2, -2));
2560     BOOST_TEST(testC(S("abcde"), 2, 0, "abcde", 4, -4));
2561     BOOST_TEST(testC(S("abcde"), 2, 0, "abcde", 5, -5));
2562     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghij", 0, 0));
2563     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghij", 1, -1));
2564     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghij", 5, -5));
2565     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghij", 9, -9));
2566     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghij", 10, -10));
2567     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 0, 0));
2568     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 1, -1));
2569     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 10, -10));
2570     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 19, -19));
2571     BOOST_TEST(testC(S("abcde"), 2, 0, "abcdefghijklmnopqrst", 20, -20));
2572     BOOST_TEST(testC(S("abcde"), 2, 1, "", 0, 1));
2573     BOOST_TEST(testC(S("abcde"), 2, 1, "abcde", 0, 1));
2574     BOOST_TEST(testC(S("abcde"), 2, 1, "abcde", 1, 2));
2575     BOOST_TEST(testC(S("abcde"), 2, 1, "abcde", 2, 2));
2576     BOOST_TEST(testC(S("abcde"), 2, 1, "abcde", 4, 2));
2577     BOOST_TEST(testC(S("abcde"), 2, 1, "abcde", 5, 2));
2578     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghij", 0, 1));
2579     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghij", 1, 2));
2580     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghij", 5, 2));
2581     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghij", 9, 2));
2582     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghij", 10, 2));
2583     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 0, 1));
2584     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 1, 2));
2585     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 10, 2));
2586     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 19, 2));
2587     BOOST_TEST(testC(S("abcde"), 2, 1, "abcdefghijklmnopqrst", 20, 2));
2588     BOOST_TEST(testC(S("abcde"), 2, 2, "", 0, 2));
2589     BOOST_TEST(testC(S("abcde"), 2, 2, "abcde", 0, 2));
2590     BOOST_TEST(testC(S("abcde"), 2, 2, "abcde", 1, 2));
2591     BOOST_TEST(testC(S("abcde"), 2, 2, "abcde", 2, 2));
2592     BOOST_TEST(testC(S("abcde"), 2, 2, "abcde", 4, 2));
2593     BOOST_TEST(testC(S("abcde"), 2, 2, "abcde", 5, 2));
2594     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghij", 0, 2));
2595     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghij", 1, 2));
2596     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghij", 5, 2));
2597     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghij", 9, 2));
2598     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghij", 10, 2));
2599     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 0, 2));
2600     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 1, 2));
2601     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 10, 2));
2602     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 19, 2));
2603     BOOST_TEST(testC(S("abcde"), 2, 2, "abcdefghijklmnopqrst", 20, 2));
2604     BOOST_TEST(testC(S("abcde"), 2, 3, "", 0, 3));
2605     BOOST_TEST(testC(S("abcde"), 2, 3, "abcde", 0, 3));
2606     BOOST_TEST(testC(S("abcde"), 2, 3, "abcde", 1, 2));
2607     BOOST_TEST(testC(S("abcde"), 2, 3, "abcde", 2, 2));
2608     BOOST_TEST(testC(S("abcde"), 2, 3, "abcde", 4, 2));
2609     BOOST_TEST(testC(S("abcde"), 2, 3, "abcde", 5, 2));
2610     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghij", 0, 3));
2611     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghij", 1, 2));
2612     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghij", 5, 2));
2613     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghij", 9, 2));
2614     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghij", 10, 2));
2615     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 0, 3));
2616     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 1, 2));
2617     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 10, 2));
2618     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 19, 2));
2619     BOOST_TEST(testC(S("abcde"), 2, 3, "abcdefghijklmnopqrst", 20, 2));
2620     BOOST_TEST(testC(S("abcde"), 2, 4, "", 0, 3));
2621     BOOST_TEST(testC(S("abcde"), 2, 4, "abcde", 0, 3));
2622     BOOST_TEST(testC(S("abcde"), 2, 4, "abcde", 1, 2));
2623     BOOST_TEST(testC(S("abcde"), 2, 4, "abcde", 2, 2));
2624     BOOST_TEST(testC(S("abcde"), 2, 4, "abcde", 4, 2));
2625     BOOST_TEST(testC(S("abcde"), 2, 4, "abcde", 5, 2));
2626     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghij", 0, 3));
2627     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghij", 1, 2));
2628     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghij", 5, 2));
2629     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghij", 9, 2));
2630     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghij", 10, 2));
2631     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 0, 3));
2632     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 1, 2));
2633     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 10, 2));
2634     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 19, 2));
2635     BOOST_TEST(testC(S("abcde"), 2, 4, "abcdefghijklmnopqrst", 20, 2));
2636     BOOST_TEST(testC(S("abcde"), 4, 0, "", 0, 0));
2637     BOOST_TEST(testC(S("abcde"), 4, 0, "abcde", 0, 0));
2638     BOOST_TEST(testC(S("abcde"), 4, 0, "abcde", 1, -1));
2639     BOOST_TEST(testC(S("abcde"), 4, 0, "abcde", 2, -2));
2640     BOOST_TEST(testC(S("abcde"), 4, 0, "abcde", 4, -4));
2641     BOOST_TEST(testC(S("abcde"), 4, 0, "abcde", 5, -5));
2642     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghij", 0, 0));
2643     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghij", 1, -1));
2644     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghij", 5, -5));
2645     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghij", 9, -9));
2646     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghij", 10, -10));
2647     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 0, 0));
2648     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 1, -1));
2649     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 10, -10));
2650     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 19, -19));
2651     BOOST_TEST(testC(S("abcde"), 4, 0, "abcdefghijklmnopqrst", 20, -20));
2652     BOOST_TEST(testC(S("abcde"), 4, 1, "", 0, 1));
2653     BOOST_TEST(testC(S("abcde"), 4, 1, "abcde", 0, 1));
2654     BOOST_TEST(testC(S("abcde"), 4, 1, "abcde", 1, 4));
2655     BOOST_TEST(testC(S("abcde"), 4, 1, "abcde", 2, 4));
2656     BOOST_TEST(testC(S("abcde"), 4, 1, "abcde", 4, 4));
2657     BOOST_TEST(testC(S("abcde"), 4, 1, "abcde", 5, 4));
2658     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghij", 0, 1));
2659     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghij", 1, 4));
2660     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghij", 5, 4));
2661     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghij", 9, 4));
2662     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghij", 10, 4));
2663     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 0, 1));
2664     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 1, 4));
2665     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 10, 4));
2666     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 19, 4));
2667     BOOST_TEST(testC(S("abcde"), 4, 1, "abcdefghijklmnopqrst", 20, 4));
2668     BOOST_TEST(testC(S("abcde"), 4, 2, "", 0, 1));
2669     BOOST_TEST(testC(S("abcde"), 4, 2, "abcde", 0, 1));
2670     BOOST_TEST(testC(S("abcde"), 4, 2, "abcde", 1, 4));
2671     BOOST_TEST(testC(S("abcde"), 4, 2, "abcde", 2, 4));
2672     BOOST_TEST(testC(S("abcde"), 4, 2, "abcde", 4, 4));
2673     BOOST_TEST(testC(S("abcde"), 4, 2, "abcde", 5, 4));
2674     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghij", 0, 1));
2675     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghij", 1, 4));
2676     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghij", 5, 4));
2677     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghij", 9, 4));
2678     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghij", 10, 4));
2679     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 0, 1));
2680     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 1, 4));
2681     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 10, 4));
2682     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 19, 4));
2683     BOOST_TEST(testC(S("abcde"), 4, 2, "abcdefghijklmnopqrst", 20, 4));
2684     BOOST_TEST(testC(S("abcde"), 5, 0, "", 0, 0));
2685     BOOST_TEST(testC(S("abcde"), 5, 0, "abcde", 0, 0));
2686     BOOST_TEST(testC(S("abcde"), 5, 0, "abcde", 1, -1));
2687     BOOST_TEST(testC(S("abcde"), 5, 0, "abcde", 2, -2));
2688     BOOST_TEST(testC(S("abcde"), 5, 0, "abcde", 4, -4));
2689     BOOST_TEST(testC(S("abcde"), 5, 0, "abcde", 5, -5));
2690     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghij", 0, 0));
2691     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghij", 1, -1));
2692     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghij", 5, -5));
2693     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghij", 9, -9));
2694     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghij", 10, -10));
2695     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 0, 0));
2696     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 1, -1));
2697     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 10, -10));
2698     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 19, -19));
2699     BOOST_TEST(testC(S("abcde"), 5, 0, "abcdefghijklmnopqrst", 20, -20));
2700     BOOST_TEST(testC(S("abcde"), 5, 1, "", 0, 0));
2701     BOOST_TEST(testC(S("abcde"), 5, 1, "abcde", 0, 0));
2702     BOOST_TEST(testC(S("abcde"), 5, 1, "abcde", 1, -1));
2703     BOOST_TEST(testC(S("abcde"), 5, 1, "abcde", 2, -2));
2704     BOOST_TEST(testC(S("abcde"), 5, 1, "abcde", 4, -4));
2705     BOOST_TEST(testC(S("abcde"), 5, 1, "abcde", 5, -5));
2706     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghij", 0, 0));
2707     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghij", 1, -1));
2708     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghij", 5, -5));
2709     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghij", 9, -9));
2710     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghij", 10, -10));
2711     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 0, 0));
2712     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 1, -1));
2713     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 10, -10));
2714     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 19, -19));
2715     BOOST_TEST(testC(S("abcde"), 5, 1, "abcdefghijklmnopqrst", 20, -20));
2716     BOOST_TEST(testC(S("abcde"), 6, 0, "", 0, 0));
2717     BOOST_TEST(testC(S("abcde"), 6, 0, "abcde", 0, 0));
2718     BOOST_TEST(testC(S("abcde"), 6, 0, "abcde", 1, 0));
2719     BOOST_TEST(testC(S("abcde"), 6, 0, "abcde", 2, 0));
2720     BOOST_TEST(testC(S("abcde"), 6, 0, "abcde", 4, 0));
2721     BOOST_TEST(testC(S("abcde"), 6, 0, "abcde", 5, 0));
2722     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghij", 0, 0));
2723     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghij", 1, 0));
2724     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghij", 5, 0));
2725     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghij", 9, 0));
2726     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghij", 10, 0));
2727     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 0, 0));
2728     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 1, 0));
2729     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 10, 0));
2730     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 19, 0));
2731     BOOST_TEST(testC(S("abcde"), 6, 0, "abcdefghijklmnopqrst", 20, 0));
2732     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "", 0, 0));
2733     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcde", 0, 0));
2734     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcde", 1, -1));
2735     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcde", 2, -2));
2736     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcde", 4, -4));
2737     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcde", 5, -5));
2738     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghij", 0, 0));
2739     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghij", 1, -1));
2740     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghij", 5, -5));
2741     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghij", 9, -9));
2742     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghij", 10, -10));
2743     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 0, 0));
2744     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 1, -1));
2745     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 10, -10));
2746     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 19, -19));
2747     BOOST_TEST(testC(S("abcdefghij"), 0, 0, "abcdefghijklmnopqrst", 20, -20));
2748     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "", 0, 1));
2749     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcde", 0, 1));
2750     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcde", 1, 0));
2751     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcde", 2, -1));
2752     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcde", 4, -3));
2753     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcde", 5, -4));
2754     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghij", 0, 1));
2755     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghij", 1, 0));
2756     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghij", 5, -4));
2757     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghij", 9, -8));
2758     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghij", 10, -9));
2759     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 0, 1));
2760     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 1, 0));
2761     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 10, -9));
2762     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 19, -18));
2763     BOOST_TEST(testC(S("abcdefghij"), 0, 1, "abcdefghijklmnopqrst", 20, -19));
2764     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "", 0, 5));
2765     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcde", 0, 5));
2766     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcde", 1, 4));
2767     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcde", 2, 3));
2768     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcde", 4, 1));
2769     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcde", 5, 0));
2770     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghij", 0, 5));
2771     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghij", 1, 4));
2772     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghij", 5, 0));
2773     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghij", 9, -4));
2774     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghij", 10, -5));
2775     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 0, 5));
2776     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 1, 4));
2777     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 10, -5));
2778     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 19, -14));
2779     BOOST_TEST(testC(S("abcdefghij"), 0, 5, "abcdefghijklmnopqrst", 20, -15));
2780     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "", 0, 9));
2781     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcde", 0, 9));
2782     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcde", 1, 8));
2783     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcde", 2, 7));
2784     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcde", 4, 5));
2785     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcde", 5, 4));
2786     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghij", 0, 9));
2787     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghij", 1, 8));
2788     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghij", 5, 4));
2789     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghij", 9, 0));
2790     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghij", 10, -1));
2791     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 0, 9));
2792     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 1, 8));
2793     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 10, -1));
2794     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 19, -10));
2795     BOOST_TEST(testC(S("abcdefghij"), 0, 9, "abcdefghijklmnopqrst", 20, -11));
2796     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "", 0, 10));
2797     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcde", 0, 10));
2798     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcde", 1, 9));
2799     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcde", 2, 8));
2800     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcde", 4, 6));
2801     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcde", 5, 5));
2802     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghij", 0, 10));
2803     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghij", 1, 9));
2804     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghij", 5, 5));
2805     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghij", 9, 1));
2806     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghij", 10, 0));
2807     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 0, 10));
2808     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 1, 9));
2809     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 10, 0));
2810     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 19, -9));
2811     BOOST_TEST(testC(S("abcdefghij"), 0, 10, "abcdefghijklmnopqrst", 20, -10));
2812     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "", 0, 10));
2813     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcde", 0, 10));
2814     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcde", 1, 9));
2815     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcde", 2, 8));
2816     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcde", 4, 6));
2817     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcde", 5, 5));
2818     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghij", 0, 10));
2819     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghij", 1, 9));
2820     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghij", 5, 5));
2821     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghij", 9, 1));
2822     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghij", 10, 0));
2823     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 0, 10));
2824     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 1, 9));
2825     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 10, 0));
2826     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 19, -9));
2827     BOOST_TEST(testC(S("abcdefghij"), 0, 11, "abcdefghijklmnopqrst", 20, -10));
2828     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "", 0, 0));
2829     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcde", 0, 0));
2830     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcde", 1, -1));
2831     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcde", 2, -2));
2832     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcde", 4, -4));
2833     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcde", 5, -5));
2834     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghij", 0, 0));
2835     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghij", 1, -1));
2836     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghij", 5, -5));
2837     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghij", 9, -9));
2838     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghij", 10, -10));
2839     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 0, 0));
2840     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 1, -1));
2841     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 10, -10));
2842     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 19, -19));
2843     BOOST_TEST(testC(S("abcdefghij"), 1, 0, "abcdefghijklmnopqrst", 20, -20));
2844     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "", 0, 1));
2845     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcde", 0, 1));
2846     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcde", 1, 1));
2847     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcde", 2, 1));
2848     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcde", 4, 1));
2849     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcde", 5, 1));
2850     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghij", 0, 1));
2851     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghij", 1, 1));
2852     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghij", 5, 1));
2853     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghij", 9, 1));
2854     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghij", 10, 1));
2855     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 0, 1));
2856     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 1, 1));
2857     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 10, 1));
2858     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 19, 1));
2859     BOOST_TEST(testC(S("abcdefghij"), 1, 1, "abcdefghijklmnopqrst", 20, 1));
2860     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "", 0, 4));
2861     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcde", 0, 4));
2862     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcde", 1, 1));
2863     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcde", 2, 1));
2864     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcde", 4, 1));
2865     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcde", 5, 1));
2866     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghij", 0, 4));
2867     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghij", 1, 1));
2868     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghij", 5, 1));
2869     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghij", 9, 1));
2870     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghij", 10, 1));
2871     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 0, 4));
2872     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 1, 1));
2873     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 10, 1));
2874     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 19, 1));
2875     BOOST_TEST(testC(S("abcdefghij"), 1, 4, "abcdefghijklmnopqrst", 20, 1));
2876     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "", 0, 8));
2877     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcde", 0, 8));
2878     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcde", 1, 1));
2879     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcde", 2, 1));
2880     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcde", 4, 1));
2881     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcde", 5, 1));
2882     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghij", 0, 8));
2883     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghij", 1, 1));
2884     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghij", 5, 1));
2885     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghij", 9, 1));
2886     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghij", 10, 1));
2887     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 0, 8));
2888     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 1, 1));
2889     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 10, 1));
2890     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 19, 1));
2891     BOOST_TEST(testC(S("abcdefghij"), 1, 8, "abcdefghijklmnopqrst", 20, 1));
2892     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "", 0, 9));
2893     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcde", 0, 9));
2894     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcde", 1, 1));
2895     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcde", 2, 1));
2896     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcde", 4, 1));
2897     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcde", 5, 1));
2898     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghij", 0, 9));
2899     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghij", 1, 1));
2900     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghij", 5, 1));
2901     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghij", 9, 1));
2902     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghij", 10, 1));
2903     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 0, 9));
2904     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 1, 1));
2905     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 10, 1));
2906     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 19, 1));
2907     BOOST_TEST(testC(S("abcdefghij"), 1, 9, "abcdefghijklmnopqrst", 20, 1));
2908     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "", 0, 9));
2909     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcde", 0, 9));
2910     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcde", 1, 1));
2911     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcde", 2, 1));
2912     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcde", 4, 1));
2913     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcde", 5, 1));
2914     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghij", 0, 9));
2915     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghij", 1, 1));
2916     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghij", 5, 1));
2917     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghij", 9, 1));
2918     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghij", 10, 1));
2919     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 0, 9));
2920     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 1, 1));
2921     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 10, 1));
2922     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 19, 1));
2923     BOOST_TEST(testC(S("abcdefghij"), 1, 10, "abcdefghijklmnopqrst", 20, 1));
2924     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "", 0, 0));
2925     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcde", 0, 0));
2926     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcde", 1, -1));
2927     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcde", 2, -2));
2928     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcde", 4, -4));
2929     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcde", 5, -5));
2930     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghij", 0, 0));
2931     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghij", 1, -1));
2932     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghij", 5, -5));
2933     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghij", 9, -9));
2934     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghij", 10, -10));
2935     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 0, 0));
2936     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 1, -1));
2937     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 10, -10));
2938     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 19, -19));
2939     BOOST_TEST(testC(S("abcdefghij"), 5, 0, "abcdefghijklmnopqrst", 20, -20));
2940     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "", 0, 1));
2941     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcde", 0, 1));
2942     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcde", 1, 5));
2943     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcde", 2, 5));
2944     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcde", 4, 5));
2945     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcde", 5, 5));
2946     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghij", 0, 1));
2947     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghij", 1, 5));
2948     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghij", 5, 5));
2949     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghij", 9, 5));
2950     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghij", 10, 5));
2951     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 0, 1));
2952     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 1, 5));
2953     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 10, 5));
2954     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 19, 5));
2955     BOOST_TEST(testC(S("abcdefghij"), 5, 1, "abcdefghijklmnopqrst", 20, 5));
2956     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "", 0, 2));
2957     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcde", 0, 2));
2958     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcde", 1, 5));
2959     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcde", 2, 5));
2960     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcde", 4, 5));
2961     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcde", 5, 5));
2962     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghij", 0, 2));
2963     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghij", 1, 5));
2964     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghij", 5, 5));
2965     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghij", 9, 5));
2966     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghij", 10, 5));
2967     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 0, 2));
2968     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 1, 5));
2969     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 10, 5));
2970     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 19, 5));
2971     BOOST_TEST(testC(S("abcdefghij"), 5, 2, "abcdefghijklmnopqrst", 20, 5));
2972     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "", 0, 4));
2973     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcde", 0, 4));
2974     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcde", 1, 5));
2975     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcde", 2, 5));
2976     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcde", 4, 5));
2977     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcde", 5, 5));
2978     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghij", 0, 4));
2979     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghij", 1, 5));
2980     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghij", 5, 5));
2981     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghij", 9, 5));
2982     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghij", 10, 5));
2983     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 0, 4));
2984     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 1, 5));
2985     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 10, 5));
2986     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 19, 5));
2987     BOOST_TEST(testC(S("abcdefghij"), 5, 4, "abcdefghijklmnopqrst", 20, 5));
2988     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "", 0, 5));
2989     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcde", 0, 5));
2990     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcde", 1, 5));
2991     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcde", 2, 5));
2992     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcde", 4, 5));
2993     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcde", 5, 5));
2994     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghij", 0, 5));
2995     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghij", 1, 5));
2996     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghij", 5, 5));
2997     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghij", 9, 5));
2998     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghij", 10, 5));
2999     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 0, 5));
3000     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 1, 5));
3001     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 10, 5));
3002     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 19, 5));
3003     BOOST_TEST(testC(S("abcdefghij"), 5, 5, "abcdefghijklmnopqrst", 20, 5));
3004     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "", 0, 5));
3005     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcde", 0, 5));
3006     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcde", 1, 5));
3007     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcde", 2, 5));
3008     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcde", 4, 5));
3009     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcde", 5, 5));
3010     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghij", 0, 5));
3011     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghij", 1, 5));
3012     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghij", 5, 5));
3013     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghij", 9, 5));
3014     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghij", 10, 5));
3015     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 0, 5));
3016     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 1, 5));
3017     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 10, 5));
3018     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 19, 5));
3019     BOOST_TEST(testC(S("abcdefghij"), 5, 6, "abcdefghijklmnopqrst", 20, 5));
3020     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "", 0, 0));
3021     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcde", 0, 0));
3022     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcde", 1, -1));
3023     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcde", 2, -2));
3024     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcde", 4, -4));
3025     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcde", 5, -5));
3026     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghij", 0, 0));
3027     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghij", 1, -1));
3028     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghij", 5, -5));
3029     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghij", 9, -9));
3030     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghij", 10, -10));
3031     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 0, 0));
3032     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 1, -1));
3033     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 10, -10));
3034     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 19, -19));
3035     BOOST_TEST(testC(S("abcdefghij"), 9, 0, "abcdefghijklmnopqrst", 20, -20));
3036     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "", 0, 1));
3037     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcde", 0, 1));
3038     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcde", 1, 9));
3039     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcde", 2, 9));
3040     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcde", 4, 9));
3041     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcde", 5, 9));
3042     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghij", 0, 1));
3043     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghij", 1, 9));
3044     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghij", 5, 9));
3045     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghij", 9, 9));
3046     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghij", 10, 9));
3047     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 0, 1));
3048     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 1, 9));
3049     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 10, 9));
3050     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 19, 9));
3051     BOOST_TEST(testC(S("abcdefghij"), 9, 1, "abcdefghijklmnopqrst", 20, 9));
3052     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "", 0, 1));
3053     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcde", 0, 1));
3054     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcde", 1, 9));
3055     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcde", 2, 9));
3056     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcde", 4, 9));
3057     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcde", 5, 9));
3058     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghij", 0, 1));
3059     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghij", 1, 9));
3060     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghij", 5, 9));
3061     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghij", 9, 9));
3062     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghij", 10, 9));
3063     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 0, 1));
3064     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 1, 9));
3065     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 10, 9));
3066     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 19, 9));
3067     BOOST_TEST(testC(S("abcdefghij"), 9, 2, "abcdefghijklmnopqrst", 20, 9));
3068     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "", 0, 0));
3069     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcde", 0, 0));
3070     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcde", 1, -1));
3071     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcde", 2, -2));
3072     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcde", 4, -4));
3073     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcde", 5, -5));
3074     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghij", 0, 0));
3075     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghij", 1, -1));
3076     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghij", 5, -5));
3077     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghij", 9, -9));
3078     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghij", 10, -10));
3079     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 0, 0));
3080     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 1, -1));
3081     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 10, -10));
3082     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 19, -19));
3083     BOOST_TEST(testC(S("abcdefghij"), 10, 0, "abcdefghijklmnopqrst", 20, -20));
3084     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "", 0, 0));
3085     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcde", 0, 0));
3086     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcde", 1, -1));
3087     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcde", 2, -2));
3088     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcde", 4, -4));
3089     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcde", 5, -5));
3090     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghij", 0, 0));
3091     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghij", 1, -1));
3092     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghij", 5, -5));
3093     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghij", 9, -9));
3094     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghij", 10, -10));
3095     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 0, 0));
3096     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 1, -1));
3097     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 10, -10));
3098     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 19, -19));
3099     BOOST_TEST(testC(S("abcdefghij"), 10, 1, "abcdefghijklmnopqrst", 20, -20));
3100     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "", 0, 0));
3101     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcde", 0, 0));
3102     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcde", 1, 0));
3103     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcde", 2, 0));
3104     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcde", 4, 0));
3105     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcde", 5, 0));
3106     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghij", 0, 0));
3107     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghij", 1, 0));
3108     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghij", 5, 0));
3109     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghij", 9, 0));
3110     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghij", 10, 0));
3111     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 0, 0));
3112     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 1, 0));
3113     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 10, 0));
3114     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 19, 0));
3115     BOOST_TEST(testC(S("abcdefghij"), 11, 0, "abcdefghijklmnopqrst", 20, 0));
3116     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "", 0, 0));
3117     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 0, 0));
3118     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 1, -1));
3119     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 2, -2));
3120     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 4, -4));
3121     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcde", 5, -5));
3122     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 0, 0));
3123     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 1, -1));
3124     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 5, -5));
3125     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 9, -9));
3126     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghij", 10, -10));
3127     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 0, 0));
3128     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 1, -1));
3129     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 10, -10));
3130     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 19, -19));
3131     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 0, "abcdefghijklmnopqrst", 20, -20));
3132     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "", 0, 1));
3133     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 0, 1));
3134     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 1, 0));
3135     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 2, -1));
3136     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 4, -3));
3137     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcde", 5, -4));
3138     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 0, 1));
3139     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 1, 0));
3140     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 5, -4));
3141     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 9, -8));
3142     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghij", 10, -9));
3143     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 0, 1));
3144     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 1, 0));
3145     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 10, -9));
3146     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 19, -18));
3147     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 1, "abcdefghijklmnopqrst", 20, -19));
3148     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "", 0, 10));
3149     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 0, 10));
3150     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 1, 9));
3151     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 2, 8));
3152     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 4, 6));
3153     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcde", 5, 5));
3154     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 0, 10));
3155     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 1, 9));
3156     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 5, 5));
3157     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 9, 1));
3158     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghij", 10, 0));
3159     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 0, 10));
3160     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 1, 9));
3161     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 10, 0));
3162     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 19, -9));
3163     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 10, "abcdefghijklmnopqrst", 20, -10));
3164     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "", 0, 19));
3165     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 0, 19));
3166     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 1, 18));
3167     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 2, 17));
3168     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 4, 15));
3169     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcde", 5, 14));
3170     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 0, 19));
3171     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 1, 18));
3172     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 5, 14));
3173     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 9, 10));
3174     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghij", 10, 9));
3175     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 0, 19));
3176     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 1, 18));
3177     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 10, 9));
3178     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 19, 0));
3179     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 19, "abcdefghijklmnopqrst", 20, -1));
3180     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "", 0, 20));
3181     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 0, 20));
3182     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 1, 19));
3183     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 2, 18));
3184     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 4, 16));
3185     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcde", 5, 15));
3186     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 0, 20));
3187     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 1, 19));
3188     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 5, 15));
3189     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 9, 11));
3190     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghij", 10, 10));
3191     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 0, 20));
3192     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 1, 19));
3193     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 10, 10));
3194     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 19, 1));
3195     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 20, "abcdefghijklmnopqrst", 20, 0));
3196     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "", 0, 20));
3197     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 0, 20));
3198     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 1, 19));
3199     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 2, 18));
3200     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 4, 16));
3201     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcde", 5, 15));
3202     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 0, 20));
3203     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 1, 19));
3204     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 5, 15));
3205     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 9, 11));
3206     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghij", 10, 10));
3207     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 0, 20));
3208     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 1, 19));
3209     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 10, 10));
3210     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 19, 1));
3211     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 0, 21, "abcdefghijklmnopqrst", 20, 0));
3212     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "", 0, 0));
3213     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 0, 0));
3214     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 1, -1));
3215     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 2, -2));
3216     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 4, -4));
3217     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcde", 5, -5));
3218     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 0, 0));
3219     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 1, -1));
3220     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 5, -5));
3221     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 9, -9));
3222     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghij", 10, -10));
3223     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 0, 0));
3224     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 1, -1));
3225     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 10, -10));
3226     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 19, -19));
3227     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 0, "abcdefghijklmnopqrst", 20, -20));
3228     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "", 0, 1));
3229     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 0, 1));
3230     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 1, 1));
3231     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 2, 1));
3232     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 4, 1));
3233     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcde", 5, 1));
3234     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 0, 1));
3235     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 1, 1));
3236     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 5, 1));
3237     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 9, 1));
3238     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghij", 10, 1));
3239     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 0, 1));
3240     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 1, 1));
3241     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 10, 1));
3242     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 19, 1));
3243     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 1, "abcdefghijklmnopqrst", 20, 1));
3244     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "", 0, 9));
3245     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 0, 9));
3246     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 1, 1));
3247     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 2, 1));
3248     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 4, 1));
3249     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcde", 5, 1));
3250     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 0, 9));
3251     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 1, 1));
3252     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 5, 1));
3253     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 9, 1));
3254     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghij", 10, 1));
3255     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 0, 9));
3256     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 1, 1));
3257     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 10, 1));
3258     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 19, 1));
3259     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 9, "abcdefghijklmnopqrst", 20, 1));
3260     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "", 0, 18));
3261     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 0, 18));
3262     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 1, 1));
3263     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 2, 1));
3264     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 4, 1));
3265     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcde", 5, 1));
3266     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 0, 18));
3267     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 1, 1));
3268     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 5, 1));
3269     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 9, 1));
3270     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghij", 10, 1));
3271     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 0, 18));
3272     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 1, 1));
3273     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 10, 1));
3274     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 19, 1));
3275     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 18, "abcdefghijklmnopqrst", 20, 1));
3276     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "", 0, 19));
3277     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 0, 19));
3278     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 1, 1));
3279     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 2, 1));
3280     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 4, 1));
3281     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcde", 5, 1));
3282     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 0, 19));
3283     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 1, 1));
3284     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 5, 1));
3285     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 9, 1));
3286     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghij", 10, 1));
3287     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 0, 19));
3288     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 1, 1));
3289     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 10, 1));
3290     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 19, 1));
3291     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 19, "abcdefghijklmnopqrst", 20, 1));
3292     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "", 0, 19));
3293     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 0, 19));
3294     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 1, 1));
3295     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 2, 1));
3296     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 4, 1));
3297     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcde", 5, 1));
3298     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 0, 19));
3299     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 1, 1));
3300     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 5, 1));
3301     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 9, 1));
3302     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghij", 10, 1));
3303     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 0, 19));
3304     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 1, 1));
3305     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 10, 1));
3306     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 19, 1));
3307     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 1, 20, "abcdefghijklmnopqrst", 20, 1));
3308     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "", 0, 0));
3309     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 0, 0));
3310     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 1, -1));
3311     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 2, -2));
3312     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 4, -4));
3313     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcde", 5, -5));
3314     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 0, 0));
3315     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 1, -1));
3316     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 5, -5));
3317     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 9, -9));
3318     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghij", 10, -10));
3319     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 0, 0));
3320     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 1, -1));
3321     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 10, -10));
3322     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 19, -19));
3323     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 0, "abcdefghijklmnopqrst", 20, -20));
3324     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "", 0, 1));
3325     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 0, 1));
3326     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 1, 10));
3327     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 2, 10));
3328     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 4, 10));
3329     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcde", 5, 10));
3330     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 0, 1));
3331     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 1, 10));
3332     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 5, 10));
3333     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 9, 10));
3334     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghij", 10, 10));
3335     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 0, 1));
3336     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 1, 10));
3337     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 10, 10));
3338     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 19, 10));
3339     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 1, "abcdefghijklmnopqrst", 20, 10));
3340     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "", 0, 5));
3341     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 0, 5));
3342     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 1, 10));
3343     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 2, 10));
3344     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 4, 10));
3345     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcde", 5, 10));
3346     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 0, 5));
3347     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 1, 10));
3348     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 5, 10));
3349     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 9, 10));
3350     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghij", 10, 10));
3351     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 0, 5));
3352     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 1, 10));
3353     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 10, 10));
3354     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 19, 10));
3355     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 5, "abcdefghijklmnopqrst", 20, 10));
3356     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "", 0, 9));
3357     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 0, 9));
3358     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 1, 10));
3359     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 2, 10));
3360     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 4, 10));
3361     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcde", 5, 10));
3362     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 0, 9));
3363     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 1, 10));
3364     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 5, 10));
3365     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 9, 10));
3366     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghij", 10, 10));
3367     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 0, 9));
3368     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 1, 10));
3369     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 10, 10));
3370     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 19, 10));
3371     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 9, "abcdefghijklmnopqrst", 20, 10));
3372     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "", 0, 10));
3373     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 0, 10));
3374     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 1, 10));
3375     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 2, 10));
3376     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 4, 10));
3377     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcde", 5, 10));
3378     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 0, 10));
3379     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 1, 10));
3380     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 5, 10));
3381     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 9, 10));
3382     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghij", 10, 10));
3383     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 0, 10));
3384     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 1, 10));
3385     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 10, 10));
3386     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 19, 10));
3387     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 10, "abcdefghijklmnopqrst", 20, 10));
3388     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "", 0, 10));
3389     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 0, 10));
3390     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 1, 10));
3391     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 2, 10));
3392     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 4, 10));
3393     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcde", 5, 10));
3394     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 0, 10));
3395     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 1, 10));
3396     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 5, 10));
3397     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 9, 10));
3398     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghij", 10, 10));
3399     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 0, 10));
3400     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 1, 10));
3401     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 10, 10));
3402     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 19, 10));
3403     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 10, 11, "abcdefghijklmnopqrst", 20, 10));
3404     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "", 0, 0));
3405     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 0, 0));
3406     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 1, -1));
3407     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 2, -2));
3408     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 4, -4));
3409     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcde", 5, -5));
3410     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 0, 0));
3411     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 1, -1));
3412     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 5, -5));
3413     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 9, -9));
3414     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghij", 10, -10));
3415     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 0, 0));
3416     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 1, -1));
3417     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 10, -10));
3418     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 19, -19));
3419     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 0, "abcdefghijklmnopqrst", 20, -20));
3420     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "", 0, 1));
3421     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 0, 1));
3422     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 1, 19));
3423     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 2, 19));
3424     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 4, 19));
3425     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcde", 5, 19));
3426     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 0, 1));
3427     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 1, 19));
3428     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 5, 19));
3429     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 9, 19));
3430     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghij", 10, 19));
3431     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 0, 1));
3432     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 1, 19));
3433     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 10, 19));
3434     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 19, 19));
3435     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 1, "abcdefghijklmnopqrst", 20, 19));
3436     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "", 0, 1));
3437     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 0, 1));
3438     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 1, 19));
3439     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 2, 19));
3440     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 4, 19));
3441     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcde", 5, 19));
3442     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 0, 1));
3443     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 1, 19));
3444     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 5, 19));
3445     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 9, 19));
3446     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghij", 10, 19));
3447     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 0, 1));
3448     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 1, 19));
3449     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 10, 19));
3450     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 19, 19));
3451     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 19, 2, "abcdefghijklmnopqrst", 20, 19));
3452     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "", 0, 0));
3453     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 0, 0));
3454     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 1, -1));
3455     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 2, -2));
3456     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 4, -4));
3457     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcde", 5, -5));
3458     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 0, 0));
3459     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 1, -1));
3460     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 5, -5));
3461     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 9, -9));
3462     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghij", 10, -10));
3463     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 0, 0));
3464     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 1, -1));
3465     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 10, -10));
3466     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 19, -19));
3467     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 0, "abcdefghijklmnopqrst", 20, -20));
3468     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "", 0, 0));
3469     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 0, 0));
3470     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 1, -1));
3471     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 2, -2));
3472     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 4, -4));
3473     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcde", 5, -5));
3474     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 0, 0));
3475     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 1, -1));
3476     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 5, -5));
3477     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 9, -9));
3478     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghij", 10, -10));
3479     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 0, 0));
3480     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 1, -1));
3481     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 10, -10));
3482     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 19, -19));
3483     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 20, 1, "abcdefghijklmnopqrst", 20, -20));
3484     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "", 0, 0));
3485     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 0, 0));
3486     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 1, 0));
3487     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 2, 0));
3488     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 4, 0));
3489     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcde", 5, 0));
3490     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 0, 0));
3491     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 1, 0));
3492     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 5, 0));
3493     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 9, 0));
3494     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghij", 10, 0));
3495     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 0, 0));
3496     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 1, 0));
3497     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 10, 0));
3498     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 19, 0));
3499     BOOST_TEST(testC(S("abcdefghijklmnopqrst"), 21, 0, "abcdefghijklmnopqrst", 20, 0));
3500 }
3501 
3502 // done
3503 void
testSwap()3504 testSwap()
3505 {
3506     {
3507         static_string<3> s1("123");
3508         static_string<3> s2("XYZ");
3509         swap(s1, s2);
3510         BOOST_TEST(s1 == "XYZ");
3511         BOOST_TEST(*s1.end() == 0);
3512         BOOST_TEST(s2 == "123");
3513         BOOST_TEST(*s2.end() == 0);
3514         static_string<3> s3("UV");
3515         swap(s2, s3);
3516         BOOST_TEST(s2 == "UV");
3517         BOOST_TEST(*s2.end() == 0);
3518         BOOST_TEST(s3 == "123");
3519         BOOST_TEST(*s3.end() == 0);
3520     }
3521     {
3522         static_string<5> s1("123");
3523         static_string<7> s2("XYZ");
3524         swap(s1, s2);
3525         BOOST_TEST(s1 == "XYZ");
3526         BOOST_TEST(*s1.end() == 0);
3527         BOOST_TEST(s2 == "123");
3528         BOOST_TEST(*s2.end() == 0);
3529         static_string<3> s3("UV");
3530         swap(s2, s3);
3531         BOOST_TEST(s2 == "UV");
3532         BOOST_TEST(*s2.end() == 0);
3533         BOOST_TEST(s3 == "123");
3534         BOOST_TEST(*s3.end() == 0);
3535         {
3536             static_string<5> s4("12345");
3537             static_string<3> s5("XYZ");
3538             BOOST_TEST_THROWS(
3539                 (swap(s4, s5)),
3540                 std::length_error);
3541         }
3542         {
3543             static_string<3> s4("XYZ");
3544             static_string<5> s5("12345");
3545             BOOST_TEST_THROWS(
3546                 (swap(s4, s5)),
3547                 std::length_error);
3548         }
3549     }
3550 }
3551 
3552 void
testGeneral()3553 testGeneral()
3554 {
3555     using str1 = static_string<1>;
3556     using str2 = static_string<2>;
3557     {
3558         str1 s1;
3559         BOOST_TEST(s1 == "");
3560         BOOST_TEST(s1.empty());
3561         BOOST_TEST(s1.size() == 0);
3562         BOOST_TEST(s1.max_size() == 1);
3563         BOOST_TEST(s1.capacity() == 1);
3564         BOOST_TEST(s1.begin() == s1.end());
3565         BOOST_TEST(s1.cbegin() == s1.cend());
3566         BOOST_TEST(s1.rbegin() == s1.rend());
3567         BOOST_TEST(s1.crbegin() == s1.crend());
3568         BOOST_TEST_THROWS(
3569             s1.at(0),
3570             std::out_of_range);
3571         BOOST_TEST(s1.data()[0] == 0);
3572         BOOST_TEST(*s1.c_str() == 0);
3573         BOOST_TEST(std::distance(s1.begin(), s1.end()) == 0);
3574         BOOST_TEST(std::distance(s1.cbegin(), s1.cend()) == 0);
3575         BOOST_TEST(std::distance(s1.rbegin(), s1.rend()) == 0);
3576         BOOST_TEST(std::distance(s1.crbegin(), s1.crend()) == 0);
3577         BOOST_TEST(s1.compare(s1) == 0);
3578     }
3579     {
3580         str1 const s1;
3581         BOOST_TEST(s1 == "");
3582         BOOST_TEST(s1.empty());
3583         BOOST_TEST(s1.size() == 0);
3584         BOOST_TEST(s1.max_size() == 1);
3585         BOOST_TEST(s1.capacity() == 1);
3586         BOOST_TEST(s1.begin() == s1.end());
3587         BOOST_TEST(s1.cbegin() == s1.cend());
3588         BOOST_TEST(s1.rbegin() == s1.rend());
3589         BOOST_TEST(s1.crbegin() == s1.crend());
3590         BOOST_TEST_THROWS(
3591             s1.at(0),
3592             std::out_of_range);
3593         BOOST_TEST(s1.data()[0] == 0);
3594         BOOST_TEST(*s1.c_str() == 0);
3595         BOOST_TEST(std::distance(s1.begin(), s1.end()) == 0);
3596         BOOST_TEST(std::distance(s1.cbegin(), s1.cend()) == 0);
3597         BOOST_TEST(std::distance(s1.rbegin(), s1.rend()) == 0);
3598         BOOST_TEST(std::distance(s1.crbegin(), s1.crend()) == 0);
3599         BOOST_TEST(s1.compare(s1) == 0);
3600     }
3601     {
3602         str1 s1;
3603         str1 s2("x");
3604         BOOST_TEST(s2 == "x");
3605         BOOST_TEST(s2[0] == 'x');
3606         BOOST_TEST(s2.at(0) == 'x');
3607         BOOST_TEST(s2.front() == 'x');
3608         BOOST_TEST(s2.back() == 'x');
3609         str1 const s3(s2);
3610         BOOST_TEST(s3 == "x");
3611         BOOST_TEST(s3[0] == 'x');
3612         BOOST_TEST(s3.at(0) == 'x');
3613         BOOST_TEST(s3.front() == 'x');
3614         BOOST_TEST(s3.back() == 'x');
3615         s2 = "y";
3616         BOOST_TEST(s2 == "y");
3617         BOOST_TEST(s3 == "x");
3618         s1 = s2;
3619         BOOST_TEST(s1 == "y");
3620         s1.clear();
3621         BOOST_TEST(s1.empty());
3622         BOOST_TEST(s1.size() == 0);
3623     }
3624     {
3625         str2 s1("x");
3626         str1 s2(s1);
3627         BOOST_TEST(s2 == "x");
3628         str1 s3;
3629         s3 = s2;
3630         BOOST_TEST(s3 == "x");
3631         s1 = "xy";
3632         BOOST_TEST(s1.size() == 2);
3633         BOOST_TEST(s1[0] == 'x');
3634         BOOST_TEST(s1[1] == 'y');
3635         BOOST_TEST(s1.at(0) == 'x');
3636         BOOST_TEST(s1.at(1) == 'y');
3637         BOOST_TEST(s1.front() == 'x');
3638         BOOST_TEST(s1.back() == 'y');
3639         auto const s4 = s1;
3640         BOOST_TEST(s4[0] == 'x');
3641         BOOST_TEST(s4[1] == 'y');
3642         BOOST_TEST(s4.at(0) == 'x');
3643         BOOST_TEST(s4.at(1) == 'y');
3644         BOOST_TEST(s4.front() == 'x');
3645         BOOST_TEST(s4.back() == 'y');
3646         BOOST_TEST_THROWS(
3647             s3 = s1,
3648             std::length_error);
3649         BOOST_TEST_THROWS(
3650             str1{s1},
3651             std::length_error);
3652     }
3653     {
3654         str1 s1("x");
3655         str2 s2;
3656         s2 = s1;
3657         BOOST_TEST_THROWS(
3658             s1.resize(2),
3659             std::length_error);
3660     }
3661     // copy
3662     {
3663       {
3664         static_string<20> str = "helloworld";
3665         char arr[20]{};
3666         BOOST_TEST(str.copy(arr, str.size()) ==
3667           str.size());
3668         BOOST_TEST(str == arr);
3669         BOOST_TEST_THROWS(
3670           str.copy(arr, str.size(), str.size() + 1),
3671           std::out_of_range);
3672       }
3673       {
3674         static_string<20> str = "helloworld";
3675         char arr[20]{};
3676         BOOST_TEST(str.copy(arr, 2, 2) == 2);
3677         BOOST_TEST(arr[0] == 'l' && arr[1] == 'l');
3678       }
3679     }
3680 }
3681 
3682 // done
3683 void
testToStaticString()3684 testToStaticString()
3685 {
3686     BOOST_TEST(testTS(0, "0", L"0", true));
3687     BOOST_TEST(testTS(0u, "0", L"0", true));
3688     BOOST_TEST(testTS(0xffff, "65535", L"65535", true));
3689     BOOST_TEST(testTS(0x10000, "65536", L"65536", true));
3690     BOOST_TEST(testTS(0xffffffff, "4294967295", L"4294967295", true));
3691     BOOST_TEST(testTS(-65535, "-65535", L"-65535", true));
3692     BOOST_TEST(testTS(-65536, "-65536", L"-65536", true));
3693     BOOST_TEST(testTS(-4294967295ll, "-4294967295", L"-4294967295", true));
3694     BOOST_TEST(testTS(1, "1", L"1", true));
3695     BOOST_TEST(testTS(-1, "-1", L"-1", true));
3696     BOOST_TEST(testTS(0.1));
3697     BOOST_TEST(testTS(0.0000001));
3698     BOOST_TEST(testTS(-0.0000001));
3699     BOOST_TEST(testTS(-0.1));
3700     BOOST_TEST(testTS(1234567890.0001));
3701     BOOST_TEST(testTS(1.123456789012345));
3702     BOOST_TEST(testTS(-1234567890.1234));
3703     BOOST_TEST(testTS(-1.123456789012345));
3704 
3705     BOOST_TEST(testTS(std::numeric_limits<long long>::max()));
3706     BOOST_TEST(testTS(std::numeric_limits<long long>::min()));
3707     BOOST_TEST(testTS(std::numeric_limits<unsigned long long>::max()));
3708     BOOST_TEST(testTS(std::numeric_limits<unsigned long long>::max()));
3709     BOOST_TEST(testTS(std::numeric_limits<long double>::min()));
3710     BOOST_TEST(testTS(std::numeric_limits<float>::min()));
3711 
3712     // these tests technically are not portable, but they will work
3713     // 99% of the time.
3714     {
3715       auto str = to_static_string(std::numeric_limits<float>::max());
3716       BOOST_TEST(str.find('e') != static_string<0>::npos || str.find('.') !=
3717         static_string<0>::npos || str == "infinity" || str == "inf");
3718     }
3719     {
3720       auto str = to_static_string(std::numeric_limits<double>::max());
3721       BOOST_TEST(str.find('e') != static_string<0>::npos || str.find('.') !=
3722         static_string<0>::npos || str == "infinity" || str == "inf");
3723     }
3724     {
3725       auto str = to_static_string(std::numeric_limits<long double>::max());
3726       BOOST_TEST(str.find('e') != static_string<0>::npos || str.find('.') !=
3727         static_string<0>::npos || str == "infinity" || str == "inf");
3728     }
3729     {
3730       auto str = to_static_wstring(std::numeric_limits<float>::max());
3731       BOOST_TEST(str.find('e') != static_string<0>::npos || str.find('.') !=
3732         static_string<0>::npos || str == L"infinity" || str == L"inf");
3733     }
3734     {
3735       auto str = to_static_wstring(std::numeric_limits<double>::max());
3736       BOOST_TEST(str.find('e') != static_string<0>::npos || str.find('.') !=
3737         static_string<0>::npos || str == L"infinity" || str == L"inf");
3738     }
3739     {
3740       auto str = to_static_wstring(std::numeric_limits<long double>::max());
3741       BOOST_TEST(str.find('e') != static_string<0>::npos || str.find('.') !=
3742         static_string<0>::npos || str == L"infinity" || str == L"inf");
3743     }
3744 }
3745 
3746 // done
3747 void
testFind()3748 testFind()
3749 {
3750   const char* cs1 = "12345";
3751   const char* cs2 = "2345";
3752   string_view v1 = cs1;
3753   string_view v2 = cs2;
3754   static_string<5> fs1 = cs1;
3755   static_string<4> fs2 = cs2;
3756   using S = static_string<400>;
3757 
3758 
3759   // find
3760   BOOST_TEST(fs1.find(v1) == 0);
3761   BOOST_TEST(fs1.find(v2) == 1);
3762   BOOST_TEST(fs1.find(fs1) == 0);
3763   BOOST_TEST(fs1.find(fs2) == 1);
3764 
3765   BOOST_TEST(fs1.find(cs1) == 0);
3766   BOOST_TEST(fs1.find(cs2) == 1);
3767 
3768   BOOST_TEST(fs1.find(cs1, 0) == 0);
3769   BOOST_TEST(fs1.find(cs2, 0) == 1);
3770 
3771   BOOST_TEST(fs1.find(cs2, 0, 2) == 1);
3772 
3773   BOOST_TEST(fs1.find(cs1, 4) == S::npos);
3774   BOOST_TEST(fs1.find(cs2, 4) == S::npos);
3775 
3776   BOOST_TEST(fs1.find('1') == 0);
3777   BOOST_TEST(fs1.find('1', 4) == S::npos);
3778 
3779   BOOST_TEST(testF(S(""), "", 0, 0, 0));
3780   BOOST_TEST(testF(S(""), "abcde", 0, 0, 0));
3781   BOOST_TEST(testF(S(""), "abcde", 0, 1, S::npos));
3782   BOOST_TEST(testF(S(""), "abcde", 0, 2, S::npos));
3783   BOOST_TEST(testF(S(""), "abcde", 0, 4, S::npos));
3784   BOOST_TEST(testF(S(""), "abcde", 0, 5, S::npos));
3785   BOOST_TEST(testF(S(""), "abcdeabcde", 0, 0, 0));
3786   BOOST_TEST(testF(S(""), "abcdeabcde", 0, 1, S::npos));
3787   BOOST_TEST(testF(S(""), "abcdeabcde", 0, 5, S::npos));
3788   BOOST_TEST(testF(S(""), "abcdeabcde", 0, 9, S::npos));
3789   BOOST_TEST(testF(S(""), "abcdeabcde", 0, 10, S::npos));
3790   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 0, 0, 0));
3791   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 0, 1, S::npos));
3792   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 0, 10, S::npos));
3793   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 0, 19, S::npos));
3794   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 0, 20, S::npos));
3795   BOOST_TEST(testF(S(""), "", 1, 0, S::npos));
3796   BOOST_TEST(testF(S(""), "abcde", 1, 0, S::npos));
3797   BOOST_TEST(testF(S(""), "abcde", 1, 1, S::npos));
3798   BOOST_TEST(testF(S(""), "abcde", 1, 2, S::npos));
3799   BOOST_TEST(testF(S(""), "abcde", 1, 4, S::npos));
3800   BOOST_TEST(testF(S(""), "abcde", 1, 5, S::npos));
3801   BOOST_TEST(testF(S(""), "abcdeabcde", 1, 0, S::npos));
3802   BOOST_TEST(testF(S(""), "abcdeabcde", 1, 1, S::npos));
3803   BOOST_TEST(testF(S(""), "abcdeabcde", 1, 5, S::npos));
3804   BOOST_TEST(testF(S(""), "abcdeabcde", 1, 9, S::npos));
3805   BOOST_TEST(testF(S(""), "abcdeabcde", 1, 10, S::npos));
3806   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 1, 0, S::npos));
3807   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 1, 1, S::npos));
3808   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 1, 10, S::npos));
3809   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 1, 19, S::npos));
3810   BOOST_TEST(testF(S(""), "abcdeabcdeabcdeabcde", 1, 20, S::npos));
3811   BOOST_TEST(testF(S("abcde"), "", 0, 0, 0));
3812   BOOST_TEST(testF(S("abcde"), "abcde", 0, 0, 0));
3813   BOOST_TEST(testF(S("abcde"), "abcde", 0, 1, 0));
3814   BOOST_TEST(testF(S("abcde"), "abcde", 0, 2, 0));
3815   BOOST_TEST(testF(S("abcde"), "abcde", 0, 4, 0));
3816   BOOST_TEST(testF(S("abcde"), "abcde", 0, 5, 0));
3817   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 0, 0, 0));
3818   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 0, 1, 0));
3819   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 0, 5, 0));
3820   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 0, 9, S::npos));
3821   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 0, 10, S::npos));
3822   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 0, 0));
3823   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 1, 0));
3824   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 10, S::npos));
3825   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 19, S::npos));
3826   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 20, S::npos));
3827   BOOST_TEST(testF(S("abcde"), "", 1, 0, 1));
3828   BOOST_TEST(testF(S("abcde"), "abcde", 1, 0, 1));
3829   BOOST_TEST(testF(S("abcde"), "abcde", 1, 1, S::npos));
3830   BOOST_TEST(testF(S("abcde"), "abcde", 1, 2, S::npos));
3831   BOOST_TEST(testF(S("abcde"), "abcde", 1, 4, S::npos));
3832   BOOST_TEST(testF(S("abcde"), "abcde", 1, 5, S::npos));
3833   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 1, 0, 1));
3834   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 1, 1, S::npos));
3835   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 1, 5, S::npos));
3836   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 1, 9, S::npos));
3837   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 1, 10, S::npos));
3838   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 0, 1));
3839   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 1, S::npos));
3840   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 10, S::npos));
3841   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos));
3842   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos));
3843   BOOST_TEST(testF(S("abcde"), "", 2, 0, 2));
3844   BOOST_TEST(testF(S("abcde"), "abcde", 2, 0, 2));
3845   BOOST_TEST(testF(S("abcde"), "abcde", 2, 1, S::npos));
3846   BOOST_TEST(testF(S("abcde"), "abcde", 2, 2, S::npos));
3847   BOOST_TEST(testF(S("abcde"), "abcde", 2, 4, S::npos));
3848   BOOST_TEST(testF(S("abcde"), "abcde", 2, 5, S::npos));
3849   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 2, 0, 2));
3850   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 2, 1, S::npos));
3851   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 2, 5, S::npos));
3852   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 2, 9, S::npos));
3853   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 2, 10, S::npos));
3854   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 0, 2));
3855   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 1, S::npos));
3856   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 10, S::npos));
3857   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 19, S::npos));
3858   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 20, S::npos));
3859   BOOST_TEST(testF(S("abcde"), "", 4, 0, 4));
3860   BOOST_TEST(testF(S("abcde"), "abcde", 4, 0, 4));
3861   BOOST_TEST(testF(S("abcde"), "abcde", 4, 1, S::npos));
3862   BOOST_TEST(testF(S("abcde"), "abcde", 4, 2, S::npos));
3863   BOOST_TEST(testF(S("abcde"), "abcde", 4, 4, S::npos));
3864   BOOST_TEST(testF(S("abcde"), "abcde", 4, 5, S::npos));
3865   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 4, 0, 4));
3866   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 4, 1, S::npos));
3867   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 4, 5, S::npos));
3868   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 4, 9, S::npos));
3869   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 4, 10, S::npos));
3870   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 0, 4));
3871   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 1, S::npos));
3872   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 10, S::npos));
3873   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 19, S::npos));
3874   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 20, S::npos));
3875   BOOST_TEST(testF(S("abcde"), "", 5, 0, 5));
3876   BOOST_TEST(testF(S("abcde"), "abcde", 5, 0, 5));
3877   BOOST_TEST(testF(S("abcde"), "abcde", 5, 1, S::npos));
3878   BOOST_TEST(testF(S("abcde"), "abcde", 5, 2, S::npos));
3879   BOOST_TEST(testF(S("abcde"), "abcde", 5, 4, S::npos));
3880   BOOST_TEST(testF(S("abcde"), "abcde", 5, 5, S::npos));
3881   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 5, 0, 5));
3882   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 5, 1, S::npos));
3883   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 5, 5, S::npos));
3884   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 5, 9, S::npos));
3885   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 5, 10, S::npos));
3886   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 0, 5));
3887   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 1, S::npos));
3888   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 10, S::npos));
3889   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 19, S::npos));
3890   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 20, S::npos));
3891   BOOST_TEST(testF(S("abcde"), "", 6, 0, S::npos));
3892   BOOST_TEST(testF(S("abcde"), "abcde", 6, 0, S::npos));
3893   BOOST_TEST(testF(S("abcde"), "abcde", 6, 1, S::npos));
3894   BOOST_TEST(testF(S("abcde"), "abcde", 6, 2, S::npos));
3895   BOOST_TEST(testF(S("abcde"), "abcde", 6, 4, S::npos));
3896   BOOST_TEST(testF(S("abcde"), "abcde", 6, 5, S::npos));
3897   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 6, 0, S::npos));
3898   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 6, 1, S::npos));
3899   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 6, 5, S::npos));
3900   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 6, 9, S::npos));
3901   BOOST_TEST(testF(S("abcde"), "abcdeabcde", 6, 10, S::npos));
3902   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 0, S::npos));
3903   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 1, S::npos));
3904   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 10, S::npos));
3905   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 19, S::npos));
3906   BOOST_TEST(testF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 20, S::npos));
3907   BOOST_TEST(testF(S("abcdeabcde"), "", 0, 0, 0));
3908   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 0, 0, 0));
3909   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 0, 1, 0));
3910   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 0, 2, 0));
3911   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 0, 4, 0));
3912   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 0, 5, 0));
3913   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 0, 0, 0));
3914   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 0, 1, 0));
3915   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 0, 5, 0));
3916   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 0, 9, 0));
3917   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 0, 10, 0));
3918   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0, 0));
3919   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 1, 0));
3920   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 10, 0));
3921   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 19, S::npos));
3922   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 20, S::npos));
3923   BOOST_TEST(testF(S("abcdeabcde"), "", 1, 0, 1));
3924   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 1, 0, 1));
3925   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 1, 1, 5));
3926   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 1, 2, 5));
3927   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 1, 4, 5));
3928   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 1, 5, 5));
3929   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 1, 0, 1));
3930   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 1, 1, 5));
3931   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 1, 5, 5));
3932   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 1, 9, S::npos));
3933   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 1, 10, S::npos));
3934   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 0, 1));
3935   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 1, 5));
3936   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 10, S::npos));
3937   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos));
3938   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos));
3939   BOOST_TEST(testF(S("abcdeabcde"), "", 5, 0, 5));
3940   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 5, 0, 5));
3941   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 5, 1, 5));
3942   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 5, 2, 5));
3943   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 5, 4, 5));
3944   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 5, 5, 5));
3945   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 5, 0, 5));
3946   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 5, 1, 5));
3947   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 5, 5, 5));
3948   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 5, 9, S::npos));
3949   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 5, 10, S::npos));
3950   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 0, 5));
3951   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 1, 5));
3952   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 10, S::npos));
3953   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 19, S::npos));
3954   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 20, S::npos));
3955   BOOST_TEST(testF(S("abcdeabcde"), "", 9, 0, 9));
3956   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 9, 0, 9));
3957   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 9, 1, S::npos));
3958   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 9, 2, S::npos));
3959   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 9, 4, S::npos));
3960   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 9, 5, S::npos));
3961   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 9, 0, 9));
3962   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 9, 1, S::npos));
3963   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 9, 5, S::npos));
3964   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 9, 9, S::npos));
3965   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 9, 10, S::npos));
3966   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 0, 9));
3967   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 1, S::npos));
3968   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 10, S::npos));
3969   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 19, S::npos));
3970   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 20, S::npos));
3971   BOOST_TEST(testF(S("abcdeabcde"), "", 10, 0, 10));
3972   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 10, 0, 10));
3973   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 10, 1, S::npos));
3974   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 10, 2, S::npos));
3975   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 10, 4, S::npos));
3976   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 10, 5, S::npos));
3977   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 10, 0, 10));
3978   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 10, 1, S::npos));
3979   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 10, 5, S::npos));
3980   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 10, 9, S::npos));
3981   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 10, 10, S::npos));
3982   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 0, 10));
3983   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 1, S::npos));
3984   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 10, S::npos));
3985   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 19, S::npos));
3986   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 20, S::npos));
3987   BOOST_TEST(testF(S("abcdeabcde"), "", 11, 0, S::npos));
3988   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 11, 0, S::npos));
3989   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 11, 1, S::npos));
3990   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 11, 2, S::npos));
3991   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 11, 4, S::npos));
3992   BOOST_TEST(testF(S("abcdeabcde"), "abcde", 11, 5, S::npos));
3993   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 11, 0, S::npos));
3994   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 11, 1, S::npos));
3995   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 11, 5, S::npos));
3996   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 11, 9, S::npos));
3997   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcde", 11, 10, S::npos));
3998   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 0, S::npos));
3999   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 1, S::npos));
4000   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 10, S::npos));
4001   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 19, S::npos));
4002   BOOST_TEST(testF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 20, S::npos));
4003   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "", 0, 0, 0));
4004   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 0, 0));
4005   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 1, 0));
4006   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 2, 0));
4007   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 4, 0));
4008   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 5, 0));
4009   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 0, 0));
4010   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 1, 0));
4011   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 5, 0));
4012   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 9, 0));
4013   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 10, 0));
4014   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0, 0));
4015   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 1, 0));
4016   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 10, 0));
4017   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 19, 0));
4018   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 20, 0));
4019   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "", 1, 0, 1));
4020   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 0, 1));
4021   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 1, 5));
4022   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 2, 5));
4023   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 4, 5));
4024   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 5, 5));
4025   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 0, 1));
4026   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 1, 5));
4027   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 5, 5));
4028   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 9, 5));
4029   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 10, 5));
4030   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 0, 1));
4031   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 1, 5));
4032   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 10, 5));
4033   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos));
4034   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos));
4035   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "", 10, 0, 10));
4036   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 0, 10));
4037   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 1, 10));
4038   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 2, 10));
4039   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 4, 10));
4040   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 5, 10));
4041   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 0, 10));
4042   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 1, 10));
4043   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 5, 10));
4044   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 9, 10));
4045   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 10, 10));
4046   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 0, 10));
4047   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 1, 10));
4048   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 10, 10));
4049   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 19, S::npos));
4050   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 20, S::npos));
4051   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "", 19, 0, 19));
4052   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 0, 19));
4053   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 1, S::npos));
4054   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 2, S::npos));
4055   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 4, S::npos));
4056   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 5, S::npos));
4057   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 0, 19));
4058   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 1, S::npos));
4059   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 5, S::npos));
4060   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 9, S::npos));
4061   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 10, S::npos));
4062   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 0, 19));
4063   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 1, S::npos));
4064   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 10, S::npos));
4065   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 19, S::npos));
4066   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 20, S::npos));
4067   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "", 20, 0, 20));
4068   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 0, 20));
4069   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 1, S::npos));
4070   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 2, S::npos));
4071   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 4, S::npos));
4072   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 5, S::npos));
4073   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 0, 20));
4074   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 1, S::npos));
4075   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 5, S::npos));
4076   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 9, S::npos));
4077   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 10, S::npos));
4078   BOOST_TEST(testF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 0, 20));
4079 
4080   // rfind
4081 
4082   BOOST_TEST(fs1.rfind(v1) == 0);
4083   BOOST_TEST(fs1.rfind(v2) == 1);
4084 
4085   BOOST_TEST(fs1.rfind(fs1) == 0);
4086   BOOST_TEST(fs1.rfind(fs2) == 1);
4087 
4088   BOOST_TEST(fs1.rfind(cs1) == 0);
4089   BOOST_TEST(fs1.rfind(cs2) == 1);
4090 
4091   BOOST_TEST(fs1.rfind(cs1, 0) == 0);
4092   BOOST_TEST(fs1.rfind(cs2, 0) == S::npos);
4093 
4094   BOOST_TEST(fs1.rfind(cs2, 0, 2) == S::npos);
4095   BOOST_TEST(fs1.rfind(cs1, 4) == 0);
4096 
4097   BOOST_TEST(fs1.rfind('1') == 0);
4098   BOOST_TEST(fs1.rfind('1', 4) == 0);
4099 
4100 
4101   BOOST_TEST(testRF(S(""), "", 0, 0, 0));
4102   BOOST_TEST(testRF(S(""), "abcde", 0, 0, 0));
4103   BOOST_TEST(testRF(S(""), "abcde", 0, 1, S::npos));
4104   BOOST_TEST(testRF(S(""), "abcde", 0, 2, S::npos));
4105   BOOST_TEST(testRF(S(""), "abcde", 0, 4, S::npos));
4106   BOOST_TEST(testRF(S(""), "abcde", 0, 5, S::npos));
4107   BOOST_TEST(testRF(S(""), "abcdeabcde", 0, 0, 0));
4108   BOOST_TEST(testRF(S(""), "abcdeabcde", 0, 1, S::npos));
4109   BOOST_TEST(testRF(S(""), "abcdeabcde", 0, 5, S::npos));
4110   BOOST_TEST(testRF(S(""), "abcdeabcde", 0, 9, S::npos));
4111   BOOST_TEST(testRF(S(""), "abcdeabcde", 0, 10, S::npos));
4112   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 0, 0, 0));
4113   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 0, 1, S::npos));
4114   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 0, 10, S::npos));
4115   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 0, 19, S::npos));
4116   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 0, 20, S::npos));
4117   BOOST_TEST(testRF(S(""), "", 1, 0, 0));
4118   BOOST_TEST(testRF(S(""), "abcde", 1, 0, 0));
4119   BOOST_TEST(testRF(S(""), "abcde", 1, 1, S::npos));
4120   BOOST_TEST(testRF(S(""), "abcde", 1, 2, S::npos));
4121   BOOST_TEST(testRF(S(""), "abcde", 1, 4, S::npos));
4122   BOOST_TEST(testRF(S(""), "abcde", 1, 5, S::npos));
4123   BOOST_TEST(testRF(S(""), "abcdeabcde", 1, 0, 0));
4124   BOOST_TEST(testRF(S(""), "abcdeabcde", 1, 1, S::npos));
4125   BOOST_TEST(testRF(S(""), "abcdeabcde", 1, 5, S::npos));
4126   BOOST_TEST(testRF(S(""), "abcdeabcde", 1, 9, S::npos));
4127   BOOST_TEST(testRF(S(""), "abcdeabcde", 1, 10, S::npos));
4128   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 1, 0, 0));
4129   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 1, 1, S::npos));
4130   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 1, 10, S::npos));
4131   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 1, 19, S::npos));
4132   BOOST_TEST(testRF(S(""), "abcdeabcdeabcdeabcde", 1, 20, S::npos));
4133   BOOST_TEST(testRF(S("abcde"), "", 0, 0, 0));
4134   BOOST_TEST(testRF(S("abcde"), "abcde", 0, 0, 0));
4135   BOOST_TEST(testRF(S("abcde"), "abcde", 0, 1, 0));
4136   BOOST_TEST(testRF(S("abcde"), "abcde", 0, 2, 0));
4137   BOOST_TEST(testRF(S("abcde"), "abcde", 0, 4, 0));
4138   BOOST_TEST(testRF(S("abcde"), "abcde", 0, 5, 0));
4139   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 0, 0, 0));
4140   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 0, 1, 0));
4141   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 0, 5, 0));
4142   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 0, 9, S::npos));
4143   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 0, 10, S::npos));
4144   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 0, 0));
4145   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 1, 0));
4146   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 10, S::npos));
4147   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 19, S::npos));
4148   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 0, 20, S::npos));
4149   BOOST_TEST(testRF(S("abcde"), "", 1, 0, 1));
4150   BOOST_TEST(testRF(S("abcde"), "abcde", 1, 0, 1));
4151   BOOST_TEST(testRF(S("abcde"), "abcde", 1, 1, 0));
4152   BOOST_TEST(testRF(S("abcde"), "abcde", 1, 2, 0));
4153   BOOST_TEST(testRF(S("abcde"), "abcde", 1, 4, 0));
4154   BOOST_TEST(testRF(S("abcde"), "abcde", 1, 5, 0));
4155   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 1, 0, 1));
4156   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 1, 1, 0));
4157   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 1, 5, 0));
4158   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 1, 9, S::npos));
4159   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 1, 10, S::npos));
4160   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 0, 1));
4161   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 1, 0));
4162   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 10, S::npos));
4163   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos));
4164   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos));
4165   BOOST_TEST(testRF(S("abcde"), "", 2, 0, 2));
4166   BOOST_TEST(testRF(S("abcde"), "abcde", 2, 0, 2));
4167   BOOST_TEST(testRF(S("abcde"), "abcde", 2, 1, 0));
4168   BOOST_TEST(testRF(S("abcde"), "abcde", 2, 2, 0));
4169   BOOST_TEST(testRF(S("abcde"), "abcde", 2, 4, 0));
4170   BOOST_TEST(testRF(S("abcde"), "abcde", 2, 5, 0));
4171   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 2, 0, 2));
4172   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 2, 1, 0));
4173   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 2, 5, 0));
4174   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 2, 9, S::npos));
4175   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 2, 10, S::npos));
4176   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 0, 2));
4177   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 1, 0));
4178   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 10, S::npos));
4179   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 19, S::npos));
4180   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 2, 20, S::npos));
4181   BOOST_TEST(testRF(S("abcde"), "", 4, 0, 4));
4182   BOOST_TEST(testRF(S("abcde"), "abcde", 4, 0, 4));
4183   BOOST_TEST(testRF(S("abcde"), "abcde", 4, 1, 0));
4184   BOOST_TEST(testRF(S("abcde"), "abcde", 4, 2, 0));
4185   BOOST_TEST(testRF(S("abcde"), "abcde", 4, 4, 0));
4186   BOOST_TEST(testRF(S("abcde"), "abcde", 4, 5, 0));
4187   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 4, 0, 4));
4188   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 4, 1, 0));
4189   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 4, 5, 0));
4190   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 4, 9, S::npos));
4191   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 4, 10, S::npos));
4192   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 0, 4));
4193   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 1, 0));
4194   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 10, S::npos));
4195   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 19, S::npos));
4196   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 4, 20, S::npos));
4197   BOOST_TEST(testRF(S("abcde"), "", 5, 0, 5));
4198   BOOST_TEST(testRF(S("abcde"), "abcde", 5, 0, 5));
4199   BOOST_TEST(testRF(S("abcde"), "abcde", 5, 1, 0));
4200   BOOST_TEST(testRF(S("abcde"), "abcde", 5, 2, 0));
4201   BOOST_TEST(testRF(S("abcde"), "abcde", 5, 4, 0));
4202   BOOST_TEST(testRF(S("abcde"), "abcde", 5, 5, 0));
4203   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 5, 0, 5));
4204   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 5, 1, 0));
4205   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 5, 5, 0));
4206   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 5, 9, S::npos));
4207   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 5, 10, S::npos));
4208   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 0, 5));
4209   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 1, 0));
4210   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 10, S::npos));
4211   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 19, S::npos));
4212   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 5, 20, S::npos));
4213   BOOST_TEST(testRF(S("abcde"), "", 6, 0, 5));
4214   BOOST_TEST(testRF(S("abcde"), "abcde", 6, 0, 5));
4215   BOOST_TEST(testRF(S("abcde"), "abcde", 6, 1, 0));
4216   BOOST_TEST(testRF(S("abcde"), "abcde", 6, 2, 0));
4217   BOOST_TEST(testRF(S("abcde"), "abcde", 6, 4, 0));
4218   BOOST_TEST(testRF(S("abcde"), "abcde", 6, 5, 0));
4219   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 6, 0, 5));
4220   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 6, 1, 0));
4221   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 6, 5, 0));
4222   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 6, 9, S::npos));
4223   BOOST_TEST(testRF(S("abcde"), "abcdeabcde", 6, 10, S::npos));
4224   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 0, 5));
4225   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 1, 0));
4226   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 10, S::npos));
4227   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 19, S::npos));
4228   BOOST_TEST(testRF(S("abcde"), "abcdeabcdeabcdeabcde", 6, 20, S::npos));
4229   BOOST_TEST(testRF(S("abcdeabcde"), "", 0, 0, 0));
4230   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 0, 0, 0));
4231   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 0, 1, 0));
4232   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 0, 2, 0));
4233   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 0, 4, 0));
4234   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 0, 5, 0));
4235   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 0, 0, 0));
4236   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 0, 1, 0));
4237   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 0, 5, 0));
4238   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 0, 9, 0));
4239   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 0, 10, 0));
4240   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0, 0));
4241   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 1, 0));
4242   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 10, 0));
4243   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 19, S::npos));
4244   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 20, S::npos));
4245   BOOST_TEST(testRF(S("abcdeabcde"), "", 1, 0, 1));
4246   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 1, 0, 1));
4247   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 1, 1, 0));
4248   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 1, 2, 0));
4249   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 1, 4, 0));
4250   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 1, 5, 0));
4251   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 1, 0, 1));
4252   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 1, 1, 0));
4253   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 1, 5, 0));
4254   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 1, 9, 0));
4255   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 1, 10, 0));
4256   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 0, 1));
4257   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 1, 0));
4258   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 10, 0));
4259   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos));
4260   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos));
4261   BOOST_TEST(testRF(S("abcdeabcde"), "", 5, 0, 5));
4262   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 5, 0, 5));
4263   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 5, 1, 5));
4264   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 5, 2, 5));
4265   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 5, 4, 5));
4266   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 5, 5, 5));
4267   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 5, 0, 5));
4268   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 5, 1, 5));
4269   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 5, 5, 5));
4270   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 5, 9, 0));
4271   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 5, 10, 0));
4272   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 0, 5));
4273   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 1, 5));
4274   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 10, 0));
4275   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 19, S::npos));
4276   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 20, S::npos));
4277   BOOST_TEST(testRF(S("abcdeabcde"), "", 9, 0, 9));
4278   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 9, 0, 9));
4279   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 9, 1, 5));
4280   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 9, 2, 5));
4281   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 9, 4, 5));
4282   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 9, 5, 5));
4283   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 9, 0, 9));
4284   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 9, 1, 5));
4285   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 9, 5, 5));
4286   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 9, 9, 0));
4287   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 9, 10, 0));
4288   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 0, 9));
4289   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 1, 5));
4290   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 10, 0));
4291   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 19, S::npos));
4292   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 20, S::npos));
4293   BOOST_TEST(testRF(S("abcdeabcde"), "", 10, 0, 10));
4294   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 10, 0, 10));
4295   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 10, 1, 5));
4296   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 10, 2, 5));
4297   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 10, 4, 5));
4298   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 10, 5, 5));
4299   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 10, 0, 10));
4300   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 10, 1, 5));
4301   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 10, 5, 5));
4302   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 10, 9, 0));
4303   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 10, 10, 0));
4304   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 0, 10));
4305   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 1, 5));
4306   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 10, 0));
4307   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 19, S::npos));
4308   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 20, S::npos));
4309   BOOST_TEST(testRF(S("abcdeabcde"), "", 11, 0, 10));
4310   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 11, 0, 10));
4311   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 11, 1, 5));
4312   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 11, 2, 5));
4313   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 11, 4, 5));
4314   BOOST_TEST(testRF(S("abcdeabcde"), "abcde", 11, 5, 5));
4315   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 11, 0, 10));
4316   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 11, 1, 5));
4317   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 11, 5, 5));
4318   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 11, 9, 0));
4319   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcde", 11, 10, 0));
4320   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 0, 10));
4321   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 1, 5));
4322   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 10, 0));
4323   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 19, S::npos));
4324   BOOST_TEST(testRF(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 20, S::npos));
4325   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "", 0, 0, 0));
4326   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 0, 0));
4327   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 1, 0));
4328   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 2, 0));
4329   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 4, 0));
4330   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 0, 5, 0));
4331   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 0, 0));
4332   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 1, 0));
4333   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 5, 0));
4334   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 9, 0));
4335   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 10, 0));
4336   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0, 0));
4337   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 1, 0));
4338   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 10, 0));
4339   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 19, 0));
4340   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 20, 0));
4341   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "", 1, 0, 1));
4342   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 0, 1));
4343   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 1, 0));
4344   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 2, 0));
4345   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 4, 0));
4346   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 1, 5, 0));
4347   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 0, 1));
4348   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 1, 0));
4349   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 5, 0));
4350   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 9, 0));
4351   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 10, 0));
4352   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 0, 1));
4353   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 1, 0));
4354   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 10, 0));
4355   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 19, 0));
4356   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 20, 0));
4357   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "", 10, 0, 10));
4358   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 0, 10));
4359   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 1, 10));
4360   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 2, 10));
4361   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 4, 10));
4362   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 10, 5, 10));
4363   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 0, 10));
4364   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 1, 10));
4365   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 5, 10));
4366   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 9, 10));
4367   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 10, 10));
4368   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 0, 10));
4369   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 1, 10));
4370   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 10, 10));
4371   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 19, 0));
4372   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 20, 0));
4373   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "", 19, 0, 19));
4374   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 0, 19));
4375   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 1, 15));
4376   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 2, 15));
4377   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 4, 15));
4378   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 19, 5, 15));
4379   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 0, 19));
4380   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 1, 15));
4381   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 5, 15));
4382   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 9, 10));
4383   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 10, 10));
4384   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 0, 19));
4385   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 1, 15));
4386   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 10, 10));
4387   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 19, 0));
4388   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 20, 0));
4389   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "", 20, 0, 20));
4390   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 0, 20));
4391   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 1, 15));
4392   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 2, 15));
4393   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 4, 15));
4394   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcde", 20, 5, 15));
4395   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 0, 20));
4396   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 1, 15));
4397   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 5, 15));
4398   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 9, 10));
4399   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 10, 10));
4400   BOOST_TEST(testRF(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 0, 20));
4401 
4402   // find_first_of
4403 
4404   BOOST_TEST(fs1.find_first_of(v1) == 0);
4405   BOOST_TEST(fs1.find_first_of(v2) == 1);
4406   BOOST_TEST(fs1.find_first_of(fs1) == 0);
4407   BOOST_TEST(fs1.find_first_of(fs2) == 1);
4408 
4409   BOOST_TEST(fs1.find_first_of(cs1) == 0);
4410   BOOST_TEST(fs1.find_first_of(cs2) == 1);
4411 
4412   BOOST_TEST(fs1.find_first_of(cs1, 0) == 0);
4413   BOOST_TEST(fs1.find_first_of(cs2, 0) == 1);
4414 
4415   BOOST_TEST(fs1.find_first_of(cs2, 0, 2) == 1);
4416 
4417   BOOST_TEST(fs1.find_first_of(cs1, 4) == 4);
4418   BOOST_TEST(fs1.find_first_of(cs2, 4) == 4);
4419 
4420   BOOST_TEST(fs1.find_first_of('1') == 0);
4421   BOOST_TEST(fs1.find_first_of('1', 4) == S::npos);
4422 
4423   BOOST_TEST(testFF(S(""), "", 0, 0, S::npos));
4424   BOOST_TEST(testFF(S(""), "irkhs", 0, 0, S::npos));
4425   BOOST_TEST(testFF(S(""), "kante", 0, 1, S::npos));
4426   BOOST_TEST(testFF(S(""), "oknlr", 0, 2, S::npos));
4427   BOOST_TEST(testFF(S(""), "pcdro", 0, 4, S::npos));
4428   BOOST_TEST(testFF(S(""), "bnrpe", 0, 5, S::npos));
4429   BOOST_TEST(testFF(S(""), "jtdaefblso", 0, 0, S::npos));
4430   BOOST_TEST(testFF(S(""), "oselktgbca", 0, 1, S::npos));
4431   BOOST_TEST(testFF(S(""), "eqgaplhckj", 0, 5, S::npos));
4432   BOOST_TEST(testFF(S(""), "bjahtcmnlp", 0, 9, S::npos));
4433   BOOST_TEST(testFF(S(""), "hjlcmgpket", 0, 10, S::npos));
4434   BOOST_TEST(testFF(S(""), "htaobedqikfplcgjsmrn", 0, 0, S::npos));
4435   BOOST_TEST(testFF(S(""), "hpqiarojkcdlsgnmfetb", 0, 1, S::npos));
4436   BOOST_TEST(testFF(S(""), "dfkaprhjloqetcsimnbg", 0, 10, S::npos));
4437   BOOST_TEST(testFF(S(""), "ihqrfebgadntlpmjksoc", 0, 19, S::npos));
4438   BOOST_TEST(testFF(S(""), "ngtjfcalbseiqrphmkdo", 0, 20, S::npos));
4439   BOOST_TEST(testFF(S(""), "", 1, 0, S::npos));
4440   BOOST_TEST(testFF(S(""), "lbtqd", 1, 0, S::npos));
4441   BOOST_TEST(testFF(S(""), "tboim", 1, 1, S::npos));
4442   BOOST_TEST(testFF(S(""), "slcer", 1, 2, S::npos));
4443   BOOST_TEST(testFF(S(""), "cbjfs", 1, 4, S::npos));
4444   BOOST_TEST(testFF(S(""), "aqibs", 1, 5, S::npos));
4445   BOOST_TEST(testFF(S(""), "gtfblmqinc", 1, 0, S::npos));
4446   BOOST_TEST(testFF(S(""), "mkqpbtdalg", 1, 1, S::npos));
4447   BOOST_TEST(testFF(S(""), "kphatlimcd", 1, 5, S::npos));
4448   BOOST_TEST(testFF(S(""), "pblasqogic", 1, 9, S::npos));
4449   BOOST_TEST(testFF(S(""), "arosdhcfme", 1, 10, S::npos));
4450   BOOST_TEST(testFF(S(""), "blkhjeogicatqfnpdmsr", 1, 0, S::npos));
4451   BOOST_TEST(testFF(S(""), "bmhineprjcoadgstflqk", 1, 1, S::npos));
4452   BOOST_TEST(testFF(S(""), "djkqcmetslnghpbarfoi", 1, 10, S::npos));
4453   BOOST_TEST(testFF(S(""), "lgokshjtpbemarcdqnfi", 1, 19, S::npos));
4454   BOOST_TEST(testFF(S(""), "bqjhtkfepimcnsgrlado", 1, 20, S::npos));
4455   BOOST_TEST(testFF(S("eaint"), "", 0, 0, S::npos));
4456   BOOST_TEST(testFF(S("binja"), "gfsrt", 0, 0, S::npos));
4457   BOOST_TEST(testFF(S("latkm"), "pfsoc", 0, 1, S::npos));
4458   BOOST_TEST(testFF(S("lecfr"), "tpflm", 0, 2, S::npos));
4459   BOOST_TEST(testFF(S("eqkst"), "sgkec", 0, 4, 0));
4460   BOOST_TEST(testFF(S("cdafr"), "romds", 0, 5, 1));
4461   BOOST_TEST(testFF(S("prbhe"), "qhjistlgmr", 0, 0, S::npos));
4462   BOOST_TEST(testFF(S("lbisk"), "pedfirsglo", 0, 1, S::npos));
4463   BOOST_TEST(testFF(S("hrlpd"), "aqcoslgrmk", 0, 5, S::npos));
4464   BOOST_TEST(testFF(S("ehmja"), "dabckmepqj", 0, 9, 0));
4465   BOOST_TEST(testFF(S("mhqgd"), "pqscrjthli", 0, 10, 1));
4466   BOOST_TEST(testFF(S("tgklq"), "kfphdcsjqmobliagtren", 0, 0, S::npos));
4467   BOOST_TEST(testFF(S("bocjs"), "rokpefncljibsdhqtagm", 0, 1, S::npos));
4468   BOOST_TEST(testFF(S("grbsd"), "afionmkphlebtcjqsgrd", 0, 10, S::npos));
4469   BOOST_TEST(testFF(S("ofjqr"), "aenmqplidhkofrjbctsg", 0, 19, 0));
4470   BOOST_TEST(testFF(S("btlfi"), "osjmbtcadhiklegrpqnf", 0, 20, 0));
4471   BOOST_TEST(testFF(S("clrgb"), "", 1, 0, S::npos));
4472   BOOST_TEST(testFF(S("tjmek"), "osmia", 1, 0, S::npos));
4473   BOOST_TEST(testFF(S("bgstp"), "ckonl", 1, 1, S::npos));
4474   BOOST_TEST(testFF(S("hstrk"), "ilcaj", 1, 2, S::npos));
4475   BOOST_TEST(testFF(S("kmspj"), "lasiq", 1, 4, 2));
4476   BOOST_TEST(testFF(S("tjboh"), "kfqmr", 1, 5, S::npos));
4477   BOOST_TEST(testFF(S("ilbcj"), "klnitfaobg", 1, 0, S::npos));
4478   BOOST_TEST(testFF(S("jkngf"), "gjhmdlqikp", 1, 1, 3));
4479   BOOST_TEST(testFF(S("gfcql"), "skbgtahqej", 1, 5, S::npos));
4480   BOOST_TEST(testFF(S("dqtlg"), "bjsdgtlpkf", 1, 9, 2));
4481   BOOST_TEST(testFF(S("bthpg"), "bjgfmnlkio", 1, 10, 4));
4482   BOOST_TEST(testFF(S("dgsnq"), "lbhepotfsjdqigcnamkr", 1, 0, S::npos));
4483   BOOST_TEST(testFF(S("rmfhp"), "tebangckmpsrqdlfojhi", 1, 1, S::npos));
4484   BOOST_TEST(testFF(S("jfdam"), "joflqbdkhtegimscpanr", 1, 10, 1));
4485   BOOST_TEST(testFF(S("edapb"), "adpmcohetfbsrjinlqkg", 1, 19, 1));
4486   BOOST_TEST(testFF(S("brfsm"), "iacldqjpfnogbsrhmetk", 1, 20, 1));
4487   BOOST_TEST(testFF(S("ndrhl"), "", 2, 0, S::npos));
4488   BOOST_TEST(testFF(S("mrecp"), "otkgb", 2, 0, S::npos));
4489   BOOST_TEST(testFF(S("qlasf"), "cqsjl", 2, 1, S::npos));
4490   BOOST_TEST(testFF(S("smaqd"), "dpifl", 2, 2, 4));
4491   BOOST_TEST(testFF(S("hjeni"), "oapht", 2, 4, S::npos));
4492   BOOST_TEST(testFF(S("ocmfj"), "cifts", 2, 5, 3));
4493   BOOST_TEST(testFF(S("hmftq"), "nmsckbgalo", 2, 0, S::npos));
4494   BOOST_TEST(testFF(S("fklad"), "tpksqhamle", 2, 1, S::npos));
4495   BOOST_TEST(testFF(S("dirnm"), "tpdrchmkji", 2, 5, 2));
4496   BOOST_TEST(testFF(S("hrgdc"), "ijagfkblst", 2, 9, 2));
4497   BOOST_TEST(testFF(S("ifakg"), "kpocsignjb", 2, 10, 3));
4498   BOOST_TEST(testFF(S("ebrgd"), "pecqtkjsnbdrialgmohf", 2, 0, S::npos));
4499   BOOST_TEST(testFF(S("rcjml"), "aiortphfcmkjebgsndql", 2, 1, S::npos));
4500   BOOST_TEST(testFF(S("peqmt"), "sdbkeamglhipojqftrcn", 2, 10, 3));
4501   BOOST_TEST(testFF(S("frehn"), "ljqncehgmfktroapidbs", 2, 19, 2));
4502   BOOST_TEST(testFF(S("tqolf"), "rtcfodilamkbenjghqps", 2, 20, 2));
4503   BOOST_TEST(testFF(S("cjgao"), "", 4, 0, S::npos));
4504   BOOST_TEST(testFF(S("kjplq"), "mabns", 4, 0, S::npos));
4505   BOOST_TEST(testFF(S("herni"), "bdnrp", 4, 1, S::npos));
4506   BOOST_TEST(testFF(S("tadrb"), "scidp", 4, 2, S::npos));
4507   BOOST_TEST(testFF(S("pkfeo"), "agbjl", 4, 4, S::npos));
4508   BOOST_TEST(testFF(S("hoser"), "jfmpr", 4, 5, 4));
4509   BOOST_TEST(testFF(S("kgrsp"), "rbpefghsmj", 4, 0, S::npos));
4510   BOOST_TEST(testFF(S("pgejb"), "apsfntdoqc", 4, 1, S::npos));
4511   BOOST_TEST(testFF(S("thlnq"), "ndkjeisgcl", 4, 5, S::npos));
4512   BOOST_TEST(testFF(S("nbmit"), "rnfpqatdeo", 4, 9, 4));
4513   BOOST_TEST(testFF(S("jgmib"), "bntjlqrfik", 4, 10, 4));
4514   BOOST_TEST(testFF(S("ncrfj"), "kcrtmpolnaqejghsfdbi", 4, 0, S::npos));
4515   BOOST_TEST(testFF(S("ncsik"), "lobheanpkmqidsrtcfgj", 4, 1, S::npos));
4516   BOOST_TEST(testFF(S("sgbfh"), "athdkljcnreqbgpmisof", 4, 10, 4));
4517   BOOST_TEST(testFF(S("dktbn"), "qkdmjialrscpbhefgont", 4, 19, 4));
4518   BOOST_TEST(testFF(S("fthqm"), "dmasojntqleribkgfchp", 4, 20, 4));
4519   BOOST_TEST(testFF(S("klopi"), "", 5, 0, S::npos));
4520   BOOST_TEST(testFF(S("dajhn"), "psthd", 5, 0, S::npos));
4521   BOOST_TEST(testFF(S("jbgno"), "rpmjd", 5, 1, S::npos));
4522   BOOST_TEST(testFF(S("hkjae"), "dfsmk", 5, 2, S::npos));
4523   BOOST_TEST(testFF(S("gbhqo"), "skqne", 5, 4, S::npos));
4524   BOOST_TEST(testFF(S("ktdor"), "kipnf", 5, 5, S::npos));
4525   BOOST_TEST(testFF(S("ldprn"), "hmrnqdgifl", 5, 0, S::npos));
4526   BOOST_TEST(testFF(S("egmjk"), "fsmjcdairn", 5, 1, S::npos));
4527   BOOST_TEST(testFF(S("armql"), "pcdgltbrfj", 5, 5, S::npos));
4528   BOOST_TEST(testFF(S("cdhjo"), "aekfctpirg", 5, 9, S::npos));
4529   BOOST_TEST(testFF(S("jcons"), "ledihrsgpf", 5, 10, S::npos));
4530   BOOST_TEST(testFF(S("cbrkp"), "mqcklahsbtirgopefndj", 5, 0, S::npos));
4531   BOOST_TEST(testFF(S("fhgna"), "kmlthaoqgecrnpdbjfis", 5, 1, S::npos));
4532   BOOST_TEST(testFF(S("ejfcd"), "sfhbamcdptojlkrenqgi", 5, 10, S::npos));
4533   BOOST_TEST(testFF(S("kqjhe"), "pbniofmcedrkhlstgaqj", 5, 19, S::npos));
4534   BOOST_TEST(testFF(S("pbdjl"), "mongjratcskbhqiepfdl", 5, 20, S::npos));
4535   BOOST_TEST(testFF(S("gajqn"), "", 6, 0, S::npos));
4536   BOOST_TEST(testFF(S("stedk"), "hrnat", 6, 0, S::npos));
4537   BOOST_TEST(testFF(S("tjkaf"), "gsqdt", 6, 1, S::npos));
4538   BOOST_TEST(testFF(S("dthpe"), "bspkd", 6, 2, S::npos));
4539   BOOST_TEST(testFF(S("klhde"), "ohcmb", 6, 4, S::npos));
4540   BOOST_TEST(testFF(S("bhlki"), "heatr", 6, 5, S::npos));
4541   BOOST_TEST(testFF(S("lqmoh"), "pmblckedfn", 6, 0, S::npos));
4542   BOOST_TEST(testFF(S("mtqin"), "aceqmsrbik", 6, 1, S::npos));
4543   BOOST_TEST(testFF(S("dpqbr"), "lmbtdehjrn", 6, 5, S::npos));
4544   BOOST_TEST(testFF(S("kdhmo"), "teqmcrlgib", 6, 9, S::npos));
4545   BOOST_TEST(testFF(S("jblqp"), "njolbmspac", 6, 10, S::npos));
4546   BOOST_TEST(testFF(S("qmjgl"), "pofnhidklamecrbqjgst", 6, 0, S::npos));
4547   BOOST_TEST(testFF(S("rothp"), "jbhckmtgrqnosafedpli", 6, 1, S::npos));
4548   BOOST_TEST(testFF(S("ghknq"), "dobntpmqklicsahgjerf", 6, 10, S::npos));
4549   BOOST_TEST(testFF(S("eopfi"), "tpdshainjkbfoemlrgcq", 6, 19, S::npos));
4550   BOOST_TEST(testFF(S("dsnmg"), "oldpfgeakrnitscbjmqh", 6, 20, S::npos));
4551   BOOST_TEST(testFF(S("jnkrfhotgl"), "", 0, 0, S::npos));
4552   BOOST_TEST(testFF(S("dltjfngbko"), "rqegt", 0, 0, S::npos));
4553   BOOST_TEST(testFF(S("bmjlpkiqde"), "dashm", 0, 1, 8));
4554   BOOST_TEST(testFF(S("skrflobnqm"), "jqirk", 0, 2, 8));
4555   BOOST_TEST(testFF(S("jkpldtshrm"), "rckeg", 0, 4, 1));
4556   BOOST_TEST(testFF(S("ghasdbnjqo"), "jscie", 0, 5, 3));
4557   BOOST_TEST(testFF(S("igrkhpbqjt"), "efsphndliq", 0, 0, S::npos));
4558   BOOST_TEST(testFF(S("ikthdgcamf"), "gdicosleja", 0, 1, 5));
4559   BOOST_TEST(testFF(S("pcofgeniam"), "qcpjibosfl", 0, 5, 0));
4560   BOOST_TEST(testFF(S("rlfjgesqhc"), "lrhmefnjcq", 0, 9, 0));
4561   BOOST_TEST(testFF(S("itphbqsker"), "dtablcrseo", 0, 10, 1));
4562   BOOST_TEST(testFF(S("skjafcirqm"), "apckjsftedbhgomrnilq", 0, 0, S::npos));
4563   BOOST_TEST(testFF(S("tcqomarsfd"), "pcbrgflehjtiadnsokqm", 0, 1, S::npos));
4564   BOOST_TEST(testFF(S("rocfeldqpk"), "nsiadegjklhobrmtqcpf", 0, 10, 4));
4565   BOOST_TEST(testFF(S("cfpegndlkt"), "cpmajdqnolikhgsbretf", 0, 19, 0));
4566   BOOST_TEST(testFF(S("fqbtnkeasj"), "jcflkntmgiqrphdosaeb", 0, 20, 0));
4567   BOOST_TEST(testFF(S("shbcqnmoar"), "", 1, 0, S::npos));
4568   BOOST_TEST(testFF(S("bdoshlmfin"), "ontrs", 1, 0, S::npos));
4569   BOOST_TEST(testFF(S("khfrebnsgq"), "pfkna", 1, 1, S::npos));
4570   BOOST_TEST(testFF(S("getcrsaoji"), "ekosa", 1, 2, 1));
4571   BOOST_TEST(testFF(S("fjiknedcpq"), "anqhk", 1, 4, 4));
4572   BOOST_TEST(testFF(S("tkejgnafrm"), "jekca", 1, 5, 1));
4573   BOOST_TEST(testFF(S("jnakolqrde"), "ikemsjgacf", 1, 0, S::npos));
4574   BOOST_TEST(testFF(S("lcjptsmgbe"), "arolgsjkhm", 1, 1, S::npos));
4575   BOOST_TEST(testFF(S("itfsmcjorl"), "oftkbldhre", 1, 5, 1));
4576   BOOST_TEST(testFF(S("omchkfrjea"), "gbkqdoeftl", 1, 9, 4));
4577   BOOST_TEST(testFF(S("cigfqkated"), "sqcflrgtim", 1, 10, 1));
4578   BOOST_TEST(testFF(S("tscenjikml"), "fmhbkislrjdpanogqcet", 1, 0, S::npos));
4579   BOOST_TEST(testFF(S("qcpaemsinf"), "rnioadktqlgpbcjsmhef", 1, 1, S::npos));
4580   BOOST_TEST(testFF(S("gltkojeipd"), "oakgtnldpsefihqmjcbr", 1, 10, 1));
4581   BOOST_TEST(testFF(S("qistfrgnmp"), "gbnaelosidmcjqktfhpr", 1, 19, 1));
4582   BOOST_TEST(testFF(S("bdnpfcqaem"), "akbripjhlosndcmqgfet", 1, 20, 1));
4583   BOOST_TEST(testFF(S("ectnhskflp"), "", 5, 0, S::npos));
4584   BOOST_TEST(testFF(S("fgtianblpq"), "pijag", 5, 0, S::npos));
4585   BOOST_TEST(testFF(S("mfeqklirnh"), "jrckd", 5, 1, S::npos));
4586   BOOST_TEST(testFF(S("astedncjhk"), "qcloh", 5, 2, 6));
4587   BOOST_TEST(testFF(S("fhlqgcajbr"), "thlmp", 5, 4, S::npos));
4588   BOOST_TEST(testFF(S("epfhocmdng"), "qidmo", 5, 5, 6));
4589   BOOST_TEST(testFF(S("apcnsibger"), "lnegpsjqrd", 5, 0, S::npos));
4590   BOOST_TEST(testFF(S("aqkocrbign"), "rjqdablmfs", 5, 1, 5));
4591   BOOST_TEST(testFF(S("ijsmdtqgce"), "enkgpbsjaq", 5, 5, 7));
4592   BOOST_TEST(testFF(S("clobgsrken"), "kdsgoaijfh", 5, 9, 5));
4593   BOOST_TEST(testFF(S("jbhcfposld"), "trfqgmckbe", 5, 10, S::npos));
4594   BOOST_TEST(testFF(S("oqnpblhide"), "igetsracjfkdnpoblhqm", 5, 0, S::npos));
4595   BOOST_TEST(testFF(S("lroeasctif"), "nqctfaogirshlekbdjpm", 5, 1, S::npos));
4596   BOOST_TEST(testFF(S("bpjlgmiedh"), "csehfgomljdqinbartkp", 5, 10, 5));
4597   BOOST_TEST(testFF(S("pamkeoidrj"), "qahoegcmplkfsjbdnitr", 5, 19, 5));
4598   BOOST_TEST(testFF(S("espogqbthk"), "dpteiajrqmsognhlfbkc", 5, 20, 5));
4599   BOOST_TEST(testFF(S("shoiedtcjb"), "", 9, 0, S::npos));
4600   BOOST_TEST(testFF(S("ebcinjgads"), "tqbnh", 9, 0, S::npos));
4601   BOOST_TEST(testFF(S("dqmregkcfl"), "akmle", 9, 1, S::npos));
4602   BOOST_TEST(testFF(S("ngcrieqajf"), "iqfkm", 9, 2, S::npos));
4603   BOOST_TEST(testFF(S("qosmilgnjb"), "tqjsr", 9, 4, S::npos));
4604   BOOST_TEST(testFF(S("ikabsjtdfl"), "jplqg", 9, 5, 9));
4605   BOOST_TEST(testFF(S("ersmicafdh"), "oilnrbcgtj", 9, 0, S::npos));
4606   BOOST_TEST(testFF(S("fdnplotmgh"), "morkglpesn", 9, 1, S::npos));
4607   BOOST_TEST(testFF(S("fdbicojerm"), "dmicerngat", 9, 5, 9));
4608   BOOST_TEST(testFF(S("mbtafndjcq"), "radgeskbtc", 9, 9, S::npos));
4609   BOOST_TEST(testFF(S("mlenkpfdtc"), "ljikprsmqo", 9, 10, S::npos));
4610   BOOST_TEST(testFF(S("ahlcifdqgs"), "trqihkcgsjamfdbolnpe", 9, 0, S::npos));
4611   BOOST_TEST(testFF(S("bgjemaltks"), "lqmthbsrekajgnofcipd", 9, 1, S::npos));
4612   BOOST_TEST(testFF(S("pdhslbqrfc"), "jtalmedribkgqsopcnfh", 9, 10, S::npos));
4613   BOOST_TEST(testFF(S("dirhtsnjkc"), "spqfoiclmtagejbndkrh", 9, 19, 9));
4614   BOOST_TEST(testFF(S("dlroktbcja"), "nmotklspigjrdhcfaebq", 9, 20, 9));
4615   BOOST_TEST(testFF(S("ncjpmaekbs"), "", 10, 0, S::npos));
4616   BOOST_TEST(testFF(S("hlbosgmrak"), "hpmsd", 10, 0, S::npos));
4617   BOOST_TEST(testFF(S("pqfhsgilen"), "qnpor", 10, 1, S::npos));
4618   BOOST_TEST(testFF(S("gqtjsbdckh"), "otdma", 10, 2, S::npos));
4619   BOOST_TEST(testFF(S("cfkqpjlegi"), "efhjg", 10, 4, S::npos));
4620   BOOST_TEST(testFF(S("beanrfodgj"), "odpte", 10, 5, S::npos));
4621   BOOST_TEST(testFF(S("adtkqpbjfi"), "bctdgfmolr", 10, 0, S::npos));
4622   BOOST_TEST(testFF(S("iomkfthagj"), "oaklidrbqg", 10, 1, S::npos));
4623   BOOST_TEST(testFF(S("sdpcilonqj"), "dnjfsagktr", 10, 5, S::npos));
4624   BOOST_TEST(testFF(S("gtfbdkqeml"), "nejaktmiqg", 10, 9, S::npos));
4625   BOOST_TEST(testFF(S("bmeqgcdorj"), "pjqonlebsf", 10, 10, S::npos));
4626   BOOST_TEST(testFF(S("etqlcanmob"), "dshmnbtolcjepgaikfqr", 10, 0, S::npos));
4627   BOOST_TEST(testFF(S("roqmkbdtia"), "iogfhpabtjkqlrnemcds", 10, 1, S::npos));
4628   BOOST_TEST(testFF(S("kadsithljf"), "ngridfabjsecpqltkmoh", 10, 10, S::npos));
4629   BOOST_TEST(testFF(S("sgtkpbfdmh"), "athmknplcgofrqejsdib", 10, 19, S::npos));
4630   BOOST_TEST(testFF(S("qgmetnabkl"), "ldobhmqcafnjtkeisgrp", 10, 20, S::npos));
4631   BOOST_TEST(testFF(S("cqjohampgd"), "", 11, 0, S::npos));
4632   BOOST_TEST(testFF(S("hobitmpsan"), "aocjb", 11, 0, S::npos));
4633   BOOST_TEST(testFF(S("tjehkpsalm"), "jbrnk", 11, 1, S::npos));
4634   BOOST_TEST(testFF(S("ngfbojitcl"), "tqedg", 11, 2, S::npos));
4635   BOOST_TEST(testFF(S("rcfkdbhgjo"), "nqskp", 11, 4, S::npos));
4636   BOOST_TEST(testFF(S("qghptonrea"), "eaqkl", 11, 5, S::npos));
4637   BOOST_TEST(testFF(S("hnprfgqjdl"), "reaoicljqm", 11, 0, S::npos));
4638   BOOST_TEST(testFF(S("hlmgabenti"), "lsftgajqpm", 11, 1, S::npos));
4639   BOOST_TEST(testFF(S("ofcjanmrbs"), "rlpfogmits", 11, 5, S::npos));
4640   BOOST_TEST(testFF(S("jqedtkornm"), "shkncmiaqj", 11, 9, S::npos));
4641   BOOST_TEST(testFF(S("rfedlasjmg"), "fpnatrhqgs", 11, 10, S::npos));
4642   BOOST_TEST(testFF(S("talpqjsgkm"), "sjclemqhnpdbgikarfot", 11, 0, S::npos));
4643   BOOST_TEST(testFF(S("lrkcbtqpie"), "otcmedjikgsfnqbrhpla", 11, 1, S::npos));
4644   BOOST_TEST(testFF(S("cipogdskjf"), "bonsaefdqiprkhlgtjcm", 11, 10, S::npos));
4645   BOOST_TEST(testFF(S("nqedcojahi"), "egpscmahijlfnkrodqtb", 11, 19, S::npos));
4646   BOOST_TEST(testFF(S("hefnrkmctj"), "kmqbfepjthgilscrndoa", 11, 20, S::npos));
4647   BOOST_TEST(testFF(S("atqirnmekfjolhpdsgcb"), "", 0, 0, S::npos));
4648   BOOST_TEST(testFF(S("echfkmlpribjnqsaogtd"), "prboq", 0, 0, S::npos));
4649   BOOST_TEST(testFF(S("qnhiftdgcleajbpkrosm"), "fjcqh", 0, 1, 4));
4650   BOOST_TEST(testFF(S("chamfknorbedjitgslpq"), "fmosa", 0, 2, 3));
4651   BOOST_TEST(testFF(S("njhqpibfmtlkaecdrgso"), "qdbok", 0, 4, 3));
4652   BOOST_TEST(testFF(S("ebnghfsqkprmdcljoiat"), "amslg", 0, 5, 3));
4653   BOOST_TEST(testFF(S("letjomsgihfrpqbkancd"), "smpltjneqb", 0, 0, S::npos));
4654   BOOST_TEST(testFF(S("nblgoipcrqeaktshjdmf"), "flitskrnge", 0, 1, 19));
4655   BOOST_TEST(testFF(S("cehkbngtjoiflqapsmrd"), "pgqihmlbef", 0, 5, 2));
4656   BOOST_TEST(testFF(S("mignapfoklbhcqjetdrs"), "cfpdqjtgsb", 0, 9, 2));
4657   BOOST_TEST(testFF(S("ceatbhlsqjgpnokfrmdi"), "htpsiaflom", 0, 10, 2));
4658   BOOST_TEST(testFF(S("ocihkjgrdelpfnmastqb"), "kpjfiaceghsrdtlbnomq", 0, 0, S::npos));
4659   BOOST_TEST(testFF(S("noelgschdtbrjfmiqkap"), "qhtbomidljgafneksprc", 0, 1, 16));
4660   BOOST_TEST(testFF(S("dkclqfombepritjnghas"), "nhtjobkcefldimpsaqgr", 0, 10, 1));
4661   BOOST_TEST(testFF(S("miklnresdgbhqcojftap"), "prabcjfqnoeskilmtgdh", 0, 19, 0));
4662   BOOST_TEST(testFF(S("htbcigojaqmdkfrnlsep"), "dtrgmchilkasqoebfpjn", 0, 20, 0));
4663   BOOST_TEST(testFF(S("febhmqtjanokscdirpgl"), "", 1, 0, S::npos));
4664   BOOST_TEST(testFF(S("loakbsqjpcrdhftniegm"), "sqome", 1, 0, S::npos));
4665   BOOST_TEST(testFF(S("reagphsqflbitdcjmkno"), "smfte", 1, 1, 6));
4666   BOOST_TEST(testFF(S("jitlfrqemsdhkopncabg"), "ciboh", 1, 2, 1));
4667   BOOST_TEST(testFF(S("mhtaepscdnrjqgbkifol"), "haois", 1, 4, 1));
4668   BOOST_TEST(testFF(S("tocesrfmnglpbjihqadk"), "abfki", 1, 5, 6));
4669   BOOST_TEST(testFF(S("lpfmctjrhdagneskbqoi"), "frdkocntmq", 1, 0, S::npos));
4670   BOOST_TEST(testFF(S("lsmqaepkdhncirbtjfgo"), "oasbpedlnr", 1, 1, 19));
4671   BOOST_TEST(testFF(S("epoiqmtldrabnkjhcfsg"), "kltqmhgand", 1, 5, 4));
4672   BOOST_TEST(testFF(S("emgasrilpknqojhtbdcf"), "gdtfjchpmr", 1, 9, 1));
4673   BOOST_TEST(testFF(S("hnfiagdpcklrjetqbsom"), "ponmcqblet", 1, 10, 1));
4674   BOOST_TEST(testFF(S("nsdfebgajhmtricpoklq"), "sgphqdnofeiklatbcmjr", 1, 0, S::npos));
4675   BOOST_TEST(testFF(S("atjgfsdlpobmeiqhncrk"), "ljqprsmigtfoneadckbh", 1, 1, 7));
4676   BOOST_TEST(testFF(S("sitodfgnrejlahcbmqkp"), "ligeojhafnkmrcsqtbdp", 1, 10, 1));
4677   BOOST_TEST(testFF(S("fraghmbiceknltjpqosd"), "lsimqfnjarbopedkhcgt", 1, 19, 1));
4678   BOOST_TEST(testFF(S("pmafenlhqtdbkirjsogc"), "abedmfjlghniorcqptks", 1, 20, 1));
4679   BOOST_TEST(testFF(S("pihgmoeqtnakrjslcbfd"), "", 10, 0, S::npos));
4680   BOOST_TEST(testFF(S("gjdkeprctqblnhiafsom"), "hqtoa", 10, 0, S::npos));
4681   BOOST_TEST(testFF(S("mkpnblfdsahrcqijteog"), "cahif", 10, 1, 12));
4682   BOOST_TEST(testFF(S("gckarqnelodfjhmbptis"), "kehis", 10, 2, S::npos));
4683   BOOST_TEST(testFF(S("gqpskidtbclomahnrjfe"), "kdlmh", 10, 4, 10));
4684   BOOST_TEST(testFF(S("pkldjsqrfgitbhmaecno"), "paeql", 10, 5, 15));
4685   BOOST_TEST(testFF(S("aftsijrbeklnmcdqhgop"), "aghoqiefnb", 10, 0, S::npos));
4686   BOOST_TEST(testFF(S("mtlgdrhafjkbiepqnsoc"), "jrbqaikpdo", 10, 1, S::npos));
4687   BOOST_TEST(testFF(S("pqgirnaefthokdmbsclj"), "smjonaeqcl", 10, 5, 11));
4688   BOOST_TEST(testFF(S("kpdbgjmtherlsfcqoina"), "eqbdrkcfah", 10, 9, 10));
4689   BOOST_TEST(testFF(S("jrlbothiknqmdgcfasep"), "kapmsienhf", 10, 10, 11));
4690   BOOST_TEST(testFF(S("mjogldqferckabinptsh"), "jpqotrlenfcsbhkaimdg", 10, 0, S::npos));
4691   BOOST_TEST(testFF(S("apoklnefbhmgqcdrisjt"), "jlbmhnfgtcqprikeados", 10, 1, 18));
4692   BOOST_TEST(testFF(S("ifeopcnrjbhkdgatmqls"), "stgbhfmdaljnpqoicker", 10, 10, 10));
4693   BOOST_TEST(testFF(S("ckqhaiesmjdnrgolbtpf"), "oihcetflbjagdsrkmqpn", 10, 19, 10));
4694   BOOST_TEST(testFF(S("bnlgapfimcoterskqdjh"), "adtclebmnpjsrqfkigoh", 10, 20, 10));
4695   BOOST_TEST(testFF(S("kgdlrobpmjcthqsafeni"), "", 19, 0, S::npos));
4696   BOOST_TEST(testFF(S("dfkechomjapgnslbtqir"), "beafg", 19, 0, S::npos));
4697   BOOST_TEST(testFF(S("rloadknfbqtgmhcsipje"), "iclat", 19, 1, S::npos));
4698   BOOST_TEST(testFF(S("mgjhkolrnadqbpetcifs"), "rkhnf", 19, 2, S::npos));
4699   BOOST_TEST(testFF(S("cmlfakiojdrgtbsphqen"), "clshq", 19, 4, S::npos));
4700   BOOST_TEST(testFF(S("kghbfipeomsntdalrqjc"), "dtcoj", 19, 5, 19));
4701   BOOST_TEST(testFF(S("eldiqckrnmtasbghjfpo"), "rqosnjmfth", 19, 0, S::npos));
4702   BOOST_TEST(testFF(S("abqjcfedgotihlnspkrm"), "siatdfqglh", 19, 1, S::npos));
4703   BOOST_TEST(testFF(S("qfbadrtjsimkolcenhpg"), "mrlshtpgjq", 19, 5, S::npos));
4704   BOOST_TEST(testFF(S("abseghclkjqifmtodrnp"), "adlcskgqjt", 19, 9, S::npos));
4705   BOOST_TEST(testFF(S("ibmsnlrjefhtdokacqpg"), "drshcjknaf", 19, 10, S::npos));
4706   BOOST_TEST(testFF(S("mrkfciqjebaponsthldg"), "etsaqroinghpkjdlfcbm", 19, 0, S::npos));
4707   BOOST_TEST(testFF(S("mjkticdeoqshpalrfbgn"), "sgepdnkqliambtrocfhj", 19, 1, S::npos));
4708   BOOST_TEST(testFF(S("rqnoclbdejgiphtfsakm"), "nlmcjaqgbsortfdihkpe", 19, 10, 19));
4709   BOOST_TEST(testFF(S("plkqbhmtfaeodjcrsing"), "racfnpmosldibqkghjet", 19, 19, 19));
4710   BOOST_TEST(testFF(S("oegalhmstjrfickpbndq"), "fjhdsctkqeiolagrnmbp", 19, 20, 19));
4711   BOOST_TEST(testFF(S("rdtgjcaohpblniekmsfq"), "", 20, 0, S::npos));
4712   BOOST_TEST(testFF(S("ofkqbnjetrmsaidphglc"), "ejanp", 20, 0, S::npos));
4713   BOOST_TEST(testFF(S("grkpahljcftesdmonqib"), "odife", 20, 1, S::npos));
4714   BOOST_TEST(testFF(S("jimlgbhfqkteospardcn"), "okaqd", 20, 2, S::npos));
4715   BOOST_TEST(testFF(S("gftenihpmslrjkqadcob"), "lcdbi", 20, 4, S::npos));
4716   BOOST_TEST(testFF(S("bmhldogtckrfsanijepq"), "fsqbj", 20, 5, S::npos));
4717   BOOST_TEST(testFF(S("nfqkrpjdesabgtlcmoih"), "bigdomnplq", 20, 0, S::npos));
4718   BOOST_TEST(testFF(S("focalnrpiqmdkstehbjg"), "apiblotgcd", 20, 1, S::npos));
4719   BOOST_TEST(testFF(S("rhqdspkmebiflcotnjga"), "acfhdenops", 20, 5, S::npos));
4720   BOOST_TEST(testFF(S("rahdtmsckfboqlpniegj"), "jopdeamcrk", 20, 9, S::npos));
4721   BOOST_TEST(testFF(S("fbkeiopclstmdqranjhg"), "trqncbkgmh", 20, 10, S::npos));
4722   BOOST_TEST(testFF(S("lifhpdgmbconstjeqark"), "tomglrkencbsfjqpihda", 20, 0, S::npos));
4723 
4724   // find_last_of
4725 
4726   BOOST_TEST(fs1.find_last_of(v1) == 4);
4727   BOOST_TEST(fs1.find_last_of(v2) == 4);
4728   BOOST_TEST(fs1.find_last_of(fs1) == 4);
4729   BOOST_TEST(fs1.find_last_of(fs2) == 4);
4730 
4731   BOOST_TEST(fs1.find_last_of(cs1) == 4);
4732   BOOST_TEST(fs1.find_last_of(cs2) == 4);
4733 
4734   BOOST_TEST(fs1.find_last_of(cs1, 0) == 0);
4735   BOOST_TEST(fs1.find_last_of(cs2, 0) == S::npos);
4736 
4737   BOOST_TEST(fs1.find_last_of(cs2, 0, 2) == S::npos);
4738 
4739   BOOST_TEST(fs1.find_last_of(cs1, 4) == 4);
4740   BOOST_TEST(fs1.find_last_of(cs2, 4) == 4);
4741 
4742   BOOST_TEST(fs1.find_last_of('1') == 0);
4743   BOOST_TEST(fs1.find_last_of('5', 3) == S::npos);
4744 
4745   BOOST_TEST(testFL(S(""), "", 0, 0, S::npos));
4746   BOOST_TEST(testFL(S(""), "irkhs", 0, 0, S::npos));
4747   BOOST_TEST(testFL(S(""), "kante", 0, 1, S::npos));
4748   BOOST_TEST(testFL(S(""), "oknlr", 0, 2, S::npos));
4749   BOOST_TEST(testFL(S(""), "pcdro", 0, 4, S::npos));
4750   BOOST_TEST(testFL(S(""), "bnrpe", 0, 5, S::npos));
4751   BOOST_TEST(testFL(S(""), "jtdaefblso", 0, 0, S::npos));
4752   BOOST_TEST(testFL(S(""), "oselktgbca", 0, 1, S::npos));
4753   BOOST_TEST(testFL(S(""), "eqgaplhckj", 0, 5, S::npos));
4754   BOOST_TEST(testFL(S(""), "bjahtcmnlp", 0, 9, S::npos));
4755   BOOST_TEST(testFL(S(""), "hjlcmgpket", 0, 10, S::npos));
4756   BOOST_TEST(testFL(S(""), "htaobedqikfplcgjsmrn", 0, 0, S::npos));
4757   BOOST_TEST(testFL(S(""), "hpqiarojkcdlsgnmfetb", 0, 1, S::npos));
4758   BOOST_TEST(testFL(S(""), "dfkaprhjloqetcsimnbg", 0, 10, S::npos));
4759   BOOST_TEST(testFL(S(""), "ihqrfebgadntlpmjksoc", 0, 19, S::npos));
4760   BOOST_TEST(testFL(S(""), "ngtjfcalbseiqrphmkdo", 0, 20, S::npos));
4761   BOOST_TEST(testFL(S(""), "", 1, 0, S::npos));
4762   BOOST_TEST(testFL(S(""), "lbtqd", 1, 0, S::npos));
4763   BOOST_TEST(testFL(S(""), "tboim", 1, 1, S::npos));
4764   BOOST_TEST(testFL(S(""), "slcer", 1, 2, S::npos));
4765   BOOST_TEST(testFL(S(""), "cbjfs", 1, 4, S::npos));
4766   BOOST_TEST(testFL(S(""), "aqibs", 1, 5, S::npos));
4767   BOOST_TEST(testFL(S(""), "gtfblmqinc", 1, 0, S::npos));
4768   BOOST_TEST(testFL(S(""), "mkqpbtdalg", 1, 1, S::npos));
4769   BOOST_TEST(testFL(S(""), "kphatlimcd", 1, 5, S::npos));
4770   BOOST_TEST(testFL(S(""), "pblasqogic", 1, 9, S::npos));
4771   BOOST_TEST(testFL(S(""), "arosdhcfme", 1, 10, S::npos));
4772   BOOST_TEST(testFL(S(""), "blkhjeogicatqfnpdmsr", 1, 0, S::npos));
4773   BOOST_TEST(testFL(S(""), "bmhineprjcoadgstflqk", 1, 1, S::npos));
4774   BOOST_TEST(testFL(S(""), "djkqcmetslnghpbarfoi", 1, 10, S::npos));
4775   BOOST_TEST(testFL(S(""), "lgokshjtpbemarcdqnfi", 1, 19, S::npos));
4776   BOOST_TEST(testFL(S(""), "bqjhtkfepimcnsgrlado", 1, 20, S::npos));
4777   BOOST_TEST(testFL(S("eaint"), "", 0, 0, S::npos));
4778   BOOST_TEST(testFL(S("binja"), "gfsrt", 0, 0, S::npos));
4779   BOOST_TEST(testFL(S("latkm"), "pfsoc", 0, 1, S::npos));
4780   BOOST_TEST(testFL(S("lecfr"), "tpflm", 0, 2, S::npos));
4781   BOOST_TEST(testFL(S("eqkst"), "sgkec", 0, 4, 0));
4782   BOOST_TEST(testFL(S("cdafr"), "romds", 0, 5, S::npos));
4783   BOOST_TEST(testFL(S("prbhe"), "qhjistlgmr", 0, 0, S::npos));
4784   BOOST_TEST(testFL(S("lbisk"), "pedfirsglo", 0, 1, S::npos));
4785   BOOST_TEST(testFL(S("hrlpd"), "aqcoslgrmk", 0, 5, S::npos));
4786   BOOST_TEST(testFL(S("ehmja"), "dabckmepqj", 0, 9, 0));
4787   BOOST_TEST(testFL(S("mhqgd"), "pqscrjthli", 0, 10, S::npos));
4788   BOOST_TEST(testFL(S("tgklq"), "kfphdcsjqmobliagtren", 0, 0, S::npos));
4789   BOOST_TEST(testFL(S("bocjs"), "rokpefncljibsdhqtagm", 0, 1, S::npos));
4790   BOOST_TEST(testFL(S("grbsd"), "afionmkphlebtcjqsgrd", 0, 10, S::npos));
4791   BOOST_TEST(testFL(S("ofjqr"), "aenmqplidhkofrjbctsg", 0, 19, 0));
4792   BOOST_TEST(testFL(S("btlfi"), "osjmbtcadhiklegrpqnf", 0, 20, 0));
4793   BOOST_TEST(testFL(S("clrgb"), "", 1, 0, S::npos));
4794   BOOST_TEST(testFL(S("tjmek"), "osmia", 1, 0, S::npos));
4795   BOOST_TEST(testFL(S("bgstp"), "ckonl", 1, 1, S::npos));
4796   BOOST_TEST(testFL(S("hstrk"), "ilcaj", 1, 2, S::npos));
4797   BOOST_TEST(testFL(S("kmspj"), "lasiq", 1, 4, S::npos));
4798   BOOST_TEST(testFL(S("tjboh"), "kfqmr", 1, 5, S::npos));
4799   BOOST_TEST(testFL(S("ilbcj"), "klnitfaobg", 1, 0, S::npos));
4800   BOOST_TEST(testFL(S("jkngf"), "gjhmdlqikp", 1, 1, S::npos));
4801   BOOST_TEST(testFL(S("gfcql"), "skbgtahqej", 1, 5, 0));
4802   BOOST_TEST(testFL(S("dqtlg"), "bjsdgtlpkf", 1, 9, 0));
4803   BOOST_TEST(testFL(S("bthpg"), "bjgfmnlkio", 1, 10, 0));
4804   BOOST_TEST(testFL(S("dgsnq"), "lbhepotfsjdqigcnamkr", 1, 0, S::npos));
4805   BOOST_TEST(testFL(S("rmfhp"), "tebangckmpsrqdlfojhi", 1, 1, S::npos));
4806   BOOST_TEST(testFL(S("jfdam"), "joflqbdkhtegimscpanr", 1, 10, 1));
4807   BOOST_TEST(testFL(S("edapb"), "adpmcohetfbsrjinlqkg", 1, 19, 1));
4808   BOOST_TEST(testFL(S("brfsm"), "iacldqjpfnogbsrhmetk", 1, 20, 1));
4809   BOOST_TEST(testFL(S("ndrhl"), "", 2, 0, S::npos));
4810   BOOST_TEST(testFL(S("mrecp"), "otkgb", 2, 0, S::npos));
4811   BOOST_TEST(testFL(S("qlasf"), "cqsjl", 2, 1, S::npos));
4812   BOOST_TEST(testFL(S("smaqd"), "dpifl", 2, 2, S::npos));
4813   BOOST_TEST(testFL(S("hjeni"), "oapht", 2, 4, 0));
4814   BOOST_TEST(testFL(S("ocmfj"), "cifts", 2, 5, 1));
4815   BOOST_TEST(testFL(S("hmftq"), "nmsckbgalo", 2, 0, S::npos));
4816   BOOST_TEST(testFL(S("fklad"), "tpksqhamle", 2, 1, S::npos));
4817   BOOST_TEST(testFL(S("dirnm"), "tpdrchmkji", 2, 5, 2));
4818   BOOST_TEST(testFL(S("hrgdc"), "ijagfkblst", 2, 9, 2));
4819   BOOST_TEST(testFL(S("ifakg"), "kpocsignjb", 2, 10, 0));
4820   BOOST_TEST(testFL(S("ebrgd"), "pecqtkjsnbdrialgmohf", 2, 0, S::npos));
4821   BOOST_TEST(testFL(S("rcjml"), "aiortphfcmkjebgsndql", 2, 1, S::npos));
4822   BOOST_TEST(testFL(S("peqmt"), "sdbkeamglhipojqftrcn", 2, 10, 1));
4823   BOOST_TEST(testFL(S("frehn"), "ljqncehgmfktroapidbs", 2, 19, 2));
4824   BOOST_TEST(testFL(S("tqolf"), "rtcfodilamkbenjghqps", 2, 20, 2));
4825   BOOST_TEST(testFL(S("cjgao"), "", 4, 0, S::npos));
4826   BOOST_TEST(testFL(S("kjplq"), "mabns", 4, 0, S::npos));
4827   BOOST_TEST(testFL(S("herni"), "bdnrp", 4, 1, S::npos));
4828   BOOST_TEST(testFL(S("tadrb"), "scidp", 4, 2, S::npos));
4829   BOOST_TEST(testFL(S("pkfeo"), "agbjl", 4, 4, S::npos));
4830   BOOST_TEST(testFL(S("hoser"), "jfmpr", 4, 5, 4));
4831   BOOST_TEST(testFL(S("kgrsp"), "rbpefghsmj", 4, 0, S::npos));
4832   BOOST_TEST(testFL(S("pgejb"), "apsfntdoqc", 4, 1, S::npos));
4833   BOOST_TEST(testFL(S("thlnq"), "ndkjeisgcl", 4, 5, 3));
4834   BOOST_TEST(testFL(S("nbmit"), "rnfpqatdeo", 4, 9, 4));
4835   BOOST_TEST(testFL(S("jgmib"), "bntjlqrfik", 4, 10, 4));
4836   BOOST_TEST(testFL(S("ncrfj"), "kcrtmpolnaqejghsfdbi", 4, 0, S::npos));
4837   BOOST_TEST(testFL(S("ncsik"), "lobheanpkmqidsrtcfgj", 4, 1, S::npos));
4838   BOOST_TEST(testFL(S("sgbfh"), "athdkljcnreqbgpmisof", 4, 10, 4));
4839   BOOST_TEST(testFL(S("dktbn"), "qkdmjialrscpbhefgont", 4, 19, 4));
4840   BOOST_TEST(testFL(S("fthqm"), "dmasojntqleribkgfchp", 4, 20, 4));
4841   BOOST_TEST(testFL(S("klopi"), "", 5, 0, S::npos));
4842   BOOST_TEST(testFL(S("dajhn"), "psthd", 5, 0, S::npos));
4843   BOOST_TEST(testFL(S("jbgno"), "rpmjd", 5, 1, S::npos));
4844   BOOST_TEST(testFL(S("hkjae"), "dfsmk", 5, 2, S::npos));
4845   BOOST_TEST(testFL(S("gbhqo"), "skqne", 5, 4, 3));
4846   BOOST_TEST(testFL(S("ktdor"), "kipnf", 5, 5, 0));
4847   BOOST_TEST(testFL(S("ldprn"), "hmrnqdgifl", 5, 0, S::npos));
4848   BOOST_TEST(testFL(S("egmjk"), "fsmjcdairn", 5, 1, S::npos));
4849   BOOST_TEST(testFL(S("armql"), "pcdgltbrfj", 5, 5, 4));
4850   BOOST_TEST(testFL(S("cdhjo"), "aekfctpirg", 5, 9, 0));
4851   BOOST_TEST(testFL(S("jcons"), "ledihrsgpf", 5, 10, 4));
4852   BOOST_TEST(testFL(S("cbrkp"), "mqcklahsbtirgopefndj", 5, 0, S::npos));
4853   BOOST_TEST(testFL(S("fhgna"), "kmlthaoqgecrnpdbjfis", 5, 1, S::npos));
4854   BOOST_TEST(testFL(S("ejfcd"), "sfhbamcdptojlkrenqgi", 5, 10, 4));
4855   BOOST_TEST(testFL(S("kqjhe"), "pbniofmcedrkhlstgaqj", 5, 19, 4));
4856   BOOST_TEST(testFL(S("pbdjl"), "mongjratcskbhqiepfdl", 5, 20, 4));
4857   BOOST_TEST(testFL(S("gajqn"), "", 6, 0, S::npos));
4858   BOOST_TEST(testFL(S("stedk"), "hrnat", 6, 0, S::npos));
4859   BOOST_TEST(testFL(S("tjkaf"), "gsqdt", 6, 1, S::npos));
4860   BOOST_TEST(testFL(S("dthpe"), "bspkd", 6, 2, S::npos));
4861   BOOST_TEST(testFL(S("klhde"), "ohcmb", 6, 4, 2));
4862   BOOST_TEST(testFL(S("bhlki"), "heatr", 6, 5, 1));
4863   BOOST_TEST(testFL(S("lqmoh"), "pmblckedfn", 6, 0, S::npos));
4864   BOOST_TEST(testFL(S("mtqin"), "aceqmsrbik", 6, 1, S::npos));
4865   BOOST_TEST(testFL(S("dpqbr"), "lmbtdehjrn", 6, 5, 3));
4866   BOOST_TEST(testFL(S("kdhmo"), "teqmcrlgib", 6, 9, 3));
4867   BOOST_TEST(testFL(S("jblqp"), "njolbmspac", 6, 10, 4));
4868   BOOST_TEST(testFL(S("qmjgl"), "pofnhidklamecrbqjgst", 6, 0, S::npos));
4869   BOOST_TEST(testFL(S("rothp"), "jbhckmtgrqnosafedpli", 6, 1, S::npos));
4870   BOOST_TEST(testFL(S("ghknq"), "dobntpmqklicsahgjerf", 6, 10, 4));
4871   BOOST_TEST(testFL(S("eopfi"), "tpdshainjkbfoemlrgcq", 6, 19, 4));
4872   BOOST_TEST(testFL(S("dsnmg"), "oldpfgeakrnitscbjmqh", 6, 20, 4));
4873   BOOST_TEST(testFL(S("jnkrfhotgl"), "", 0, 0, S::npos));
4874   BOOST_TEST(testFL(S("dltjfngbko"), "rqegt", 0, 0, S::npos));
4875   BOOST_TEST(testFL(S("bmjlpkiqde"), "dashm", 0, 1, S::npos));
4876   BOOST_TEST(testFL(S("skrflobnqm"), "jqirk", 0, 2, S::npos));
4877   BOOST_TEST(testFL(S("jkpldtshrm"), "rckeg", 0, 4, S::npos));
4878   BOOST_TEST(testFL(S("ghasdbnjqo"), "jscie", 0, 5, S::npos));
4879   BOOST_TEST(testFL(S("igrkhpbqjt"), "efsphndliq", 0, 0, S::npos));
4880   BOOST_TEST(testFL(S("ikthdgcamf"), "gdicosleja", 0, 1, S::npos));
4881   BOOST_TEST(testFL(S("pcofgeniam"), "qcpjibosfl", 0, 5, 0));
4882   BOOST_TEST(testFL(S("rlfjgesqhc"), "lrhmefnjcq", 0, 9, 0));
4883   BOOST_TEST(testFL(S("itphbqsker"), "dtablcrseo", 0, 10, S::npos));
4884   BOOST_TEST(testFL(S("skjafcirqm"), "apckjsftedbhgomrnilq", 0, 0, S::npos));
4885   BOOST_TEST(testFL(S("tcqomarsfd"), "pcbrgflehjtiadnsokqm", 0, 1, S::npos));
4886   BOOST_TEST(testFL(S("rocfeldqpk"), "nsiadegjklhobrmtqcpf", 0, 10, S::npos));
4887   BOOST_TEST(testFL(S("cfpegndlkt"), "cpmajdqnolikhgsbretf", 0, 19, 0));
4888   BOOST_TEST(testFL(S("fqbtnkeasj"), "jcflkntmgiqrphdosaeb", 0, 20, 0));
4889   BOOST_TEST(testFL(S("shbcqnmoar"), "", 1, 0, S::npos));
4890   BOOST_TEST(testFL(S("bdoshlmfin"), "ontrs", 1, 0, S::npos));
4891   BOOST_TEST(testFL(S("khfrebnsgq"), "pfkna", 1, 1, S::npos));
4892   BOOST_TEST(testFL(S("getcrsaoji"), "ekosa", 1, 2, 1));
4893   BOOST_TEST(testFL(S("fjiknedcpq"), "anqhk", 1, 4, S::npos));
4894   BOOST_TEST(testFL(S("tkejgnafrm"), "jekca", 1, 5, 1));
4895   BOOST_TEST(testFL(S("jnakolqrde"), "ikemsjgacf", 1, 0, S::npos));
4896   BOOST_TEST(testFL(S("lcjptsmgbe"), "arolgsjkhm", 1, 1, S::npos));
4897   BOOST_TEST(testFL(S("itfsmcjorl"), "oftkbldhre", 1, 5, 1));
4898   BOOST_TEST(testFL(S("omchkfrjea"), "gbkqdoeftl", 1, 9, 0));
4899   BOOST_TEST(testFL(S("cigfqkated"), "sqcflrgtim", 1, 10, 1));
4900   BOOST_TEST(testFL(S("tscenjikml"), "fmhbkislrjdpanogqcet", 1, 0, S::npos));
4901   BOOST_TEST(testFL(S("qcpaemsinf"), "rnioadktqlgpbcjsmhef", 1, 1, S::npos));
4902   BOOST_TEST(testFL(S("gltkojeipd"), "oakgtnldpsefihqmjcbr", 1, 10, 1));
4903   BOOST_TEST(testFL(S("qistfrgnmp"), "gbnaelosidmcjqktfhpr", 1, 19, 1));
4904   BOOST_TEST(testFL(S("bdnpfcqaem"), "akbripjhlosndcmqgfet", 1, 20, 1));
4905   BOOST_TEST(testFL(S("ectnhskflp"), "", 5, 0, S::npos));
4906   BOOST_TEST(testFL(S("fgtianblpq"), "pijag", 5, 0, S::npos));
4907   BOOST_TEST(testFL(S("mfeqklirnh"), "jrckd", 5, 1, S::npos));
4908   BOOST_TEST(testFL(S("astedncjhk"), "qcloh", 5, 2, S::npos));
4909   BOOST_TEST(testFL(S("fhlqgcajbr"), "thlmp", 5, 4, 2));
4910   BOOST_TEST(testFL(S("epfhocmdng"), "qidmo", 5, 5, 4));
4911   BOOST_TEST(testFL(S("apcnsibger"), "lnegpsjqrd", 5, 0, S::npos));
4912   BOOST_TEST(testFL(S("aqkocrbign"), "rjqdablmfs", 5, 1, 5));
4913   BOOST_TEST(testFL(S("ijsmdtqgce"), "enkgpbsjaq", 5, 5, S::npos));
4914   BOOST_TEST(testFL(S("clobgsrken"), "kdsgoaijfh", 5, 9, 5));
4915   BOOST_TEST(testFL(S("jbhcfposld"), "trfqgmckbe", 5, 10, 4));
4916   BOOST_TEST(testFL(S("oqnpblhide"), "igetsracjfkdnpoblhqm", 5, 0, S::npos));
4917   BOOST_TEST(testFL(S("lroeasctif"), "nqctfaogirshlekbdjpm", 5, 1, S::npos));
4918   BOOST_TEST(testFL(S("bpjlgmiedh"), "csehfgomljdqinbartkp", 5, 10, 5));
4919   BOOST_TEST(testFL(S("pamkeoidrj"), "qahoegcmplkfsjbdnitr", 5, 19, 5));
4920   BOOST_TEST(testFL(S("espogqbthk"), "dpteiajrqmsognhlfbkc", 5, 20, 5));
4921   BOOST_TEST(testFL(S("shoiedtcjb"), "", 9, 0, S::npos));
4922   BOOST_TEST(testFL(S("ebcinjgads"), "tqbnh", 9, 0, S::npos));
4923   BOOST_TEST(testFL(S("dqmregkcfl"), "akmle", 9, 1, S::npos));
4924   BOOST_TEST(testFL(S("ngcrieqajf"), "iqfkm", 9, 2, 6));
4925   BOOST_TEST(testFL(S("qosmilgnjb"), "tqjsr", 9, 4, 8));
4926   BOOST_TEST(testFL(S("ikabsjtdfl"), "jplqg", 9, 5, 9));
4927   BOOST_TEST(testFL(S("ersmicafdh"), "oilnrbcgtj", 9, 0, S::npos));
4928   BOOST_TEST(testFL(S("fdnplotmgh"), "morkglpesn", 9, 1, 7));
4929   BOOST_TEST(testFL(S("fdbicojerm"), "dmicerngat", 9, 5, 9));
4930   BOOST_TEST(testFL(S("mbtafndjcq"), "radgeskbtc", 9, 9, 6));
4931   BOOST_TEST(testFL(S("mlenkpfdtc"), "ljikprsmqo", 9, 10, 5));
4932   BOOST_TEST(testFL(S("ahlcifdqgs"), "trqihkcgsjamfdbolnpe", 9, 0, S::npos));
4933   BOOST_TEST(testFL(S("bgjemaltks"), "lqmthbsrekajgnofcipd", 9, 1, 6));
4934   BOOST_TEST(testFL(S("pdhslbqrfc"), "jtalmedribkgqsopcnfh", 9, 10, 7));
4935   BOOST_TEST(testFL(S("dirhtsnjkc"), "spqfoiclmtagejbndkrh", 9, 19, 9));
4936   BOOST_TEST(testFL(S("dlroktbcja"), "nmotklspigjrdhcfaebq", 9, 20, 9));
4937   BOOST_TEST(testFL(S("ncjpmaekbs"), "", 10, 0, S::npos));
4938   BOOST_TEST(testFL(S("hlbosgmrak"), "hpmsd", 10, 0, S::npos));
4939   BOOST_TEST(testFL(S("pqfhsgilen"), "qnpor", 10, 1, 1));
4940   BOOST_TEST(testFL(S("gqtjsbdckh"), "otdma", 10, 2, 2));
4941   BOOST_TEST(testFL(S("cfkqpjlegi"), "efhjg", 10, 4, 7));
4942   BOOST_TEST(testFL(S("beanrfodgj"), "odpte", 10, 5, 7));
4943   BOOST_TEST(testFL(S("adtkqpbjfi"), "bctdgfmolr", 10, 0, S::npos));
4944   BOOST_TEST(testFL(S("iomkfthagj"), "oaklidrbqg", 10, 1, 1));
4945   BOOST_TEST(testFL(S("sdpcilonqj"), "dnjfsagktr", 10, 5, 9));
4946   BOOST_TEST(testFL(S("gtfbdkqeml"), "nejaktmiqg", 10, 9, 8));
4947   BOOST_TEST(testFL(S("bmeqgcdorj"), "pjqonlebsf", 10, 10, 9));
4948   BOOST_TEST(testFL(S("etqlcanmob"), "dshmnbtolcjepgaikfqr", 10, 0, S::npos));
4949   BOOST_TEST(testFL(S("roqmkbdtia"), "iogfhpabtjkqlrnemcds", 10, 1, 8));
4950   BOOST_TEST(testFL(S("kadsithljf"), "ngridfabjsecpqltkmoh", 10, 10, 9));
4951   BOOST_TEST(testFL(S("sgtkpbfdmh"), "athmknplcgofrqejsdib", 10, 19, 9));
4952   BOOST_TEST(testFL(S("qgmetnabkl"), "ldobhmqcafnjtkeisgrp", 10, 20, 9));
4953   BOOST_TEST(testFL(S("cqjohampgd"), "", 11, 0, S::npos));
4954   BOOST_TEST(testFL(S("hobitmpsan"), "aocjb", 11, 0, S::npos));
4955   BOOST_TEST(testFL(S("tjehkpsalm"), "jbrnk", 11, 1, 1));
4956   BOOST_TEST(testFL(S("ngfbojitcl"), "tqedg", 11, 2, 7));
4957   BOOST_TEST(testFL(S("rcfkdbhgjo"), "nqskp", 11, 4, 3));
4958   BOOST_TEST(testFL(S("qghptonrea"), "eaqkl", 11, 5, 9));
4959   BOOST_TEST(testFL(S("hnprfgqjdl"), "reaoicljqm", 11, 0, S::npos));
4960   BOOST_TEST(testFL(S("hlmgabenti"), "lsftgajqpm", 11, 1, 1));
4961   BOOST_TEST(testFL(S("ofcjanmrbs"), "rlpfogmits", 11, 5, 7));
4962   BOOST_TEST(testFL(S("jqedtkornm"), "shkncmiaqj", 11, 9, 9));
4963   BOOST_TEST(testFL(S("rfedlasjmg"), "fpnatrhqgs", 11, 10, 9));
4964   BOOST_TEST(testFL(S("talpqjsgkm"), "sjclemqhnpdbgikarfot", 11, 0, S::npos));
4965   BOOST_TEST(testFL(S("lrkcbtqpie"), "otcmedjikgsfnqbrhpla", 11, 1, S::npos));
4966   BOOST_TEST(testFL(S("cipogdskjf"), "bonsaefdqiprkhlgtjcm", 11, 10, 9));
4967   BOOST_TEST(testFL(S("nqedcojahi"), "egpscmahijlfnkrodqtb", 11, 19, 9));
4968   BOOST_TEST(testFL(S("hefnrkmctj"), "kmqbfepjthgilscrndoa", 11, 20, 9));
4969   BOOST_TEST(testFL(S("atqirnmekfjolhpdsgcb"), "", 0, 0, S::npos));
4970   BOOST_TEST(testFL(S("echfkmlpribjnqsaogtd"), "prboq", 0, 0, S::npos));
4971   BOOST_TEST(testFL(S("qnhiftdgcleajbpkrosm"), "fjcqh", 0, 1, S::npos));
4972   BOOST_TEST(testFL(S("chamfknorbedjitgslpq"), "fmosa", 0, 2, S::npos));
4973   BOOST_TEST(testFL(S("njhqpibfmtlkaecdrgso"), "qdbok", 0, 4, S::npos));
4974   BOOST_TEST(testFL(S("ebnghfsqkprmdcljoiat"), "amslg", 0, 5, S::npos));
4975   BOOST_TEST(testFL(S("letjomsgihfrpqbkancd"), "smpltjneqb", 0, 0, S::npos));
4976   BOOST_TEST(testFL(S("nblgoipcrqeaktshjdmf"), "flitskrnge", 0, 1, S::npos));
4977   BOOST_TEST(testFL(S("cehkbngtjoiflqapsmrd"), "pgqihmlbef", 0, 5, S::npos));
4978   BOOST_TEST(testFL(S("mignapfoklbhcqjetdrs"), "cfpdqjtgsb", 0, 9, S::npos));
4979   BOOST_TEST(testFL(S("ceatbhlsqjgpnokfrmdi"), "htpsiaflom", 0, 10, S::npos));
4980   BOOST_TEST(testFL(S("ocihkjgrdelpfnmastqb"), "kpjfiaceghsrdtlbnomq", 0, 0, S::npos));
4981   BOOST_TEST(testFL(S("noelgschdtbrjfmiqkap"), "qhtbomidljgafneksprc", 0, 1, S::npos));
4982   BOOST_TEST(testFL(S("dkclqfombepritjnghas"), "nhtjobkcefldimpsaqgr", 0, 10, S::npos));
4983   BOOST_TEST(testFL(S("miklnresdgbhqcojftap"), "prabcjfqnoeskilmtgdh", 0, 19, 0));
4984   BOOST_TEST(testFL(S("htbcigojaqmdkfrnlsep"), "dtrgmchilkasqoebfpjn", 0, 20, 0));
4985   BOOST_TEST(testFL(S("febhmqtjanokscdirpgl"), "", 1, 0, S::npos));
4986   BOOST_TEST(testFL(S("loakbsqjpcrdhftniegm"), "sqome", 1, 0, S::npos));
4987   BOOST_TEST(testFL(S("reagphsqflbitdcjmkno"), "smfte", 1, 1, S::npos));
4988   BOOST_TEST(testFL(S("jitlfrqemsdhkopncabg"), "ciboh", 1, 2, 1));
4989   BOOST_TEST(testFL(S("mhtaepscdnrjqgbkifol"), "haois", 1, 4, 1));
4990   BOOST_TEST(testFL(S("tocesrfmnglpbjihqadk"), "abfki", 1, 5, S::npos));
4991   BOOST_TEST(testFL(S("lpfmctjrhdagneskbqoi"), "frdkocntmq", 1, 0, S::npos));
4992   BOOST_TEST(testFL(S("lsmqaepkdhncirbtjfgo"), "oasbpedlnr", 1, 1, S::npos));
4993   BOOST_TEST(testFL(S("epoiqmtldrabnkjhcfsg"), "kltqmhgand", 1, 5, S::npos));
4994   BOOST_TEST(testFL(S("emgasrilpknqojhtbdcf"), "gdtfjchpmr", 1, 9, 1));
4995   BOOST_TEST(testFL(S("hnfiagdpcklrjetqbsom"), "ponmcqblet", 1, 10, 1));
4996   BOOST_TEST(testFL(S("nsdfebgajhmtricpoklq"), "sgphqdnofeiklatbcmjr", 1, 0, S::npos));
4997   BOOST_TEST(testFL(S("atjgfsdlpobmeiqhncrk"), "ljqprsmigtfoneadckbh", 1, 1, S::npos));
4998   BOOST_TEST(testFL(S("sitodfgnrejlahcbmqkp"), "ligeojhafnkmrcsqtbdp", 1, 10, 1));
4999   BOOST_TEST(testFL(S("fraghmbiceknltjpqosd"), "lsimqfnjarbopedkhcgt", 1, 19, 1));
5000   BOOST_TEST(testFL(S("pmafenlhqtdbkirjsogc"), "abedmfjlghniorcqptks", 1, 20, 1));
5001   BOOST_TEST(testFL(S("pihgmoeqtnakrjslcbfd"), "", 10, 0, S::npos));
5002   BOOST_TEST(testFL(S("gjdkeprctqblnhiafsom"), "hqtoa", 10, 0, S::npos));
5003   BOOST_TEST(testFL(S("mkpnblfdsahrcqijteog"), "cahif", 10, 1, S::npos));
5004   BOOST_TEST(testFL(S("gckarqnelodfjhmbptis"), "kehis", 10, 2, 7));
5005   BOOST_TEST(testFL(S("gqpskidtbclomahnrjfe"), "kdlmh", 10, 4, 10));
5006   BOOST_TEST(testFL(S("pkldjsqrfgitbhmaecno"), "paeql", 10, 5, 6));
5007   BOOST_TEST(testFL(S("aftsijrbeklnmcdqhgop"), "aghoqiefnb", 10, 0, S::npos));
5008   BOOST_TEST(testFL(S("mtlgdrhafjkbiepqnsoc"), "jrbqaikpdo", 10, 1, 9));
5009   BOOST_TEST(testFL(S("pqgirnaefthokdmbsclj"), "smjonaeqcl", 10, 5, 5));
5010   BOOST_TEST(testFL(S("kpdbgjmtherlsfcqoina"), "eqbdrkcfah", 10, 9, 10));
5011   BOOST_TEST(testFL(S("jrlbothiknqmdgcfasep"), "kapmsienhf", 10, 10, 9));
5012   BOOST_TEST(testFL(S("mjogldqferckabinptsh"), "jpqotrlenfcsbhkaimdg", 10, 0, S::npos));
5013   BOOST_TEST(testFL(S("apoklnefbhmgqcdrisjt"), "jlbmhnfgtcqprikeados", 10, 1, S::npos));
5014   BOOST_TEST(testFL(S("ifeopcnrjbhkdgatmqls"), "stgbhfmdaljnpqoicker", 10, 10, 10));
5015   BOOST_TEST(testFL(S("ckqhaiesmjdnrgolbtpf"), "oihcetflbjagdsrkmqpn", 10, 19, 10));
5016   BOOST_TEST(testFL(S("bnlgapfimcoterskqdjh"), "adtclebmnpjsrqfkigoh", 10, 20, 10));
5017   BOOST_TEST(testFL(S("kgdlrobpmjcthqsafeni"), "", 19, 0, S::npos));
5018   BOOST_TEST(testFL(S("dfkechomjapgnslbtqir"), "beafg", 19, 0, S::npos));
5019   BOOST_TEST(testFL(S("rloadknfbqtgmhcsipje"), "iclat", 19, 1, 16));
5020   BOOST_TEST(testFL(S("mgjhkolrnadqbpetcifs"), "rkhnf", 19, 2, 7));
5021   BOOST_TEST(testFL(S("cmlfakiojdrgtbsphqen"), "clshq", 19, 4, 16));
5022   BOOST_TEST(testFL(S("kghbfipeomsntdalrqjc"), "dtcoj", 19, 5, 19));
5023   BOOST_TEST(testFL(S("eldiqckrnmtasbghjfpo"), "rqosnjmfth", 19, 0, S::npos));
5024   BOOST_TEST(testFL(S("abqjcfedgotihlnspkrm"), "siatdfqglh", 19, 1, 15));
5025   BOOST_TEST(testFL(S("qfbadrtjsimkolcenhpg"), "mrlshtpgjq", 19, 5, 17));
5026   BOOST_TEST(testFL(S("abseghclkjqifmtodrnp"), "adlcskgqjt", 19, 9, 16));
5027   BOOST_TEST(testFL(S("ibmsnlrjefhtdokacqpg"), "drshcjknaf", 19, 10, 16));
5028   BOOST_TEST(testFL(S("mrkfciqjebaponsthldg"), "etsaqroinghpkjdlfcbm", 19, 0, S::npos));
5029   BOOST_TEST(testFL(S("mjkticdeoqshpalrfbgn"), "sgepdnkqliambtrocfhj", 19, 1, 10));
5030   BOOST_TEST(testFL(S("rqnoclbdejgiphtfsakm"), "nlmcjaqgbsortfdihkpe", 19, 10, 19));
5031   BOOST_TEST(testFL(S("plkqbhmtfaeodjcrsing"), "racfnpmosldibqkghjet", 19, 19, 19));
5032   BOOST_TEST(testFL(S("oegalhmstjrfickpbndq"), "fjhdsctkqeiolagrnmbp", 19, 20, 19));
5033   BOOST_TEST(testFL(S("rdtgjcaohpblniekmsfq"), "", 20, 0, S::npos));
5034   BOOST_TEST(testFL(S("ofkqbnjetrmsaidphglc"), "ejanp", 20, 0, S::npos));
5035   BOOST_TEST(testFL(S("grkpahljcftesdmonqib"), "odife", 20, 1, 15));
5036   BOOST_TEST(testFL(S("jimlgbhfqkteospardcn"), "okaqd", 20, 2, 12));
5037   BOOST_TEST(testFL(S("gftenihpmslrjkqadcob"), "lcdbi", 20, 4, 19));
5038   BOOST_TEST(testFL(S("bmhldogtckrfsanijepq"), "fsqbj", 20, 5, 19));
5039   BOOST_TEST(testFL(S("nfqkrpjdesabgtlcmoih"), "bigdomnplq", 20, 0, S::npos));
5040   BOOST_TEST(testFL(S("focalnrpiqmdkstehbjg"), "apiblotgcd", 20, 1, 3));
5041   BOOST_TEST(testFL(S("rhqdspkmebiflcotnjga"), "acfhdenops", 20, 5, 19));
5042   BOOST_TEST(testFL(S("rahdtmsckfboqlpniegj"), "jopdeamcrk", 20, 9, 19));
5043   BOOST_TEST(testFL(S("fbkeiopclstmdqranjhg"), "trqncbkgmh", 20, 10, 19));
5044   BOOST_TEST(testFL(S("lifhpdgmbconstjeqark"), "tomglrkencbsfjqpihda", 20, 0, S::npos));
5045   BOOST_TEST(testFL(S("pboqganrhedjmltsicfk"), "gbkhdnpoietfcmrslajq", 20, 1, 4));
5046   BOOST_TEST(testFL(S("klchabsimetjnqgorfpd"), "rtfnmbsglkjaichoqedp", 20, 10, 17));
5047   BOOST_TEST(testFL(S("sirfgmjqhctndbklaepo"), "ohkmdpfqbsacrtjnlgei", 20, 19, 19));
5048   BOOST_TEST(testFL(S("rlbdsiceaonqjtfpghkm"), "dlbrteoisgphmkncajfq", 20, 20, 19));
5049   BOOST_TEST(testFL(S("ecgdanriptblhjfqskom"), "", 21, 0, S::npos));
5050   BOOST_TEST(testFL(S("fdmiarlpgcskbhoteqjn"), "sjrlo", 21, 0, S::npos));
5051   BOOST_TEST(testFL(S("rlbstjqopignecmfadkh"), "qjpor", 21, 1, 6));
5052   BOOST_TEST(testFL(S("grjpqmbshektdolcafni"), "odhfn", 21, 2, 13));
5053   BOOST_TEST(testFL(S("sakfcohtqnibprjmlged"), "qtfin", 21, 4, 10));
5054   BOOST_TEST(testFL(S("mjtdglasihqpocebrfkn"), "hpqfo", 21, 5, 17));
5055   BOOST_TEST(testFL(S("okaplfrntghqbmeicsdj"), "fabmertkos", 21, 0, S::npos));
5056   BOOST_TEST(testFL(S("sahngemrtcjidqbklfpo"), "brqtgkmaej", 21, 1, 14));
5057   BOOST_TEST(testFL(S("dlmsipcnekhbgoaftqjr"), "nfrdeihsgl", 21, 5, 19));
5058   BOOST_TEST(testFL(S("ahegrmqnoiklpfsdbcjt"), "hlfrosekpi", 21, 9, 14));
5059   BOOST_TEST(testFL(S("hdsjbnmlegtkqripacof"), "atgbkrjdsm", 21, 10, 16));
5060   BOOST_TEST(testFL(S("pcnedrfjihqbalkgtoms"), "blnrptjgqmaifsdkhoec", 21, 0, S::npos));
5061   BOOST_TEST(testFL(S("qjidealmtpskrbfhocng"), "ctpmdahebfqjgknloris", 21, 1, 17));
5062   BOOST_TEST(testFL(S("qeindtagmokpfhsclrbj"), "apnkeqthrmlbfodiscgj", 21, 10, 17));
5063   BOOST_TEST(testFL(S("kpfegbjhsrnodltqciam"), "jdgictpframeoqlsbknh", 21, 19, 19));
5064   BOOST_TEST(testFL(S("hnbrcplsjfgiktoedmaq"), "qprlsfojamgndekthibc", 21, 20, 19));
5065 
5066 
5067 
5068 
5069 
5070 
5071 
5072   // find_first_not_of
5073 
5074   const char* cs3 = "12456";
5075   const char* cs4 = "2356";
5076   string_view v3 = cs3;
5077   string_view v4 = cs4;
5078   static_string<5> fs3 = cs3;
5079   static_string<4> fs4 = cs4;
5080 
5081   BOOST_TEST(fs1.find_first_not_of(v3) == 2);
5082   BOOST_TEST(fs1.find_first_not_of(v4) == 0);
5083   BOOST_TEST(fs1.find_first_not_of(fs3) == 2);
5084   BOOST_TEST(fs1.find_first_not_of(fs4) == 0);
5085 
5086   BOOST_TEST(fs1.find_first_not_of(cs3) == 2);
5087   BOOST_TEST(fs1.find_first_not_of(cs4) == 0);
5088 
5089   BOOST_TEST(fs1.find_first_not_of(cs3, 0) == 2);
5090   BOOST_TEST(fs1.find_first_not_of(cs4, 0) == 0);
5091 
5092   BOOST_TEST(fs1.find_first_not_of(cs4, 0, 2) == 0);
5093 
5094   BOOST_TEST(fs1.find_first_not_of(cs3, 4) == S::npos);
5095   BOOST_TEST(fs1.find_first_not_of(cs4, 4) == S::npos);
5096 
5097   BOOST_TEST(fs1.find_first_not_of('1') == 1);
5098   BOOST_TEST(fs1.find_first_not_of('1', 3) == 3);
5099 
5100 
5101 
5102 
5103 
5104   BOOST_TEST(testFFN(S(""), "", 0, 0, S::npos));
5105   BOOST_TEST(testFFN(S(""), "irkhs", 0, 0, S::npos));
5106   BOOST_TEST(testFFN(S(""), "kante", 0, 1, S::npos));
5107   BOOST_TEST(testFFN(S(""), "oknlr", 0, 2, S::npos));
5108   BOOST_TEST(testFFN(S(""), "pcdro", 0, 4, S::npos));
5109   BOOST_TEST(testFFN(S(""), "bnrpe", 0, 5, S::npos));
5110   BOOST_TEST(testFFN(S(""), "jtdaefblso", 0, 0, S::npos));
5111   BOOST_TEST(testFFN(S(""), "oselktgbca", 0, 1, S::npos));
5112   BOOST_TEST(testFFN(S(""), "eqgaplhckj", 0, 5, S::npos));
5113   BOOST_TEST(testFFN(S(""), "bjahtcmnlp", 0, 9, S::npos));
5114   BOOST_TEST(testFFN(S(""), "hjlcmgpket", 0, 10, S::npos));
5115   BOOST_TEST(testFFN(S(""), "htaobedqikfplcgjsmrn", 0, 0, S::npos));
5116   BOOST_TEST(testFFN(S(""), "hpqiarojkcdlsgnmfetb", 0, 1, S::npos));
5117   BOOST_TEST(testFFN(S(""), "dfkaprhjloqetcsimnbg", 0, 10, S::npos));
5118   BOOST_TEST(testFFN(S(""), "ihqrfebgadntlpmjksoc", 0, 19, S::npos));
5119   BOOST_TEST(testFFN(S(""), "ngtjfcalbseiqrphmkdo", 0, 20, S::npos));
5120   BOOST_TEST(testFFN(S(""), "", 1, 0, S::npos));
5121   BOOST_TEST(testFFN(S(""), "lbtqd", 1, 0, S::npos));
5122   BOOST_TEST(testFFN(S(""), "tboim", 1, 1, S::npos));
5123   BOOST_TEST(testFFN(S(""), "slcer", 1, 2, S::npos));
5124   BOOST_TEST(testFFN(S(""), "cbjfs", 1, 4, S::npos));
5125   BOOST_TEST(testFFN(S(""), "aqibs", 1, 5, S::npos));
5126   BOOST_TEST(testFFN(S(""), "gtfblmqinc", 1, 0, S::npos));
5127   BOOST_TEST(testFFN(S(""), "mkqpbtdalg", 1, 1, S::npos));
5128   BOOST_TEST(testFFN(S(""), "kphatlimcd", 1, 5, S::npos));
5129   BOOST_TEST(testFFN(S(""), "pblasqogic", 1, 9, S::npos));
5130   BOOST_TEST(testFFN(S(""), "arosdhcfme", 1, 10, S::npos));
5131   BOOST_TEST(testFFN(S(""), "blkhjeogicatqfnpdmsr", 1, 0, S::npos));
5132   BOOST_TEST(testFFN(S(""), "bmhineprjcoadgstflqk", 1, 1, S::npos));
5133   BOOST_TEST(testFFN(S(""), "djkqcmetslnghpbarfoi", 1, 10, S::npos));
5134   BOOST_TEST(testFFN(S(""), "lgokshjtpbemarcdqnfi", 1, 19, S::npos));
5135   BOOST_TEST(testFFN(S(""), "bqjhtkfepimcnsgrlado", 1, 20, S::npos));
5136   BOOST_TEST(testFFN(S("eaint"), "", 0, 0, 0));
5137   BOOST_TEST(testFFN(S("binja"), "gfsrt", 0, 0, 0));
5138   BOOST_TEST(testFFN(S("latkm"), "pfsoc", 0, 1, 0));
5139   BOOST_TEST(testFFN(S("lecfr"), "tpflm", 0, 2, 0));
5140   BOOST_TEST(testFFN(S("eqkst"), "sgkec", 0, 4, 1));
5141   BOOST_TEST(testFFN(S("cdafr"), "romds", 0, 5, 0));
5142   BOOST_TEST(testFFN(S("prbhe"), "qhjistlgmr", 0, 0, 0));
5143   BOOST_TEST(testFFN(S("lbisk"), "pedfirsglo", 0, 1, 0));
5144   BOOST_TEST(testFFN(S("hrlpd"), "aqcoslgrmk", 0, 5, 0));
5145   BOOST_TEST(testFFN(S("ehmja"), "dabckmepqj", 0, 9, 1));
5146   BOOST_TEST(testFFN(S("mhqgd"), "pqscrjthli", 0, 10, 0));
5147   BOOST_TEST(testFFN(S("tgklq"), "kfphdcsjqmobliagtren", 0, 0, 0));
5148   BOOST_TEST(testFFN(S("bocjs"), "rokpefncljibsdhqtagm", 0, 1, 0));
5149   BOOST_TEST(testFFN(S("grbsd"), "afionmkphlebtcjqsgrd", 0, 10, 0));
5150   BOOST_TEST(testFFN(S("ofjqr"), "aenmqplidhkofrjbctsg", 0, 19, S::npos));
5151   BOOST_TEST(testFFN(S("btlfi"), "osjmbtcadhiklegrpqnf", 0, 20, S::npos));
5152   BOOST_TEST(testFFN(S("clrgb"), "", 1, 0, 1));
5153   BOOST_TEST(testFFN(S("tjmek"), "osmia", 1, 0, 1));
5154   BOOST_TEST(testFFN(S("bgstp"), "ckonl", 1, 1, 1));
5155   BOOST_TEST(testFFN(S("hstrk"), "ilcaj", 1, 2, 1));
5156   BOOST_TEST(testFFN(S("kmspj"), "lasiq", 1, 4, 1));
5157   BOOST_TEST(testFFN(S("tjboh"), "kfqmr", 1, 5, 1));
5158   BOOST_TEST(testFFN(S("ilbcj"), "klnitfaobg", 1, 0, 1));
5159   BOOST_TEST(testFFN(S("jkngf"), "gjhmdlqikp", 1, 1, 1));
5160   BOOST_TEST(testFFN(S("gfcql"), "skbgtahqej", 1, 5, 1));
5161   BOOST_TEST(testFFN(S("dqtlg"), "bjsdgtlpkf", 1, 9, 1));
5162   BOOST_TEST(testFFN(S("bthpg"), "bjgfmnlkio", 1, 10, 1));
5163   BOOST_TEST(testFFN(S("dgsnq"), "lbhepotfsjdqigcnamkr", 1, 0, 1));
5164   BOOST_TEST(testFFN(S("rmfhp"), "tebangckmpsrqdlfojhi", 1, 1, 1));
5165   BOOST_TEST(testFFN(S("jfdam"), "joflqbdkhtegimscpanr", 1, 10, 3));
5166   BOOST_TEST(testFFN(S("edapb"), "adpmcohetfbsrjinlqkg", 1, 19, S::npos));
5167   BOOST_TEST(testFFN(S("brfsm"), "iacldqjpfnogbsrhmetk", 1, 20, S::npos));
5168   BOOST_TEST(testFFN(S("ndrhl"), "", 2, 0, 2));
5169   BOOST_TEST(testFFN(S("mrecp"), "otkgb", 2, 0, 2));
5170   BOOST_TEST(testFFN(S("qlasf"), "cqsjl", 2, 1, 2));
5171   BOOST_TEST(testFFN(S("smaqd"), "dpifl", 2, 2, 2));
5172   BOOST_TEST(testFFN(S("hjeni"), "oapht", 2, 4, 2));
5173   BOOST_TEST(testFFN(S("ocmfj"), "cifts", 2, 5, 2));
5174   BOOST_TEST(testFFN(S("hmftq"), "nmsckbgalo", 2, 0, 2));
5175   BOOST_TEST(testFFN(S("fklad"), "tpksqhamle", 2, 1, 2));
5176   BOOST_TEST(testFFN(S("dirnm"), "tpdrchmkji", 2, 5, 3));
5177   BOOST_TEST(testFFN(S("hrgdc"), "ijagfkblst", 2, 9, 3));
5178   BOOST_TEST(testFFN(S("ifakg"), "kpocsignjb", 2, 10, 2));
5179   BOOST_TEST(testFFN(S("ebrgd"), "pecqtkjsnbdrialgmohf", 2, 0, 2));
5180   BOOST_TEST(testFFN(S("rcjml"), "aiortphfcmkjebgsndql", 2, 1, 2));
5181   BOOST_TEST(testFFN(S("peqmt"), "sdbkeamglhipojqftrcn", 2, 10, 2));
5182   BOOST_TEST(testFFN(S("frehn"), "ljqncehgmfktroapidbs", 2, 19, S::npos));
5183   BOOST_TEST(testFFN(S("tqolf"), "rtcfodilamkbenjghqps", 2, 20, S::npos));
5184   BOOST_TEST(testFFN(S("cjgao"), "", 4, 0, 4));
5185   BOOST_TEST(testFFN(S("kjplq"), "mabns", 4, 0, 4));
5186   BOOST_TEST(testFFN(S("herni"), "bdnrp", 4, 1, 4));
5187   BOOST_TEST(testFFN(S("tadrb"), "scidp", 4, 2, 4));
5188   BOOST_TEST(testFFN(S("pkfeo"), "agbjl", 4, 4, 4));
5189   BOOST_TEST(testFFN(S("hoser"), "jfmpr", 4, 5, S::npos));
5190   BOOST_TEST(testFFN(S("kgrsp"), "rbpefghsmj", 4, 0, 4));
5191   BOOST_TEST(testFFN(S("pgejb"), "apsfntdoqc", 4, 1, 4));
5192   BOOST_TEST(testFFN(S("thlnq"), "ndkjeisgcl", 4, 5, 4));
5193   BOOST_TEST(testFFN(S("nbmit"), "rnfpqatdeo", 4, 9, S::npos));
5194   BOOST_TEST(testFFN(S("jgmib"), "bntjlqrfik", 4, 10, S::npos));
5195   BOOST_TEST(testFFN(S("ncrfj"), "kcrtmpolnaqejghsfdbi", 4, 0, 4));
5196   BOOST_TEST(testFFN(S("ncsik"), "lobheanpkmqidsrtcfgj", 4, 1, 4));
5197   BOOST_TEST(testFFN(S("sgbfh"), "athdkljcnreqbgpmisof", 4, 10, S::npos));
5198   BOOST_TEST(testFFN(S("dktbn"), "qkdmjialrscpbhefgont", 4, 19, S::npos));
5199   BOOST_TEST(testFFN(S("fthqm"), "dmasojntqleribkgfchp", 4, 20, S::npos));
5200   BOOST_TEST(testFFN(S("klopi"), "", 5, 0, S::npos));
5201   BOOST_TEST(testFFN(S("dajhn"), "psthd", 5, 0, S::npos));
5202   BOOST_TEST(testFFN(S("jbgno"), "rpmjd", 5, 1, S::npos));
5203   BOOST_TEST(testFFN(S("hkjae"), "dfsmk", 5, 2, S::npos));
5204   BOOST_TEST(testFFN(S("gbhqo"), "skqne", 5, 4, S::npos));
5205   BOOST_TEST(testFFN(S("ktdor"), "kipnf", 5, 5, S::npos));
5206   BOOST_TEST(testFFN(S("ldprn"), "hmrnqdgifl", 5, 0, S::npos));
5207   BOOST_TEST(testFFN(S("egmjk"), "fsmjcdairn", 5, 1, S::npos));
5208   BOOST_TEST(testFFN(S("armql"), "pcdgltbrfj", 5, 5, S::npos));
5209   BOOST_TEST(testFFN(S("cdhjo"), "aekfctpirg", 5, 9, S::npos));
5210   BOOST_TEST(testFFN(S("jcons"), "ledihrsgpf", 5, 10, S::npos));
5211   BOOST_TEST(testFFN(S("cbrkp"), "mqcklahsbtirgopefndj", 5, 0, S::npos));
5212   BOOST_TEST(testFFN(S("fhgna"), "kmlthaoqgecrnpdbjfis", 5, 1, S::npos));
5213   BOOST_TEST(testFFN(S("ejfcd"), "sfhbamcdptojlkrenqgi", 5, 10, S::npos));
5214   BOOST_TEST(testFFN(S("kqjhe"), "pbniofmcedrkhlstgaqj", 5, 19, S::npos));
5215   BOOST_TEST(testFFN(S("pbdjl"), "mongjratcskbhqiepfdl", 5, 20, S::npos));
5216   BOOST_TEST(testFFN(S("gajqn"), "", 6, 0, S::npos));
5217   BOOST_TEST(testFFN(S("stedk"), "hrnat", 6, 0, S::npos));
5218   BOOST_TEST(testFFN(S("tjkaf"), "gsqdt", 6, 1, S::npos));
5219   BOOST_TEST(testFFN(S("dthpe"), "bspkd", 6, 2, S::npos));
5220   BOOST_TEST(testFFN(S("klhde"), "ohcmb", 6, 4, S::npos));
5221   BOOST_TEST(testFFN(S("bhlki"), "heatr", 6, 5, S::npos));
5222   BOOST_TEST(testFFN(S("lqmoh"), "pmblckedfn", 6, 0, S::npos));
5223   BOOST_TEST(testFFN(S("mtqin"), "aceqmsrbik", 6, 1, S::npos));
5224   BOOST_TEST(testFFN(S("dpqbr"), "lmbtdehjrn", 6, 5, S::npos));
5225   BOOST_TEST(testFFN(S("kdhmo"), "teqmcrlgib", 6, 9, S::npos));
5226   BOOST_TEST(testFFN(S("jblqp"), "njolbmspac", 6, 10, S::npos));
5227   BOOST_TEST(testFFN(S("qmjgl"), "pofnhidklamecrbqjgst", 6, 0, S::npos));
5228   BOOST_TEST(testFFN(S("rothp"), "jbhckmtgrqnosafedpli", 6, 1, S::npos));
5229   BOOST_TEST(testFFN(S("ghknq"), "dobntpmqklicsahgjerf", 6, 10, S::npos));
5230   BOOST_TEST(testFFN(S("eopfi"), "tpdshainjkbfoemlrgcq", 6, 19, S::npos));
5231   BOOST_TEST(testFFN(S("dsnmg"), "oldpfgeakrnitscbjmqh", 6, 20, S::npos));
5232   BOOST_TEST(testFFN(S("jnkrfhotgl"), "", 0, 0, 0));
5233   BOOST_TEST(testFFN(S("dltjfngbko"), "rqegt", 0, 0, 0));
5234   BOOST_TEST(testFFN(S("bmjlpkiqde"), "dashm", 0, 1, 0));
5235   BOOST_TEST(testFFN(S("skrflobnqm"), "jqirk", 0, 2, 0));
5236   BOOST_TEST(testFFN(S("jkpldtshrm"), "rckeg", 0, 4, 0));
5237   BOOST_TEST(testFFN(S("ghasdbnjqo"), "jscie", 0, 5, 0));
5238   BOOST_TEST(testFFN(S("igrkhpbqjt"), "efsphndliq", 0, 0, 0));
5239   BOOST_TEST(testFFN(S("ikthdgcamf"), "gdicosleja", 0, 1, 0));
5240   BOOST_TEST(testFFN(S("pcofgeniam"), "qcpjibosfl", 0, 5, 2));
5241   BOOST_TEST(testFFN(S("rlfjgesqhc"), "lrhmefnjcq", 0, 9, 4));
5242   BOOST_TEST(testFFN(S("itphbqsker"), "dtablcrseo", 0, 10, 0));
5243   BOOST_TEST(testFFN(S("skjafcirqm"), "apckjsftedbhgomrnilq", 0, 0, 0));
5244   BOOST_TEST(testFFN(S("tcqomarsfd"), "pcbrgflehjtiadnsokqm", 0, 1, 0));
5245   BOOST_TEST(testFFN(S("rocfeldqpk"), "nsiadegjklhobrmtqcpf", 0, 10, 0));
5246   BOOST_TEST(testFFN(S("cfpegndlkt"), "cpmajdqnolikhgsbretf", 0, 19, 1));
5247   BOOST_TEST(testFFN(S("fqbtnkeasj"), "jcflkntmgiqrphdosaeb", 0, 20, S::npos));
5248   BOOST_TEST(testFFN(S("shbcqnmoar"), "", 1, 0, 1));
5249   BOOST_TEST(testFFN(S("bdoshlmfin"), "ontrs", 1, 0, 1));
5250   BOOST_TEST(testFFN(S("khfrebnsgq"), "pfkna", 1, 1, 1));
5251   BOOST_TEST(testFFN(S("getcrsaoji"), "ekosa", 1, 2, 2));
5252   BOOST_TEST(testFFN(S("fjiknedcpq"), "anqhk", 1, 4, 1));
5253   BOOST_TEST(testFFN(S("tkejgnafrm"), "jekca", 1, 5, 4));
5254   BOOST_TEST(testFFN(S("jnakolqrde"), "ikemsjgacf", 1, 0, 1));
5255   BOOST_TEST(testFFN(S("lcjptsmgbe"), "arolgsjkhm", 1, 1, 1));
5256   BOOST_TEST(testFFN(S("itfsmcjorl"), "oftkbldhre", 1, 5, 3));
5257   BOOST_TEST(testFFN(S("omchkfrjea"), "gbkqdoeftl", 1, 9, 1));
5258   BOOST_TEST(testFFN(S("cigfqkated"), "sqcflrgtim", 1, 10, 5));
5259   BOOST_TEST(testFFN(S("tscenjikml"), "fmhbkislrjdpanogqcet", 1, 0, 1));
5260   BOOST_TEST(testFFN(S("qcpaemsinf"), "rnioadktqlgpbcjsmhef", 1, 1, 1));
5261   BOOST_TEST(testFFN(S("gltkojeipd"), "oakgtnldpsefihqmjcbr", 1, 10, 5));
5262   BOOST_TEST(testFFN(S("qistfrgnmp"), "gbnaelosidmcjqktfhpr", 1, 19, 5));
5263   BOOST_TEST(testFFN(S("bdnpfcqaem"), "akbripjhlosndcmqgfet", 1, 20, S::npos));
5264   BOOST_TEST(testFFN(S("ectnhskflp"), "", 5, 0, 5));
5265   BOOST_TEST(testFFN(S("fgtianblpq"), "pijag", 5, 0, 5));
5266   BOOST_TEST(testFFN(S("mfeqklirnh"), "jrckd", 5, 1, 5));
5267   BOOST_TEST(testFFN(S("astedncjhk"), "qcloh", 5, 2, 5));
5268   BOOST_TEST(testFFN(S("fhlqgcajbr"), "thlmp", 5, 4, 5));
5269   BOOST_TEST(testFFN(S("epfhocmdng"), "qidmo", 5, 5, 5));
5270   BOOST_TEST(testFFN(S("apcnsibger"), "lnegpsjqrd", 5, 0, 5));
5271   BOOST_TEST(testFFN(S("aqkocrbign"), "rjqdablmfs", 5, 1, 6));
5272   BOOST_TEST(testFFN(S("ijsmdtqgce"), "enkgpbsjaq", 5, 5, 5));
5273   BOOST_TEST(testFFN(S("clobgsrken"), "kdsgoaijfh", 5, 9, 6));
5274   BOOST_TEST(testFFN(S("jbhcfposld"), "trfqgmckbe", 5, 10, 5));
5275   BOOST_TEST(testFFN(S("oqnpblhide"), "igetsracjfkdnpoblhqm", 5, 0, 5));
5276   BOOST_TEST(testFFN(S("lroeasctif"), "nqctfaogirshlekbdjpm", 5, 1, 5));
5277   BOOST_TEST(testFFN(S("bpjlgmiedh"), "csehfgomljdqinbartkp", 5, 10, 6));
5278   BOOST_TEST(testFFN(S("pamkeoidrj"), "qahoegcmplkfsjbdnitr", 5, 19, 8));
5279   BOOST_TEST(testFFN(S("espogqbthk"), "dpteiajrqmsognhlfbkc", 5, 20, S::npos));
5280   BOOST_TEST(testFFN(S("shoiedtcjb"), "", 9, 0, 9));
5281   BOOST_TEST(testFFN(S("ebcinjgads"), "tqbnh", 9, 0, 9));
5282   BOOST_TEST(testFFN(S("dqmregkcfl"), "akmle", 9, 1, 9));
5283   BOOST_TEST(testFFN(S("ngcrieqajf"), "iqfkm", 9, 2, 9));
5284   BOOST_TEST(testFFN(S("qosmilgnjb"), "tqjsr", 9, 4, 9));
5285   BOOST_TEST(testFFN(S("ikabsjtdfl"), "jplqg", 9, 5, S::npos));
5286   BOOST_TEST(testFFN(S("ersmicafdh"), "oilnrbcgtj", 9, 0, 9));
5287   BOOST_TEST(testFFN(S("fdnplotmgh"), "morkglpesn", 9, 1, 9));
5288   BOOST_TEST(testFFN(S("fdbicojerm"), "dmicerngat", 9, 5, S::npos));
5289   BOOST_TEST(testFFN(S("mbtafndjcq"), "radgeskbtc", 9, 9, 9));
5290   BOOST_TEST(testFFN(S("mlenkpfdtc"), "ljikprsmqo", 9, 10, 9));
5291   BOOST_TEST(testFFN(S("ahlcifdqgs"), "trqihkcgsjamfdbolnpe", 9, 0, 9));
5292   BOOST_TEST(testFFN(S("bgjemaltks"), "lqmthbsrekajgnofcipd", 9, 1, 9));
5293   BOOST_TEST(testFFN(S("pdhslbqrfc"), "jtalmedribkgqsopcnfh", 9, 10, 9));
5294   BOOST_TEST(testFFN(S("dirhtsnjkc"), "spqfoiclmtagejbndkrh", 9, 19, S::npos));
5295   BOOST_TEST(testFFN(S("dlroktbcja"), "nmotklspigjrdhcfaebq", 9, 20, S::npos));
5296   BOOST_TEST(testFFN(S("ncjpmaekbs"), "", 10, 0, S::npos));
5297   BOOST_TEST(testFFN(S("hlbosgmrak"), "hpmsd", 10, 0, S::npos));
5298   BOOST_TEST(testFFN(S("pqfhsgilen"), "qnpor", 10, 1, S::npos));
5299   BOOST_TEST(testFFN(S("gqtjsbdckh"), "otdma", 10, 2, S::npos));
5300   BOOST_TEST(testFFN(S("cfkqpjlegi"), "efhjg", 10, 4, S::npos));
5301   BOOST_TEST(testFFN(S("beanrfodgj"), "odpte", 10, 5, S::npos));
5302   BOOST_TEST(testFFN(S("adtkqpbjfi"), "bctdgfmolr", 10, 0, S::npos));
5303   BOOST_TEST(testFFN(S("iomkfthagj"), "oaklidrbqg", 10, 1, S::npos));
5304   BOOST_TEST(testFFN(S("sdpcilonqj"), "dnjfsagktr", 10, 5, S::npos));
5305   BOOST_TEST(testFFN(S("gtfbdkqeml"), "nejaktmiqg", 10, 9, S::npos));
5306   BOOST_TEST(testFFN(S("bmeqgcdorj"), "pjqonlebsf", 10, 10, S::npos));
5307   BOOST_TEST(testFFN(S("etqlcanmob"), "dshmnbtolcjepgaikfqr", 10, 0, S::npos));
5308   BOOST_TEST(testFFN(S("roqmkbdtia"), "iogfhpabtjkqlrnemcds", 10, 1, S::npos));
5309   BOOST_TEST(testFFN(S("kadsithljf"), "ngridfabjsecpqltkmoh", 10, 10, S::npos));
5310   BOOST_TEST(testFFN(S("sgtkpbfdmh"), "athmknplcgofrqejsdib", 10, 19, S::npos));
5311   BOOST_TEST(testFFN(S("qgmetnabkl"), "ldobhmqcafnjtkeisgrp", 10, 20, S::npos));
5312   BOOST_TEST(testFFN(S("cqjohampgd"), "", 11, 0, S::npos));
5313   BOOST_TEST(testFFN(S("hobitmpsan"), "aocjb", 11, 0, S::npos));
5314   BOOST_TEST(testFFN(S("tjehkpsalm"), "jbrnk", 11, 1, S::npos));
5315   BOOST_TEST(testFFN(S("ngfbojitcl"), "tqedg", 11, 2, S::npos));
5316   BOOST_TEST(testFFN(S("rcfkdbhgjo"), "nqskp", 11, 4, S::npos));
5317   BOOST_TEST(testFFN(S("qghptonrea"), "eaqkl", 11, 5, S::npos));
5318   BOOST_TEST(testFFN(S("hnprfgqjdl"), "reaoicljqm", 11, 0, S::npos));
5319   BOOST_TEST(testFFN(S("hlmgabenti"), "lsftgajqpm", 11, 1, S::npos));
5320   BOOST_TEST(testFFN(S("ofcjanmrbs"), "rlpfogmits", 11, 5, S::npos));
5321   BOOST_TEST(testFFN(S("jqedtkornm"), "shkncmiaqj", 11, 9, S::npos));
5322   BOOST_TEST(testFFN(S("rfedlasjmg"), "fpnatrhqgs", 11, 10, S::npos));
5323   BOOST_TEST(testFFN(S("talpqjsgkm"), "sjclemqhnpdbgikarfot", 11, 0, S::npos));
5324   BOOST_TEST(testFFN(S("lrkcbtqpie"), "otcmedjikgsfnqbrhpla", 11, 1, S::npos));
5325   BOOST_TEST(testFFN(S("cipogdskjf"), "bonsaefdqiprkhlgtjcm", 11, 10, S::npos));
5326   BOOST_TEST(testFFN(S("nqedcojahi"), "egpscmahijlfnkrodqtb", 11, 19, S::npos));
5327   BOOST_TEST(testFFN(S("hefnrkmctj"), "kmqbfepjthgilscrndoa", 11, 20, S::npos));
5328   BOOST_TEST(testFFN(S("atqirnmekfjolhpdsgcb"), "", 0, 0, 0));
5329   BOOST_TEST(testFFN(S("echfkmlpribjnqsaogtd"), "prboq", 0, 0, 0));
5330   BOOST_TEST(testFFN(S("qnhiftdgcleajbpkrosm"), "fjcqh", 0, 1, 0));
5331   BOOST_TEST(testFFN(S("chamfknorbedjitgslpq"), "fmosa", 0, 2, 0));
5332   BOOST_TEST(testFFN(S("njhqpibfmtlkaecdrgso"), "qdbok", 0, 4, 0));
5333   BOOST_TEST(testFFN(S("ebnghfsqkprmdcljoiat"), "amslg", 0, 5, 0));
5334   BOOST_TEST(testFFN(S("letjomsgihfrpqbkancd"), "smpltjneqb", 0, 0, 0));
5335   BOOST_TEST(testFFN(S("nblgoipcrqeaktshjdmf"), "flitskrnge", 0, 1, 0));
5336   BOOST_TEST(testFFN(S("cehkbngtjoiflqapsmrd"), "pgqihmlbef", 0, 5, 0));
5337   BOOST_TEST(testFFN(S("mignapfoklbhcqjetdrs"), "cfpdqjtgsb", 0, 9, 0));
5338   BOOST_TEST(testFFN(S("ceatbhlsqjgpnokfrmdi"), "htpsiaflom", 0, 10, 0));
5339   BOOST_TEST(testFFN(S("ocihkjgrdelpfnmastqb"), "kpjfiaceghsrdtlbnomq", 0, 0, 0));
5340   BOOST_TEST(testFFN(S("noelgschdtbrjfmiqkap"), "qhtbomidljgafneksprc", 0, 1, 0));
5341   BOOST_TEST(testFFN(S("dkclqfombepritjnghas"), "nhtjobkcefldimpsaqgr", 0, 10, 0));
5342   BOOST_TEST(testFFN(S("miklnresdgbhqcojftap"), "prabcjfqnoeskilmtgdh", 0, 19, 11));
5343   BOOST_TEST(testFFN(S("htbcigojaqmdkfrnlsep"), "dtrgmchilkasqoebfpjn", 0, 20, S::npos));
5344   BOOST_TEST(testFFN(S("febhmqtjanokscdirpgl"), "", 1, 0, 1));
5345   BOOST_TEST(testFFN(S("loakbsqjpcrdhftniegm"), "sqome", 1, 0, 1));
5346   BOOST_TEST(testFFN(S("reagphsqflbitdcjmkno"), "smfte", 1, 1, 1));
5347   BOOST_TEST(testFFN(S("jitlfrqemsdhkopncabg"), "ciboh", 1, 2, 2));
5348   BOOST_TEST(testFFN(S("mhtaepscdnrjqgbkifol"), "haois", 1, 4, 2));
5349   BOOST_TEST(testFFN(S("tocesrfmnglpbjihqadk"), "abfki", 1, 5, 1));
5350   BOOST_TEST(testFFN(S("lpfmctjrhdagneskbqoi"), "frdkocntmq", 1, 0, 1));
5351   BOOST_TEST(testFFN(S("lsmqaepkdhncirbtjfgo"), "oasbpedlnr", 1, 1, 1));
5352   BOOST_TEST(testFFN(S("epoiqmtldrabnkjhcfsg"), "kltqmhgand", 1, 5, 1));
5353   BOOST_TEST(testFFN(S("emgasrilpknqojhtbdcf"), "gdtfjchpmr", 1, 9, 3));
5354   BOOST_TEST(testFFN(S("hnfiagdpcklrjetqbsom"), "ponmcqblet", 1, 10, 2));
5355   BOOST_TEST(testFFN(S("nsdfebgajhmtricpoklq"), "sgphqdnofeiklatbcmjr", 1, 0, 1));
5356   BOOST_TEST(testFFN(S("atjgfsdlpobmeiqhncrk"), "ljqprsmigtfoneadckbh", 1, 1, 1));
5357   BOOST_TEST(testFFN(S("sitodfgnrejlahcbmqkp"), "ligeojhafnkmrcsqtbdp", 1, 10, 2));
5358   BOOST_TEST(testFFN(S("fraghmbiceknltjpqosd"), "lsimqfnjarbopedkhcgt", 1, 19, 13));
5359   BOOST_TEST(testFFN(S("pmafenlhqtdbkirjsogc"), "abedmfjlghniorcqptks", 1, 20, S::npos));
5360   BOOST_TEST(testFFN(S("pihgmoeqtnakrjslcbfd"), "", 10, 0, 10));
5361   BOOST_TEST(testFFN(S("gjdkeprctqblnhiafsom"), "hqtoa", 10, 0, 10));
5362   BOOST_TEST(testFFN(S("mkpnblfdsahrcqijteog"), "cahif", 10, 1, 10));
5363   BOOST_TEST(testFFN(S("gckarqnelodfjhmbptis"), "kehis", 10, 2, 10));
5364   BOOST_TEST(testFFN(S("gqpskidtbclomahnrjfe"), "kdlmh", 10, 4, 11));
5365   BOOST_TEST(testFFN(S("pkldjsqrfgitbhmaecno"), "paeql", 10, 5, 10));
5366   BOOST_TEST(testFFN(S("aftsijrbeklnmcdqhgop"), "aghoqiefnb", 10, 0, 10));
5367   BOOST_TEST(testFFN(S("mtlgdrhafjkbiepqnsoc"), "jrbqaikpdo", 10, 1, 10));
5368   BOOST_TEST(testFFN(S("pqgirnaefthokdmbsclj"), "smjonaeqcl", 10, 5, 10));
5369   BOOST_TEST(testFFN(S("kpdbgjmtherlsfcqoina"), "eqbdrkcfah", 10, 9, 11));
5370   BOOST_TEST(testFFN(S("jrlbothiknqmdgcfasep"), "kapmsienhf", 10, 10, 10));
5371   BOOST_TEST(testFFN(S("mjogldqferckabinptsh"), "jpqotrlenfcsbhkaimdg", 10, 0, 10));
5372   BOOST_TEST(testFFN(S("apoklnefbhmgqcdrisjt"), "jlbmhnfgtcqprikeados", 10, 1, 10));
5373   BOOST_TEST(testFFN(S("ifeopcnrjbhkdgatmqls"), "stgbhfmdaljnpqoicker", 10, 10, 11));
5374   BOOST_TEST(testFFN(S("ckqhaiesmjdnrgolbtpf"), "oihcetflbjagdsrkmqpn", 10, 19, 11));
5375   BOOST_TEST(testFFN(S("bnlgapfimcoterskqdjh"), "adtclebmnpjsrqfkigoh", 10, 20, S::npos));
5376   BOOST_TEST(testFFN(S("kgdlrobpmjcthqsafeni"), "", 19, 0, 19));
5377   BOOST_TEST(testFFN(S("dfkechomjapgnslbtqir"), "beafg", 19, 0, 19));
5378   BOOST_TEST(testFFN(S("rloadknfbqtgmhcsipje"), "iclat", 19, 1, 19));
5379   BOOST_TEST(testFFN(S("mgjhkolrnadqbpetcifs"), "rkhnf", 19, 2, 19));
5380   BOOST_TEST(testFFN(S("cmlfakiojdrgtbsphqen"), "clshq", 19, 4, 19));
5381   BOOST_TEST(testFFN(S("kghbfipeomsntdalrqjc"), "dtcoj", 19, 5, S::npos));
5382   BOOST_TEST(testFFN(S("eldiqckrnmtasbghjfpo"), "rqosnjmfth", 19, 0, 19));
5383   BOOST_TEST(testFFN(S("abqjcfedgotihlnspkrm"), "siatdfqglh", 19, 1, 19));
5384   BOOST_TEST(testFFN(S("qfbadrtjsimkolcenhpg"), "mrlshtpgjq", 19, 5, 19));
5385   BOOST_TEST(testFFN(S("abseghclkjqifmtodrnp"), "adlcskgqjt", 19, 9, 19));
5386   BOOST_TEST(testFFN(S("ibmsnlrjefhtdokacqpg"), "drshcjknaf", 19, 10, 19));
5387   BOOST_TEST(testFFN(S("mrkfciqjebaponsthldg"), "etsaqroinghpkjdlfcbm", 19, 0, 19));
5388   BOOST_TEST(testFFN(S("mjkticdeoqshpalrfbgn"), "sgepdnkqliambtrocfhj", 19, 1, 19));
5389   BOOST_TEST(testFFN(S("rqnoclbdejgiphtfsakm"), "nlmcjaqgbsortfdihkpe", 19, 10, S::npos));
5390   BOOST_TEST(testFFN(S("plkqbhmtfaeodjcrsing"), "racfnpmosldibqkghjet", 19, 19, S::npos));
5391   BOOST_TEST(testFFN(S("oegalhmstjrfickpbndq"), "fjhdsctkqeiolagrnmbp", 19, 20, S::npos));
5392   BOOST_TEST(testFFN(S("rdtgjcaohpblniekmsfq"), "", 20, 0, S::npos));
5393   BOOST_TEST(testFFN(S("ofkqbnjetrmsaidphglc"), "ejanp", 20, 0, S::npos));
5394   BOOST_TEST(testFFN(S("grkpahljcftesdmonqib"), "odife", 20, 1, S::npos));
5395   BOOST_TEST(testFFN(S("jimlgbhfqkteospardcn"), "okaqd", 20, 2, S::npos));
5396   BOOST_TEST(testFFN(S("gftenihpmslrjkqadcob"), "lcdbi", 20, 4, S::npos));
5397   BOOST_TEST(testFFN(S("bmhldogtckrfsanijepq"), "fsqbj", 20, 5, S::npos));
5398   BOOST_TEST(testFFN(S("nfqkrpjdesabgtlcmoih"), "bigdomnplq", 20, 0, S::npos));
5399   BOOST_TEST(testFFN(S("focalnrpiqmdkstehbjg"), "apiblotgcd", 20, 1, S::npos));
5400   BOOST_TEST(testFFN(S("rhqdspkmebiflcotnjga"), "acfhdenops", 20, 5, S::npos));
5401   BOOST_TEST(testFFN(S("rahdtmsckfboqlpniegj"), "jopdeamcrk", 20, 9, S::npos));
5402   BOOST_TEST(testFFN(S("fbkeiopclstmdqranjhg"), "trqncbkgmh", 20, 10, S::npos));
5403   BOOST_TEST(testFFN(S("lifhpdgmbconstjeqark"), "tomglrkencbsfjqpihda", 20, 0, S::npos));
5404   BOOST_TEST(testFFN(S("pboqganrhedjmltsicfk"), "gbkhdnpoietfcmrslajq", 20, 1, S::npos));
5405   BOOST_TEST(testFFN(S("klchabsimetjnqgorfpd"), "rtfnmbsglkjaichoqedp", 20, 10, S::npos));
5406   BOOST_TEST(testFFN(S("sirfgmjqhctndbklaepo"), "ohkmdpfqbsacrtjnlgei", 20, 19, S::npos));
5407   BOOST_TEST(testFFN(S("rlbdsiceaonqjtfpghkm"), "dlbrteoisgphmkncajfq", 20, 20, S::npos));
5408   BOOST_TEST(testFFN(S("ecgdanriptblhjfqskom"), "", 21, 0, S::npos));
5409   BOOST_TEST(testFFN(S("fdmiarlpgcskbhoteqjn"), "sjrlo", 21, 0, S::npos));
5410   BOOST_TEST(testFFN(S("rlbstjqopignecmfadkh"), "qjpor", 21, 1, S::npos));
5411   BOOST_TEST(testFFN(S("grjpqmbshektdolcafni"), "odhfn", 21, 2, S::npos));
5412   BOOST_TEST(testFFN(S("sakfcohtqnibprjmlged"), "qtfin", 21, 4, S::npos));
5413   BOOST_TEST(testFFN(S("mjtdglasihqpocebrfkn"), "hpqfo", 21, 5, S::npos));
5414   BOOST_TEST(testFFN(S("okaplfrntghqbmeicsdj"), "fabmertkos", 21, 0, S::npos));
5415   BOOST_TEST(testFFN(S("sahngemrtcjidqbklfpo"), "brqtgkmaej", 21, 1, S::npos));
5416   BOOST_TEST(testFFN(S("dlmsipcnekhbgoaftqjr"), "nfrdeihsgl", 21, 5, S::npos));
5417   BOOST_TEST(testFFN(S("ahegrmqnoiklpfsdbcjt"), "hlfrosekpi", 21, 9, S::npos));
5418   BOOST_TEST(testFFN(S("hdsjbnmlegtkqripacof"), "atgbkrjdsm", 21, 10, S::npos));
5419   BOOST_TEST(testFFN(S("pcnedrfjihqbalkgtoms"), "blnrptjgqmaifsdkhoec", 21, 0, S::npos));
5420   BOOST_TEST(testFFN(S("qjidealmtpskrbfhocng"), "ctpmdahebfqjgknloris", 21, 1, S::npos));
5421   BOOST_TEST(testFFN(S("qeindtagmokpfhsclrbj"), "apnkeqthrmlbfodiscgj", 21, 10, S::npos));
5422   BOOST_TEST(testFFN(S("kpfegbjhsrnodltqciam"), "jdgictpframeoqlsbknh", 21, 19, S::npos));
5423   BOOST_TEST(testFFN(S("hnbrcplsjfgiktoedmaq"), "qprlsfojamgndekthibc", 21, 20, S::npos));
5424 
5425   // find_last_not_of
5426 
5427   BOOST_TEST(fs1.find_last_not_of(v3) == 2);
5428   BOOST_TEST(fs1.find_last_not_of(v4) == 3);
5429   BOOST_TEST(fs1.find_last_not_of(fs3) == 2);
5430   BOOST_TEST(fs1.find_last_not_of(fs4) == 3);
5431 
5432   BOOST_TEST(fs1.find_last_not_of(cs3) == 2);
5433   BOOST_TEST(fs1.find_last_not_of(cs4) == 3);
5434 
5435   BOOST_TEST(fs1.find_last_not_of(cs3, 0) == S::npos);
5436   BOOST_TEST(fs1.find_last_not_of(cs4, 0) == 0);
5437 
5438   BOOST_TEST(fs1.find_last_not_of(cs4, 0, 2) == 0);
5439 
5440   BOOST_TEST(fs1.find_last_not_of(cs3, 4) == 2);
5441   BOOST_TEST(fs1.find_last_not_of(cs4, 4) == 3);
5442 
5443   BOOST_TEST(fs1.find_last_not_of('1') == 4);
5444   BOOST_TEST(fs1.find_last_not_of('1', 3) == 3);
5445 
5446 
5447   BOOST_TEST(testFLN(S(""), "", 0, 0, S::npos));
5448   BOOST_TEST(testFLN(S(""), "irkhs", 0, 0, S::npos));
5449   BOOST_TEST(testFLN(S(""), "kante", 0, 1, S::npos));
5450   BOOST_TEST(testFLN(S(""), "oknlr", 0, 2, S::npos));
5451   BOOST_TEST(testFLN(S(""), "pcdro", 0, 4, S::npos));
5452   BOOST_TEST(testFLN(S(""), "bnrpe", 0, 5, S::npos));
5453   BOOST_TEST(testFLN(S(""), "jtdaefblso", 0, 0, S::npos));
5454   BOOST_TEST(testFLN(S(""), "oselktgbca", 0, 1, S::npos));
5455   BOOST_TEST(testFLN(S(""), "eqgaplhckj", 0, 5, S::npos));
5456   BOOST_TEST(testFLN(S(""), "bjahtcmnlp", 0, 9, S::npos));
5457   BOOST_TEST(testFLN(S(""), "hjlcmgpket", 0, 10, S::npos));
5458   BOOST_TEST(testFLN(S(""), "htaobedqikfplcgjsmrn", 0, 0, S::npos));
5459   BOOST_TEST(testFLN(S(""), "hpqiarojkcdlsgnmfetb", 0, 1, S::npos));
5460   BOOST_TEST(testFLN(S(""), "dfkaprhjloqetcsimnbg", 0, 10, S::npos));
5461   BOOST_TEST(testFLN(S(""), "ihqrfebgadntlpmjksoc", 0, 19, S::npos));
5462   BOOST_TEST(testFLN(S(""), "ngtjfcalbseiqrphmkdo", 0, 20, S::npos));
5463   BOOST_TEST(testFLN(S(""), "", 1, 0, S::npos));
5464   BOOST_TEST(testFLN(S(""), "lbtqd", 1, 0, S::npos));
5465   BOOST_TEST(testFLN(S(""), "tboim", 1, 1, S::npos));
5466   BOOST_TEST(testFLN(S(""), "slcer", 1, 2, S::npos));
5467   BOOST_TEST(testFLN(S(""), "cbjfs", 1, 4, S::npos));
5468   BOOST_TEST(testFLN(S(""), "aqibs", 1, 5, S::npos));
5469   BOOST_TEST(testFLN(S(""), "gtfblmqinc", 1, 0, S::npos));
5470   BOOST_TEST(testFLN(S(""), "mkqpbtdalg", 1, 1, S::npos));
5471   BOOST_TEST(testFLN(S(""), "kphatlimcd", 1, 5, S::npos));
5472   BOOST_TEST(testFLN(S(""), "pblasqogic", 1, 9, S::npos));
5473   BOOST_TEST(testFLN(S(""), "arosdhcfme", 1, 10, S::npos));
5474   BOOST_TEST(testFLN(S(""), "blkhjeogicatqfnpdmsr", 1, 0, S::npos));
5475   BOOST_TEST(testFLN(S(""), "bmhineprjcoadgstflqk", 1, 1, S::npos));
5476   BOOST_TEST(testFLN(S(""), "djkqcmetslnghpbarfoi", 1, 10, S::npos));
5477   BOOST_TEST(testFLN(S(""), "lgokshjtpbemarcdqnfi", 1, 19, S::npos));
5478   BOOST_TEST(testFLN(S(""), "bqjhtkfepimcnsgrlado", 1, 20, S::npos));
5479   BOOST_TEST(testFLN(S("eaint"), "", 0, 0, 0));
5480   BOOST_TEST(testFLN(S("binja"), "gfsrt", 0, 0, 0));
5481   BOOST_TEST(testFLN(S("latkm"), "pfsoc", 0, 1, 0));
5482   BOOST_TEST(testFLN(S("lecfr"), "tpflm", 0, 2, 0));
5483   BOOST_TEST(testFLN(S("eqkst"), "sgkec", 0, 4, S::npos));
5484   BOOST_TEST(testFLN(S("cdafr"), "romds", 0, 5, 0));
5485   BOOST_TEST(testFLN(S("prbhe"), "qhjistlgmr", 0, 0, 0));
5486   BOOST_TEST(testFLN(S("lbisk"), "pedfirsglo", 0, 1, 0));
5487   BOOST_TEST(testFLN(S("hrlpd"), "aqcoslgrmk", 0, 5, 0));
5488   BOOST_TEST(testFLN(S("ehmja"), "dabckmepqj", 0, 9, S::npos));
5489   BOOST_TEST(testFLN(S("mhqgd"), "pqscrjthli", 0, 10, 0));
5490   BOOST_TEST(testFLN(S("tgklq"), "kfphdcsjqmobliagtren", 0, 0, 0));
5491   BOOST_TEST(testFLN(S("bocjs"), "rokpefncljibsdhqtagm", 0, 1, 0));
5492   BOOST_TEST(testFLN(S("grbsd"), "afionmkphlebtcjqsgrd", 0, 10, 0));
5493   BOOST_TEST(testFLN(S("ofjqr"), "aenmqplidhkofrjbctsg", 0, 19, S::npos));
5494   BOOST_TEST(testFLN(S("btlfi"), "osjmbtcadhiklegrpqnf", 0, 20, S::npos));
5495   BOOST_TEST(testFLN(S("clrgb"), "", 1, 0, 1));
5496   BOOST_TEST(testFLN(S("tjmek"), "osmia", 1, 0, 1));
5497   BOOST_TEST(testFLN(S("bgstp"), "ckonl", 1, 1, 1));
5498   BOOST_TEST(testFLN(S("hstrk"), "ilcaj", 1, 2, 1));
5499   BOOST_TEST(testFLN(S("kmspj"), "lasiq", 1, 4, 1));
5500   BOOST_TEST(testFLN(S("tjboh"), "kfqmr", 1, 5, 1));
5501   BOOST_TEST(testFLN(S("ilbcj"), "klnitfaobg", 1, 0, 1));
5502   BOOST_TEST(testFLN(S("jkngf"), "gjhmdlqikp", 1, 1, 1));
5503   BOOST_TEST(testFLN(S("gfcql"), "skbgtahqej", 1, 5, 1));
5504   BOOST_TEST(testFLN(S("dqtlg"), "bjsdgtlpkf", 1, 9, 1));
5505   BOOST_TEST(testFLN(S("bthpg"), "bjgfmnlkio", 1, 10, 1));
5506   BOOST_TEST(testFLN(S("dgsnq"), "lbhepotfsjdqigcnamkr", 1, 0, 1));
5507   BOOST_TEST(testFLN(S("rmfhp"), "tebangckmpsrqdlfojhi", 1, 1, 1));
5508   BOOST_TEST(testFLN(S("jfdam"), "joflqbdkhtegimscpanr", 1, 10, S::npos));
5509   BOOST_TEST(testFLN(S("edapb"), "adpmcohetfbsrjinlqkg", 1, 19, S::npos));
5510   BOOST_TEST(testFLN(S("brfsm"), "iacldqjpfnogbsrhmetk", 1, 20, S::npos));
5511   BOOST_TEST(testFLN(S("ndrhl"), "", 2, 0, 2));
5512   BOOST_TEST(testFLN(S("mrecp"), "otkgb", 2, 0, 2));
5513   BOOST_TEST(testFLN(S("qlasf"), "cqsjl", 2, 1, 2));
5514   BOOST_TEST(testFLN(S("smaqd"), "dpifl", 2, 2, 2));
5515   BOOST_TEST(testFLN(S("hjeni"), "oapht", 2, 4, 2));
5516   BOOST_TEST(testFLN(S("ocmfj"), "cifts", 2, 5, 2));
5517   BOOST_TEST(testFLN(S("hmftq"), "nmsckbgalo", 2, 0, 2));
5518   BOOST_TEST(testFLN(S("fklad"), "tpksqhamle", 2, 1, 2));
5519   BOOST_TEST(testFLN(S("dirnm"), "tpdrchmkji", 2, 5, 1));
5520   BOOST_TEST(testFLN(S("hrgdc"), "ijagfkblst", 2, 9, 1));
5521   BOOST_TEST(testFLN(S("ifakg"), "kpocsignjb", 2, 10, 2));
5522   BOOST_TEST(testFLN(S("ebrgd"), "pecqtkjsnbdrialgmohf", 2, 0, 2));
5523   BOOST_TEST(testFLN(S("rcjml"), "aiortphfcmkjebgsndql", 2, 1, 2));
5524   BOOST_TEST(testFLN(S("peqmt"), "sdbkeamglhipojqftrcn", 2, 10, 2));
5525   BOOST_TEST(testFLN(S("frehn"), "ljqncehgmfktroapidbs", 2, 19, S::npos));
5526   BOOST_TEST(testFLN(S("tqolf"), "rtcfodilamkbenjghqps", 2, 20, S::npos));
5527   BOOST_TEST(testFLN(S("cjgao"), "", 4, 0, 4));
5528   BOOST_TEST(testFLN(S("kjplq"), "mabns", 4, 0, 4));
5529   BOOST_TEST(testFLN(S("herni"), "bdnrp", 4, 1, 4));
5530   BOOST_TEST(testFLN(S("tadrb"), "scidp", 4, 2, 4));
5531   BOOST_TEST(testFLN(S("pkfeo"), "agbjl", 4, 4, 4));
5532   BOOST_TEST(testFLN(S("hoser"), "jfmpr", 4, 5, 3));
5533   BOOST_TEST(testFLN(S("kgrsp"), "rbpefghsmj", 4, 0, 4));
5534   BOOST_TEST(testFLN(S("pgejb"), "apsfntdoqc", 4, 1, 4));
5535   BOOST_TEST(testFLN(S("thlnq"), "ndkjeisgcl", 4, 5, 4));
5536   BOOST_TEST(testFLN(S("nbmit"), "rnfpqatdeo", 4, 9, 3));
5537   BOOST_TEST(testFLN(S("jgmib"), "bntjlqrfik", 4, 10, 2));
5538   BOOST_TEST(testFLN(S("ncrfj"), "kcrtmpolnaqejghsfdbi", 4, 0, 4));
5539   BOOST_TEST(testFLN(S("ncsik"), "lobheanpkmqidsrtcfgj", 4, 1, 4));
5540   BOOST_TEST(testFLN(S("sgbfh"), "athdkljcnreqbgpmisof", 4, 10, 3));
5541   BOOST_TEST(testFLN(S("dktbn"), "qkdmjialrscpbhefgont", 4, 19, 2));
5542   BOOST_TEST(testFLN(S("fthqm"), "dmasojntqleribkgfchp", 4, 20, S::npos));
5543   BOOST_TEST(testFLN(S("klopi"), "", 5, 0, 4));
5544   BOOST_TEST(testFLN(S("dajhn"), "psthd", 5, 0, 4));
5545   BOOST_TEST(testFLN(S("jbgno"), "rpmjd", 5, 1, 4));
5546   BOOST_TEST(testFLN(S("hkjae"), "dfsmk", 5, 2, 4));
5547   BOOST_TEST(testFLN(S("gbhqo"), "skqne", 5, 4, 4));
5548   BOOST_TEST(testFLN(S("ktdor"), "kipnf", 5, 5, 4));
5549   BOOST_TEST(testFLN(S("ldprn"), "hmrnqdgifl", 5, 0, 4));
5550   BOOST_TEST(testFLN(S("egmjk"), "fsmjcdairn", 5, 1, 4));
5551   BOOST_TEST(testFLN(S("armql"), "pcdgltbrfj", 5, 5, 3));
5552   BOOST_TEST(testFLN(S("cdhjo"), "aekfctpirg", 5, 9, 4));
5553   BOOST_TEST(testFLN(S("jcons"), "ledihrsgpf", 5, 10, 3));
5554   BOOST_TEST(testFLN(S("cbrkp"), "mqcklahsbtirgopefndj", 5, 0, 4));
5555   BOOST_TEST(testFLN(S("fhgna"), "kmlthaoqgecrnpdbjfis", 5, 1, 4));
5556   BOOST_TEST(testFLN(S("ejfcd"), "sfhbamcdptojlkrenqgi", 5, 10, 1));
5557   BOOST_TEST(testFLN(S("kqjhe"), "pbniofmcedrkhlstgaqj", 5, 19, 2));
5558   BOOST_TEST(testFLN(S("pbdjl"), "mongjratcskbhqiepfdl", 5, 20, S::npos));
5559   BOOST_TEST(testFLN(S("gajqn"), "", 6, 0, 4));
5560   BOOST_TEST(testFLN(S("stedk"), "hrnat", 6, 0, 4));
5561   BOOST_TEST(testFLN(S("tjkaf"), "gsqdt", 6, 1, 4));
5562   BOOST_TEST(testFLN(S("dthpe"), "bspkd", 6, 2, 4));
5563   BOOST_TEST(testFLN(S("klhde"), "ohcmb", 6, 4, 4));
5564   BOOST_TEST(testFLN(S("bhlki"), "heatr", 6, 5, 4));
5565   BOOST_TEST(testFLN(S("lqmoh"), "pmblckedfn", 6, 0, 4));
5566   BOOST_TEST(testFLN(S("mtqin"), "aceqmsrbik", 6, 1, 4));
5567   BOOST_TEST(testFLN(S("dpqbr"), "lmbtdehjrn", 6, 5, 4));
5568   BOOST_TEST(testFLN(S("kdhmo"), "teqmcrlgib", 6, 9, 4));
5569   BOOST_TEST(testFLN(S("jblqp"), "njolbmspac", 6, 10, 3));
5570   BOOST_TEST(testFLN(S("qmjgl"), "pofnhidklamecrbqjgst", 6, 0, 4));
5571   BOOST_TEST(testFLN(S("rothp"), "jbhckmtgrqnosafedpli", 6, 1, 4));
5572   BOOST_TEST(testFLN(S("ghknq"), "dobntpmqklicsahgjerf", 6, 10, 1));
5573   BOOST_TEST(testFLN(S("eopfi"), "tpdshainjkbfoemlrgcq", 6, 19, S::npos));
5574   BOOST_TEST(testFLN(S("dsnmg"), "oldpfgeakrnitscbjmqh", 6, 20, S::npos));
5575   BOOST_TEST(testFLN(S("jnkrfhotgl"), "", 0, 0, 0));
5576   BOOST_TEST(testFLN(S("dltjfngbko"), "rqegt", 0, 0, 0));
5577   BOOST_TEST(testFLN(S("bmjlpkiqde"), "dashm", 0, 1, 0));
5578   BOOST_TEST(testFLN(S("skrflobnqm"), "jqirk", 0, 2, 0));
5579   BOOST_TEST(testFLN(S("jkpldtshrm"), "rckeg", 0, 4, 0));
5580   BOOST_TEST(testFLN(S("ghasdbnjqo"), "jscie", 0, 5, 0));
5581   BOOST_TEST(testFLN(S("igrkhpbqjt"), "efsphndliq", 0, 0, 0));
5582   BOOST_TEST(testFLN(S("ikthdgcamf"), "gdicosleja", 0, 1, 0));
5583   BOOST_TEST(testFLN(S("pcofgeniam"), "qcpjibosfl", 0, 5, S::npos));
5584   BOOST_TEST(testFLN(S("rlfjgesqhc"), "lrhmefnjcq", 0, 9, S::npos));
5585   BOOST_TEST(testFLN(S("itphbqsker"), "dtablcrseo", 0, 10, 0));
5586   BOOST_TEST(testFLN(S("skjafcirqm"), "apckjsftedbhgomrnilq", 0, 0, 0));
5587   BOOST_TEST(testFLN(S("tcqomarsfd"), "pcbrgflehjtiadnsokqm", 0, 1, 0));
5588   BOOST_TEST(testFLN(S("rocfeldqpk"), "nsiadegjklhobrmtqcpf", 0, 10, 0));
5589   BOOST_TEST(testFLN(S("cfpegndlkt"), "cpmajdqnolikhgsbretf", 0, 19, S::npos));
5590   BOOST_TEST(testFLN(S("fqbtnkeasj"), "jcflkntmgiqrphdosaeb", 0, 20, S::npos));
5591   BOOST_TEST(testFLN(S("shbcqnmoar"), "", 1, 0, 1));
5592   BOOST_TEST(testFLN(S("bdoshlmfin"), "ontrs", 1, 0, 1));
5593   BOOST_TEST(testFLN(S("khfrebnsgq"), "pfkna", 1, 1, 1));
5594   BOOST_TEST(testFLN(S("getcrsaoji"), "ekosa", 1, 2, 0));
5595   BOOST_TEST(testFLN(S("fjiknedcpq"), "anqhk", 1, 4, 1));
5596   BOOST_TEST(testFLN(S("tkejgnafrm"), "jekca", 1, 5, 0));
5597   BOOST_TEST(testFLN(S("jnakolqrde"), "ikemsjgacf", 1, 0, 1));
5598   BOOST_TEST(testFLN(S("lcjptsmgbe"), "arolgsjkhm", 1, 1, 1));
5599   BOOST_TEST(testFLN(S("itfsmcjorl"), "oftkbldhre", 1, 5, 0));
5600   BOOST_TEST(testFLN(S("omchkfrjea"), "gbkqdoeftl", 1, 9, 1));
5601   BOOST_TEST(testFLN(S("cigfqkated"), "sqcflrgtim", 1, 10, S::npos));
5602   BOOST_TEST(testFLN(S("tscenjikml"), "fmhbkislrjdpanogqcet", 1, 0, 1));
5603   BOOST_TEST(testFLN(S("qcpaemsinf"), "rnioadktqlgpbcjsmhef", 1, 1, 1));
5604   BOOST_TEST(testFLN(S("gltkojeipd"), "oakgtnldpsefihqmjcbr", 1, 10, S::npos));
5605   BOOST_TEST(testFLN(S("qistfrgnmp"), "gbnaelosidmcjqktfhpr", 1, 19, S::npos));
5606   BOOST_TEST(testFLN(S("bdnpfcqaem"), "akbripjhlosndcmqgfet", 1, 20, S::npos));
5607   BOOST_TEST(testFLN(S("ectnhskflp"), "", 5, 0, 5));
5608   BOOST_TEST(testFLN(S("fgtianblpq"), "pijag", 5, 0, 5));
5609   BOOST_TEST(testFLN(S("mfeqklirnh"), "jrckd", 5, 1, 5));
5610   BOOST_TEST(testFLN(S("astedncjhk"), "qcloh", 5, 2, 5));
5611   BOOST_TEST(testFLN(S("fhlqgcajbr"), "thlmp", 5, 4, 5));
5612   BOOST_TEST(testFLN(S("epfhocmdng"), "qidmo", 5, 5, 5));
5613   BOOST_TEST(testFLN(S("apcnsibger"), "lnegpsjqrd", 5, 0, 5));
5614   BOOST_TEST(testFLN(S("aqkocrbign"), "rjqdablmfs", 5, 1, 4));
5615   BOOST_TEST(testFLN(S("ijsmdtqgce"), "enkgpbsjaq", 5, 5, 5));
5616   BOOST_TEST(testFLN(S("clobgsrken"), "kdsgoaijfh", 5, 9, 3));
5617   BOOST_TEST(testFLN(S("jbhcfposld"), "trfqgmckbe", 5, 10, 5));
5618   BOOST_TEST(testFLN(S("oqnpblhide"), "igetsracjfkdnpoblhqm", 5, 0, 5));
5619   BOOST_TEST(testFLN(S("lroeasctif"), "nqctfaogirshlekbdjpm", 5, 1, 5));
5620   BOOST_TEST(testFLN(S("bpjlgmiedh"), "csehfgomljdqinbartkp", 5, 10, 1));
5621   BOOST_TEST(testFLN(S("pamkeoidrj"), "qahoegcmplkfsjbdnitr", 5, 19, S::npos));
5622   BOOST_TEST(testFLN(S("espogqbthk"), "dpteiajrqmsognhlfbkc", 5, 20, S::npos));
5623   BOOST_TEST(testFLN(S("shoiedtcjb"), "", 9, 0, 9));
5624   BOOST_TEST(testFLN(S("ebcinjgads"), "tqbnh", 9, 0, 9));
5625   BOOST_TEST(testFLN(S("dqmregkcfl"), "akmle", 9, 1, 9));
5626   BOOST_TEST(testFLN(S("ngcrieqajf"), "iqfkm", 9, 2, 9));
5627   BOOST_TEST(testFLN(S("qosmilgnjb"), "tqjsr", 9, 4, 9));
5628   BOOST_TEST(testFLN(S("ikabsjtdfl"), "jplqg", 9, 5, 8));
5629   BOOST_TEST(testFLN(S("ersmicafdh"), "oilnrbcgtj", 9, 0, 9));
5630   BOOST_TEST(testFLN(S("fdnplotmgh"), "morkglpesn", 9, 1, 9));
5631   BOOST_TEST(testFLN(S("fdbicojerm"), "dmicerngat", 9, 5, 8));
5632   BOOST_TEST(testFLN(S("mbtafndjcq"), "radgeskbtc", 9, 9, 9));
5633   BOOST_TEST(testFLN(S("mlenkpfdtc"), "ljikprsmqo", 9, 10, 9));
5634   BOOST_TEST(testFLN(S("ahlcifdqgs"), "trqihkcgsjamfdbolnpe", 9, 0, 9));
5635   BOOST_TEST(testFLN(S("bgjemaltks"), "lqmthbsrekajgnofcipd", 9, 1, 9));
5636   BOOST_TEST(testFLN(S("pdhslbqrfc"), "jtalmedribkgqsopcnfh", 9, 10, 9));
5637   BOOST_TEST(testFLN(S("dirhtsnjkc"), "spqfoiclmtagejbndkrh", 9, 19, 3));
5638   BOOST_TEST(testFLN(S("dlroktbcja"), "nmotklspigjrdhcfaebq", 9, 20, S::npos));
5639   BOOST_TEST(testFLN(S("ncjpmaekbs"), "", 10, 0, 9));
5640   BOOST_TEST(testFLN(S("hlbosgmrak"), "hpmsd", 10, 0, 9));
5641   BOOST_TEST(testFLN(S("pqfhsgilen"), "qnpor", 10, 1, 9));
5642   BOOST_TEST(testFLN(S("gqtjsbdckh"), "otdma", 10, 2, 9));
5643   BOOST_TEST(testFLN(S("cfkqpjlegi"), "efhjg", 10, 4, 9));
5644   BOOST_TEST(testFLN(S("beanrfodgj"), "odpte", 10, 5, 9));
5645   BOOST_TEST(testFLN(S("adtkqpbjfi"), "bctdgfmolr", 10, 0, 9));
5646   BOOST_TEST(testFLN(S("iomkfthagj"), "oaklidrbqg", 10, 1, 9));
5647   BOOST_TEST(testFLN(S("sdpcilonqj"), "dnjfsagktr", 10, 5, 8));
5648   BOOST_TEST(testFLN(S("gtfbdkqeml"), "nejaktmiqg", 10, 9, 9));
5649   BOOST_TEST(testFLN(S("bmeqgcdorj"), "pjqonlebsf", 10, 10, 8));
5650   BOOST_TEST(testFLN(S("etqlcanmob"), "dshmnbtolcjepgaikfqr", 10, 0, 9));
5651   BOOST_TEST(testFLN(S("roqmkbdtia"), "iogfhpabtjkqlrnemcds", 10, 1, 9));
5652   BOOST_TEST(testFLN(S("kadsithljf"), "ngridfabjsecpqltkmoh", 10, 10, 7));
5653   BOOST_TEST(testFLN(S("sgtkpbfdmh"), "athmknplcgofrqejsdib", 10, 19, 5));
5654   BOOST_TEST(testFLN(S("qgmetnabkl"), "ldobhmqcafnjtkeisgrp", 10, 20, S::npos));
5655   BOOST_TEST(testFLN(S("cqjohampgd"), "", 11, 0, 9));
5656   BOOST_TEST(testFLN(S("hobitmpsan"), "aocjb", 11, 0, 9));
5657   BOOST_TEST(testFLN(S("tjehkpsalm"), "jbrnk", 11, 1, 9));
5658   BOOST_TEST(testFLN(S("ngfbojitcl"), "tqedg", 11, 2, 9));
5659   BOOST_TEST(testFLN(S("rcfkdbhgjo"), "nqskp", 11, 4, 9));
5660   BOOST_TEST(testFLN(S("qghptonrea"), "eaqkl", 11, 5, 7));
5661   BOOST_TEST(testFLN(S("hnprfgqjdl"), "reaoicljqm", 11, 0, 9));
5662   BOOST_TEST(testFLN(S("hlmgabenti"), "lsftgajqpm", 11, 1, 9));
5663   BOOST_TEST(testFLN(S("ofcjanmrbs"), "rlpfogmits", 11, 5, 9));
5664   BOOST_TEST(testFLN(S("jqedtkornm"), "shkncmiaqj", 11, 9, 7));
5665   BOOST_TEST(testFLN(S("rfedlasjmg"), "fpnatrhqgs", 11, 10, 8));
5666   BOOST_TEST(testFLN(S("talpqjsgkm"), "sjclemqhnpdbgikarfot", 11, 0, 9));
5667   BOOST_TEST(testFLN(S("lrkcbtqpie"), "otcmedjikgsfnqbrhpla", 11, 1, 9));
5668   BOOST_TEST(testFLN(S("cipogdskjf"), "bonsaefdqiprkhlgtjcm", 11, 10, 8));
5669   BOOST_TEST(testFLN(S("nqedcojahi"), "egpscmahijlfnkrodqtb", 11, 19, S::npos));
5670   BOOST_TEST(testFLN(S("hefnrkmctj"), "kmqbfepjthgilscrndoa", 11, 20, S::npos));
5671   BOOST_TEST(testFLN(S("atqirnmekfjolhpdsgcb"), "", 0, 0, 0));
5672   BOOST_TEST(testFLN(S("echfkmlpribjnqsaogtd"), "prboq", 0, 0, 0));
5673   BOOST_TEST(testFLN(S("qnhiftdgcleajbpkrosm"), "fjcqh", 0, 1, 0));
5674   BOOST_TEST(testFLN(S("chamfknorbedjitgslpq"), "fmosa", 0, 2, 0));
5675   BOOST_TEST(testFLN(S("njhqpibfmtlkaecdrgso"), "qdbok", 0, 4, 0));
5676   BOOST_TEST(testFLN(S("ebnghfsqkprmdcljoiat"), "amslg", 0, 5, 0));
5677   BOOST_TEST(testFLN(S("letjomsgihfrpqbkancd"), "smpltjneqb", 0, 0, 0));
5678   BOOST_TEST(testFLN(S("nblgoipcrqeaktshjdmf"), "flitskrnge", 0, 1, 0));
5679   BOOST_TEST(testFLN(S("cehkbngtjoiflqapsmrd"), "pgqihmlbef", 0, 5, 0));
5680   BOOST_TEST(testFLN(S("mignapfoklbhcqjetdrs"), "cfpdqjtgsb", 0, 9, 0));
5681   BOOST_TEST(testFLN(S("ceatbhlsqjgpnokfrmdi"), "htpsiaflom", 0, 10, 0));
5682   BOOST_TEST(testFLN(S("ocihkjgrdelpfnmastqb"), "kpjfiaceghsrdtlbnomq", 0, 0, 0));
5683   BOOST_TEST(testFLN(S("noelgschdtbrjfmiqkap"), "qhtbomidljgafneksprc", 0, 1, 0));
5684   BOOST_TEST(testFLN(S("dkclqfombepritjnghas"), "nhtjobkcefldimpsaqgr", 0, 10, 0));
5685   BOOST_TEST(testFLN(S("miklnresdgbhqcojftap"), "prabcjfqnoeskilmtgdh", 0, 19, S::npos));
5686   BOOST_TEST(testFLN(S("htbcigojaqmdkfrnlsep"), "dtrgmchilkasqoebfpjn", 0, 20, S::npos));
5687   BOOST_TEST(testFLN(S("febhmqtjanokscdirpgl"), "", 1, 0, 1));
5688   BOOST_TEST(testFLN(S("loakbsqjpcrdhftniegm"), "sqome", 1, 0, 1));
5689   BOOST_TEST(testFLN(S("reagphsqflbitdcjmkno"), "smfte", 1, 1, 1));
5690   BOOST_TEST(testFLN(S("jitlfrqemsdhkopncabg"), "ciboh", 1, 2, 0));
5691   BOOST_TEST(testFLN(S("mhtaepscdnrjqgbkifol"), "haois", 1, 4, 0));
5692   BOOST_TEST(testFLN(S("tocesrfmnglpbjihqadk"), "abfki", 1, 5, 1));
5693   BOOST_TEST(testFLN(S("lpfmctjrhdagneskbqoi"), "frdkocntmq", 1, 0, 1));
5694   BOOST_TEST(testFLN(S("lsmqaepkdhncirbtjfgo"), "oasbpedlnr", 1, 1, 1));
5695   BOOST_TEST(testFLN(S("epoiqmtldrabnkjhcfsg"), "kltqmhgand", 1, 5, 1));
5696   BOOST_TEST(testFLN(S("emgasrilpknqojhtbdcf"), "gdtfjchpmr", 1, 9, 0));
5697   BOOST_TEST(testFLN(S("hnfiagdpcklrjetqbsom"), "ponmcqblet", 1, 10, 0));
5698   BOOST_TEST(testFLN(S("nsdfebgajhmtricpoklq"), "sgphqdnofeiklatbcmjr", 1, 0, 1));
5699   BOOST_TEST(testFLN(S("atjgfsdlpobmeiqhncrk"), "ljqprsmigtfoneadckbh", 1, 1, 1));
5700   BOOST_TEST(testFLN(S("sitodfgnrejlahcbmqkp"), "ligeojhafnkmrcsqtbdp", 1, 10, 0));
5701   BOOST_TEST(testFLN(S("fraghmbiceknltjpqosd"), "lsimqfnjarbopedkhcgt", 1, 19, S::npos));
5702   BOOST_TEST(testFLN(S("pmafenlhqtdbkirjsogc"), "abedmfjlghniorcqptks", 1, 20, S::npos));
5703   BOOST_TEST(testFLN(S("pihgmoeqtnakrjslcbfd"), "", 10, 0, 10));
5704   BOOST_TEST(testFLN(S("gjdkeprctqblnhiafsom"), "hqtoa", 10, 0, 10));
5705   BOOST_TEST(testFLN(S("mkpnblfdsahrcqijteog"), "cahif", 10, 1, 10));
5706   BOOST_TEST(testFLN(S("gckarqnelodfjhmbptis"), "kehis", 10, 2, 10));
5707   BOOST_TEST(testFLN(S("gqpskidtbclomahnrjfe"), "kdlmh", 10, 4, 9));
5708   BOOST_TEST(testFLN(S("pkldjsqrfgitbhmaecno"), "paeql", 10, 5, 10));
5709   BOOST_TEST(testFLN(S("aftsijrbeklnmcdqhgop"), "aghoqiefnb", 10, 0, 10));
5710   BOOST_TEST(testFLN(S("mtlgdrhafjkbiepqnsoc"), "jrbqaikpdo", 10, 1, 10));
5711   BOOST_TEST(testFLN(S("pqgirnaefthokdmbsclj"), "smjonaeqcl", 10, 5, 10));
5712   BOOST_TEST(testFLN(S("kpdbgjmtherlsfcqoina"), "eqbdrkcfah", 10, 9, 8));
5713   BOOST_TEST(testFLN(S("jrlbothiknqmdgcfasep"), "kapmsienhf", 10, 10, 10));
5714   BOOST_TEST(testFLN(S("mjogldqferckabinptsh"), "jpqotrlenfcsbhkaimdg", 10, 0, 10));
5715   BOOST_TEST(testFLN(S("apoklnefbhmgqcdrisjt"), "jlbmhnfgtcqprikeados", 10, 1, 10));
5716   BOOST_TEST(testFLN(S("ifeopcnrjbhkdgatmqls"), "stgbhfmdaljnpqoicker", 10, 10, 8));
5717   BOOST_TEST(testFLN(S("ckqhaiesmjdnrgolbtpf"), "oihcetflbjagdsrkmqpn", 10, 19, S::npos));
5718   BOOST_TEST(testFLN(S("bnlgapfimcoterskqdjh"), "adtclebmnpjsrqfkigoh", 10, 20, S::npos));
5719   BOOST_TEST(testFLN(S("kgdlrobpmjcthqsafeni"), "", 19, 0, 19));
5720   BOOST_TEST(testFLN(S("dfkechomjapgnslbtqir"), "beafg", 19, 0, 19));
5721   BOOST_TEST(testFLN(S("rloadknfbqtgmhcsipje"), "iclat", 19, 1, 19));
5722   BOOST_TEST(testFLN(S("mgjhkolrnadqbpetcifs"), "rkhnf", 19, 2, 19));
5723   BOOST_TEST(testFLN(S("cmlfakiojdrgtbsphqen"), "clshq", 19, 4, 19));
5724   BOOST_TEST(testFLN(S("kghbfipeomsntdalrqjc"), "dtcoj", 19, 5, 17));
5725   BOOST_TEST(testFLN(S("eldiqckrnmtasbghjfpo"), "rqosnjmfth", 19, 0, 19));
5726   BOOST_TEST(testFLN(S("abqjcfedgotihlnspkrm"), "siatdfqglh", 19, 1, 19));
5727   BOOST_TEST(testFLN(S("qfbadrtjsimkolcenhpg"), "mrlshtpgjq", 19, 5, 19));
5728   BOOST_TEST(testFLN(S("abseghclkjqifmtodrnp"), "adlcskgqjt", 19, 9, 19));
5729   BOOST_TEST(testFLN(S("ibmsnlrjefhtdokacqpg"), "drshcjknaf", 19, 10, 19));
5730   BOOST_TEST(testFLN(S("mrkfciqjebaponsthldg"), "etsaqroinghpkjdlfcbm", 19, 0, 19));
5731   BOOST_TEST(testFLN(S("mjkticdeoqshpalrfbgn"), "sgepdnkqliambtrocfhj", 19, 1, 19));
5732   BOOST_TEST(testFLN(S("rqnoclbdejgiphtfsakm"), "nlmcjaqgbsortfdihkpe", 19, 10, 18));
5733   BOOST_TEST(testFLN(S("plkqbhmtfaeodjcrsing"), "racfnpmosldibqkghjet", 19, 19, 7));
5734   BOOST_TEST(testFLN(S("oegalhmstjrfickpbndq"), "fjhdsctkqeiolagrnmbp", 19, 20, S::npos));
5735   BOOST_TEST(testFLN(S("rdtgjcaohpblniekmsfq"), "", 20, 0, 19));
5736   BOOST_TEST(testFLN(S("ofkqbnjetrmsaidphglc"), "ejanp", 20, 0, 19));
5737   BOOST_TEST(testFLN(S("grkpahljcftesdmonqib"), "odife", 20, 1, 19));
5738   BOOST_TEST(testFLN(S("jimlgbhfqkteospardcn"), "okaqd", 20, 2, 19));
5739   BOOST_TEST(testFLN(S("gftenihpmslrjkqadcob"), "lcdbi", 20, 4, 18));
5740   BOOST_TEST(testFLN(S("bmhldogtckrfsanijepq"), "fsqbj", 20, 5, 18));
5741   BOOST_TEST(testFLN(S("nfqkrpjdesabgtlcmoih"), "bigdomnplq", 20, 0, 19));
5742   BOOST_TEST(testFLN(S("focalnrpiqmdkstehbjg"), "apiblotgcd", 20, 1, 19));
5743   BOOST_TEST(testFLN(S("rhqdspkmebiflcotnjga"), "acfhdenops", 20, 5, 18));
5744   BOOST_TEST(testFLN(S("rahdtmsckfboqlpniegj"), "jopdeamcrk", 20, 9, 18));
5745   BOOST_TEST(testFLN(S("fbkeiopclstmdqranjhg"), "trqncbkgmh", 20, 10, 17));
5746   BOOST_TEST(testFLN(S("lifhpdgmbconstjeqark"), "tomglrkencbsfjqpihda", 20, 0, 19));
5747   BOOST_TEST(testFLN(S("pboqganrhedjmltsicfk"), "gbkhdnpoietfcmrslajq", 20, 1, 19));
5748   BOOST_TEST(testFLN(S("klchabsimetjnqgorfpd"), "rtfnmbsglkjaichoqedp", 20, 10, 19));
5749   BOOST_TEST(testFLN(S("sirfgmjqhctndbklaepo"), "ohkmdpfqbsacrtjnlgei", 20, 19, 1));
5750   BOOST_TEST(testFLN(S("rlbdsiceaonqjtfpghkm"), "dlbrteoisgphmkncajfq", 20, 20, S::npos));
5751   BOOST_TEST(testFLN(S("ecgdanriptblhjfqskom"), "", 21, 0, 19));
5752   BOOST_TEST(testFLN(S("fdmiarlpgcskbhoteqjn"), "sjrlo", 21, 0, 19));
5753   BOOST_TEST(testFLN(S("rlbstjqopignecmfadkh"), "qjpor", 21, 1, 19));
5754   BOOST_TEST(testFLN(S("grjpqmbshektdolcafni"), "odhfn", 21, 2, 19));
5755   BOOST_TEST(testFLN(S("sakfcohtqnibprjmlged"), "qtfin", 21, 4, 19));
5756   BOOST_TEST(testFLN(S("mjtdglasihqpocebrfkn"), "hpqfo", 21, 5, 19));
5757   BOOST_TEST(testFLN(S("okaplfrntghqbmeicsdj"), "fabmertkos", 21, 0, 19));
5758   BOOST_TEST(testFLN(S("sahngemrtcjidqbklfpo"), "brqtgkmaej", 21, 1, 19));
5759   BOOST_TEST(testFLN(S("dlmsipcnekhbgoaftqjr"), "nfrdeihsgl", 21, 5, 18));
5760   BOOST_TEST(testFLN(S("ahegrmqnoiklpfsdbcjt"), "hlfrosekpi", 21, 9, 19));
5761   BOOST_TEST(testFLN(S("hdsjbnmlegtkqripacof"), "atgbkrjdsm", 21, 10, 19));
5762   BOOST_TEST(testFLN(S("pcnedrfjihqbalkgtoms"), "blnrptjgqmaifsdkhoec", 21, 0, 19));
5763   BOOST_TEST(testFLN(S("qjidealmtpskrbfhocng"), "ctpmdahebfqjgknloris", 21, 1, 19));
5764   BOOST_TEST(testFLN(S("qeindtagmokpfhsclrbj"), "apnkeqthrmlbfodiscgj", 21, 10, 19));
5765   BOOST_TEST(testFLN(S("kpfegbjhsrnodltqciam"), "jdgictpframeoqlsbknh", 21, 19, 7));
5766   BOOST_TEST(testFLN(S("hnbrcplsjfgiktoedmaq"), "qprlsfojamgndekthibc", 21, 20, S::npos));
5767 }
5768 
5769 #include <iostream>
5770 
5771 // done
5772 void
testReplace()5773 testReplace()
5774 {
5775   // replace(size_type pos1, size_type n1, const charT* s, size_type n2);
5776   {
5777     static_string<20> fs1 = "helloworld";
5778     BOOST_TEST(fs1.replace(5, 2, fs1.data() + 1, 8) == "helloelloworlrld");
5779   }
5780   {
5781     static_string<20> fs1 = "helloworld";
5782     BOOST_TEST(fs1.replace(3, 2, fs1.data() + 2, 2) == "helllworld");
5783   }
5784   {
5785     static_string<20> fs2 = "0123456789";
5786     BOOST_TEST(fs2.replace(5, 2, fs2.data(), 2) == "0123401789");
5787   }
5788   {
5789     static_string<20> fs2 = "0123456789";
5790     BOOST_TEST(fs2.replace(1, 3, fs2.data() + 1, 5) == "012345456789");
5791   }
5792   {
5793     static_string<20> fs2 = "0123456789";
5794     BOOST_TEST(fs2.replace(0, 5, fs2.data(), 5) == "0123456789");
5795   }
5796   {
5797     static_string<20> fs2 = "0123456789";
5798     BOOST_TEST(fs2.replace(0, 5, fs2.data() + 5, 5) == "5678956789");
5799   }
5800   {
5801     static_string<20> fs2 = "0123456789";
5802     BOOST_TEST(fs2.replace(5, 2, fs2.data() + 3, 5) == "0123434567789");
5803   }
5804   {
5805     static_string<20> fs2 = "0123456789";
5806     BOOST_TEST(fs2.replace(5, 2, fs2.data() + 7, 3) == "01234789789");
5807   }
5808   {
5809     static_string<20> fs2 = "0123456789";
5810     BOOST_TEST(fs2.replace(3, 5, fs2.data() + 4, 2) == "0124589");
5811   }
5812   {
5813     static_string<20> fs2 = "0123456789";
5814     BOOST_TEST(fs2.replace(3, 5, fs2.data() + 1, 3) == "01212389");
5815   }
5816   {
5817     static_string<20> fs2 = "0123456789";
5818     BOOST_TEST(fs2.replace(0, 10, fs2.data(), 10) == "0123456789");
5819   }
5820   {
5821     static_string<20> fs2 = "0123456789";
5822     BOOST_TEST(fs2.replace(0, 10, fs2.data(), 5) == "01234");
5823   }
5824   {
5825     static_string<20> fs1 = "helloworld";
5826     BOOST_TEST(fs1.replace(4, 3, fs1.data() + 1, 3) == "hellellrld");
5827   }
5828   {
5829     static_string<20> fs1 = "helloworld";
5830     BOOST_TEST_EQ(fs1.replace(0, 1, fs1.data() + 4, 4), static_string<20>("oworelloworld"));
5831   }
5832   // replace(size_type pos1, size_type n1, const basic_string& str);
5833   {
5834     static_string<20> fs1 = "helloworld";
5835     BOOST_TEST(fs1.replace(0, fs1.size(), fs1) == "helloworld");
5836   }
5837   // replace(size_type pos1, size_type n1, const basic_string& str); unchecked
5838   {
5839     static_string<20> fs1 = "helloworld";
5840     static_string<15> fs2 = "helloworld";
5841     BOOST_TEST(fs1.replace(0, fs1.size(), fs2) == "helloworld");
5842   }
5843   // replace(size_type pos1, size_type n1, const basic_string& str, size_type pos2, size_type n2 = npos);
5844   {
5845     static_string<20> fs1 = "helloworld";
5846     BOOST_TEST(fs1.replace(0, fs1.size(), fs1, 0, fs1.size()) == "helloworld");
5847   }
5848   // replace(size_type pos1, size_type n1, const basic_string& str, size_type pos2, size_type n2 = npos); unchecked
5849   {
5850     static_string<20> fs1 = "helloworld";
5851     static_string<15> fs2 = "helloworld";
5852     BOOST_TEST(fs1.replace(0, fs1.size(), fs2, 0, fs2.size()) == "helloworld");
5853   }
5854   // replace(size_type pos1, size_type n1, const T& t);
5855   {
5856     static_string<20> fs1 = "helloworld";
5857     BOOST_TEST(fs1.replace(0, fs1.size(), string_view(fs1)) == "helloworld");
5858   }
5859   // replace(size_type pos1, size_type n1, const T& t, size_type pos2, size_type n2 = npos);
5860   {
5861     static_string<20> fs1 = "helloworld";
5862     BOOST_TEST(fs1.replace(0, fs1.size(), string_view(fs1), 0, fs1.size()) == "helloworld");
5863   }
5864   // replace(size_type pos, size_type n, const charT * s);
5865   {
5866     static_string<20> fs1 = "helloworld";
5867     BOOST_TEST(fs1.replace(0, fs1.size(), fs1.data()) == "helloworld");
5868   }
5869   // replace(size_type pos1, size_type n1, size_type n2, charT c);]
5870   {
5871     static_string<20> fs1 = "helloworld";
5872     BOOST_TEST(fs1.replace(0, fs1.size(), fs1.size(), 'a') == "aaaaaaaaaa");
5873   }
5874   // replace(const_iterator i1, const_iterator i2, const basic_string& str);
5875   {
5876     static_string<20> fs1 = "helloworld";
5877     BOOST_TEST(fs1.replace(fs1.begin(), fs1.end(), fs1) == "helloworld");
5878   }
5879   // replace(const_iterator i1, const_iterator i2, const basic_string& str); unchecked
5880   {
5881     static_string<20> fs1 = "helloworld";
5882     static_string<15> fs2 = "helloworld";
5883     BOOST_TEST(fs1.replace(fs1.begin(), fs1.end(), fs2) == "helloworld");
5884   }
5885   // replace(const_iterator i1, const_iterator i2, const T& t);
5886   {
5887     static_string<20> fs1 = "helloworld";
5888     BOOST_TEST(fs1.replace(fs1.begin(), fs1.end(), string_view(fs1)) == "helloworld");
5889   }
5890   // replace(const_iterator i1, const_iterator i2, const charT* s, size_type n);
5891   {
5892     static_string<20> fs1 = "helloworld";
5893     BOOST_TEST(fs1.replace(fs1.begin(), fs1.end(), fs1.data(), fs1.size()) == "helloworld");
5894   }
5895   // replace(const_iterator i1, const_iterator i2, const charT* s);
5896   {
5897     static_string<20> fs1 = "helloworld";
5898     BOOST_TEST(fs1.replace(fs1.begin(), fs1.end(), fs1.data()) == "helloworld");
5899   }
5900   // replace(const_iterator i1, const_iterator i2, size_type n, charT c);
5901   {
5902     static_string<20> fs1 = "helloworld";
5903     BOOST_TEST(fs1.replace(fs1.begin(), fs1.end(), fs1.size(), 'a') == "aaaaaaaaaa");
5904   }
5905   // replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
5906   {
5907     static_string<20> fs1 = "helloworld";
5908     BOOST_TEST(fs1.replace(fs1.begin(), fs1.begin() + 5, fs1.begin(), fs1.end()) == "helloworldworld");
5909   }
5910   // replace(const_iterator i1, const_iterator i2, initializer_list<charT> il);
5911   {
5912     static_string<20> fs1 = "helloworld";
5913     BOOST_TEST(fs1.replace(fs1.begin(), fs1.end(), {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'}) == "helloworld");
5914   }
5915   // replace(const_iterator, const_iterator, InputIterator, InputIterator)
5916   {
5917     std::stringstream a("defghi");
5918     static_string<30> b = "abcabcdefjklmnop";
5919     BOOST_TEST(b.replace(b.begin() + 3, b.begin() + 9,
5920       std::istream_iterator<char>(a),
5921       std::istream_iterator<char>()) ==
5922       "abcdefghijklmnop");
5923   }
5924 
5925   using S = static_string<400>;
5926   S s_short = "123/";
5927   S s_long = "Lorem ipsum dolor sit amet, consectetur/";
5928 
5929   BOOST_TEST(s_short.replace(s_short.begin(), s_short.begin(), s_short.begin(), s_short.end()) == "123/123/");
5930   BOOST_TEST(s_short.replace(s_short.begin(), s_short.begin(), s_short.begin(), s_short.end()) == "123/123/123/123/");
5931   BOOST_TEST(s_short.replace(s_short.begin(), s_short.begin(), s_short.begin(), s_short.end()) == "123/123/123/123/123/123/123/123/");
5932   BOOST_TEST(s_long.replace(s_long.begin(), s_long.begin(), s_long.begin(), s_long.end()) == "Lorem ipsum dolor sit amet, consectetur/Lorem ipsum dolor sit amet, consectetur/");
5933 
5934   BOOST_TEST(testR(S(""), 0, 0, "", S("")));
5935   BOOST_TEST(testR(S(""), 0, 0, "12345", S("12345")));
5936   BOOST_TEST(testR(S(""), 0, 0, "1234567890", S("1234567890")));
5937   BOOST_TEST(testR(S(""), 0, 0, "12345678901234567890", S("12345678901234567890")));
5938   BOOST_TEST(testR(S("abcde"), 0, 0, "", S("abcde")));
5939   BOOST_TEST(testR(S("abcde"), 0, 0, "12345", S("12345abcde")));
5940   BOOST_TEST(testR(S("abcde"), 0, 0, "1234567890", S("1234567890abcde")));
5941   BOOST_TEST(testR(S("abcde"), 0, 0, "12345678901234567890", S("12345678901234567890abcde")));
5942   BOOST_TEST(testR(S("abcde"), 0, 1, "", S("bcde")));
5943   BOOST_TEST(testR(S("abcde"), 0, 1, "12345", S("12345bcde")));
5944   BOOST_TEST(testR(S("abcde"), 0, 1, "1234567890", S("1234567890bcde")));
5945   BOOST_TEST(testR(S("abcde"), 0, 1, "12345678901234567890", S("12345678901234567890bcde")));
5946   BOOST_TEST(testR(S("abcde"), 0, 2, "", S("cde")));
5947   BOOST_TEST(testR(S("abcde"), 0, 2, "12345", S("12345cde")));
5948   BOOST_TEST(testR(S("abcde"), 0, 2, "1234567890", S("1234567890cde")));
5949   BOOST_TEST(testR(S("abcde"), 0, 2, "12345678901234567890", S("12345678901234567890cde")));
5950   BOOST_TEST(testR(S("abcde"), 0, 4, "", S("e")));
5951   BOOST_TEST(testR(S("abcde"), 0, 4, "12345", S("12345e")));
5952   BOOST_TEST(testR(S("abcde"), 0, 4, "1234567890", S("1234567890e")));
5953   BOOST_TEST(testR(S("abcde"), 0, 4, "12345678901234567890", S("12345678901234567890e")));
5954   BOOST_TEST(testR(S("abcde"), 0, 5, "", S("")));
5955   BOOST_TEST(testR(S("abcde"), 0, 5, "12345", S("12345")));
5956   BOOST_TEST(testR(S("abcde"), 0, 5, "1234567890", S("1234567890")));
5957   BOOST_TEST(testR(S("abcde"), 0, 5, "12345678901234567890", S("12345678901234567890")));
5958   BOOST_TEST(testR(S("abcde"), 1, 0, "", S("abcde")));
5959   BOOST_TEST(testR(S("abcde"), 1, 0, "12345", S("a12345bcde")));
5960   BOOST_TEST(testR(S("abcde"), 1, 0, "1234567890", S("a1234567890bcde")));
5961   BOOST_TEST(testR(S("abcde"), 1, 0, "12345678901234567890", S("a12345678901234567890bcde")));
5962   BOOST_TEST(testR(S("abcde"), 1, 1, "", S("acde")));
5963   BOOST_TEST(testR(S("abcde"), 1, 1, "12345", S("a12345cde")));
5964   BOOST_TEST(testR(S("abcde"), 1, 1, "1234567890", S("a1234567890cde")));
5965   BOOST_TEST(testR(S("abcde"), 1, 1, "12345678901234567890", S("a12345678901234567890cde")));
5966   BOOST_TEST(testR(S("abcde"), 1, 2, "", S("ade")));
5967   BOOST_TEST(testR(S("abcde"), 1, 2, "12345", S("a12345de")));
5968   BOOST_TEST(testR(S("abcde"), 1, 2, "1234567890", S("a1234567890de")));
5969   BOOST_TEST(testR(S("abcde"), 1, 2, "12345678901234567890", S("a12345678901234567890de")));
5970   BOOST_TEST(testR(S("abcde"), 1, 3, "", S("ae")));
5971   BOOST_TEST(testR(S("abcde"), 1, 3, "12345", S("a12345e")));
5972   BOOST_TEST(testR(S("abcde"), 1, 3, "1234567890", S("a1234567890e")));
5973   BOOST_TEST(testR(S("abcde"), 1, 3, "12345678901234567890", S("a12345678901234567890e")));
5974   BOOST_TEST(testR(S("abcde"), 1, 4, "", S("a")));
5975   BOOST_TEST(testR(S("abcde"), 1, 4, "12345", S("a12345")));
5976   BOOST_TEST(testR(S("abcde"), 1, 4, "1234567890", S("a1234567890")));
5977   BOOST_TEST(testR(S("abcde"), 1, 4, "12345678901234567890", S("a12345678901234567890")));
5978   BOOST_TEST(testR(S("abcde"), 2, 0, "", S("abcde")));
5979   BOOST_TEST(testR(S("abcde"), 2, 0, "12345", S("ab12345cde")));
5980   BOOST_TEST(testR(S("abcde"), 2, 0, "1234567890", S("ab1234567890cde")));
5981   BOOST_TEST(testR(S("abcde"), 2, 0, "12345678901234567890", S("ab12345678901234567890cde")));
5982   BOOST_TEST(testR(S("abcde"), 2, 1, "", S("abde")));
5983   BOOST_TEST(testR(S("abcde"), 2, 1, "12345", S("ab12345de")));
5984   BOOST_TEST(testR(S("abcde"), 2, 1, "1234567890", S("ab1234567890de")));
5985   BOOST_TEST(testR(S("abcde"), 2, 1, "12345678901234567890", S("ab12345678901234567890de")));
5986   BOOST_TEST(testR(S("abcde"), 2, 2, "", S("abe")));
5987   BOOST_TEST(testR(S("abcde"), 2, 2, "12345", S("ab12345e")));
5988   BOOST_TEST(testR(S("abcde"), 2, 2, "1234567890", S("ab1234567890e")));
5989   BOOST_TEST(testR(S("abcde"), 2, 2, "12345678901234567890", S("ab12345678901234567890e")));
5990   BOOST_TEST(testR(S("abcde"), 2, 3, "", S("ab")));
5991   BOOST_TEST(testR(S("abcde"), 2, 3, "12345", S("ab12345")));
5992   BOOST_TEST(testR(S("abcde"), 2, 3, "1234567890", S("ab1234567890")));
5993   BOOST_TEST(testR(S("abcde"), 2, 3, "12345678901234567890", S("ab12345678901234567890")));
5994   BOOST_TEST(testR(S("abcde"), 4, 0, "", S("abcde")));
5995   BOOST_TEST(testR(S("abcde"), 4, 0, "12345", S("abcd12345e")));
5996   BOOST_TEST(testR(S("abcde"), 4, 0, "1234567890", S("abcd1234567890e")));
5997   BOOST_TEST(testR(S("abcde"), 4, 0, "12345678901234567890", S("abcd12345678901234567890e")));
5998   BOOST_TEST(testR(S("abcde"), 4, 1, "", S("abcd")));
5999   BOOST_TEST(testR(S("abcde"), 4, 1, "12345", S("abcd12345")));
6000   BOOST_TEST(testR(S("abcde"), 4, 1, "1234567890", S("abcd1234567890")));
6001   BOOST_TEST(testR(S("abcde"), 4, 1, "12345678901234567890", S("abcd12345678901234567890")));
6002   BOOST_TEST(testR(S("abcde"), 5, 0, "", S("abcde")));
6003   BOOST_TEST(testR(S("abcde"), 5, 0, "12345", S("abcde12345")));
6004   BOOST_TEST(testR(S("abcde"), 5, 0, "1234567890", S("abcde1234567890")));
6005   BOOST_TEST(testR(S("abcde"), 5, 0, "12345678901234567890", S("abcde12345678901234567890")));
6006   BOOST_TEST(testR(S("abcdefghij"), 0, 0, "", S("abcdefghij")));
6007   BOOST_TEST(testR(S("abcdefghij"), 0, 0, "12345", S("12345abcdefghij")));
6008   BOOST_TEST(testR(S("abcdefghij"), 0, 0, "1234567890", S("1234567890abcdefghij")));
6009   BOOST_TEST(testR(S("abcdefghij"), 0, 0, "12345678901234567890", S("12345678901234567890abcdefghij")));
6010   BOOST_TEST(testR(S("abcdefghij"), 0, 1, "", S("bcdefghij")));
6011   BOOST_TEST(testR(S("abcdefghij"), 0, 1, "12345", S("12345bcdefghij")));
6012   BOOST_TEST(testR(S("abcdefghij"), 0, 1, "1234567890", S("1234567890bcdefghij")));
6013   BOOST_TEST(testR(S("abcdefghij"), 0, 1, "12345678901234567890", S("12345678901234567890bcdefghij")));
6014   BOOST_TEST(testR(S("abcdefghij"), 0, 5, "", S("fghij")));
6015   BOOST_TEST(testR(S("abcdefghij"), 0, 5, "12345", S("12345fghij")));
6016   BOOST_TEST(testR(S("abcdefghij"), 0, 5, "1234567890", S("1234567890fghij")));
6017   BOOST_TEST(testR(S("abcdefghij"), 0, 5, "12345678901234567890", S("12345678901234567890fghij")));
6018   BOOST_TEST(testR(S("abcdefghij"), 0, 9, "", S("j")));
6019   BOOST_TEST(testR(S("abcdefghij"), 0, 9, "12345", S("12345j")));
6020   BOOST_TEST(testR(S("abcdefghij"), 0, 9, "1234567890", S("1234567890j")));
6021   BOOST_TEST(testR(S("abcdefghij"), 0, 9, "12345678901234567890", S("12345678901234567890j")));
6022   BOOST_TEST(testR(S("abcdefghij"), 0, 10, "", S("")));
6023   BOOST_TEST(testR(S("abcdefghij"), 0, 10, "12345", S("12345")));
6024   BOOST_TEST(testR(S("abcdefghij"), 0, 10, "1234567890", S("1234567890")));
6025   BOOST_TEST(testR(S("abcdefghij"), 0, 10, "12345678901234567890", S("12345678901234567890")));
6026   BOOST_TEST(testR(S("abcdefghij"), 1, 0, "", S("abcdefghij")));
6027   BOOST_TEST(testR(S("abcdefghij"), 1, 0, "12345", S("a12345bcdefghij")));
6028   BOOST_TEST(testR(S("abcdefghij"), 1, 0, "1234567890", S("a1234567890bcdefghij")));
6029   BOOST_TEST(testR(S("abcdefghij"), 1, 0, "12345678901234567890", S("a12345678901234567890bcdefghij")));
6030   BOOST_TEST(testR(S("abcdefghij"), 1, 1, "", S("acdefghij")));
6031   BOOST_TEST(testR(S("abcdefghij"), 1, 1, "12345", S("a12345cdefghij")));
6032   BOOST_TEST(testR(S("abcdefghij"), 1, 1, "1234567890", S("a1234567890cdefghij")));
6033   BOOST_TEST(testR(S("abcdefghij"), 1, 1, "12345678901234567890", S("a12345678901234567890cdefghij")));
6034   BOOST_TEST(testR(S(""), 0, 0, 0, '2', S("")));
6035   BOOST_TEST(testR(S(""), 0, 0, 5, '2', S("22222")));
6036   BOOST_TEST(testR(S(""), 0, 0, 10, '2', S("2222222222")));
6037   BOOST_TEST(testR(S(""), 0, 0, 20, '2', S("22222222222222222222")));
6038   BOOST_TEST(testR(S(""), 0, 1, 0, '2', S("")));
6039   BOOST_TEST(testR(S(""), 0, 1, 5, '2', S("22222")));
6040   BOOST_TEST(testR(S(""), 0, 1, 10, '2', S("2222222222")));
6041   BOOST_TEST(testR(S(""), 0, 1, 20, '2', S("22222222222222222222")));
6042   BOOST_TEST(testR(S("abcde"), 0, 0, 0, '2', S("abcde")));
6043   BOOST_TEST(testR(S("abcde"), 0, 0, 5, '2', S("22222abcde")));
6044   BOOST_TEST(testR(S("abcde"), 0, 0, 10, '2', S("2222222222abcde")));
6045   BOOST_TEST(testR(S("abcde"), 0, 0, 20, '2', S("22222222222222222222abcde")));
6046   BOOST_TEST(testR(S("abcde"), 0, 1, 0, '2', S("bcde")));
6047   BOOST_TEST(testR(S("abcde"), 0, 1, 5, '2', S("22222bcde")));
6048   BOOST_TEST(testR(S("abcde"), 0, 1, 10, '2', S("2222222222bcde")));
6049   BOOST_TEST(testR(S("abcde"), 0, 1, 20, '2', S("22222222222222222222bcde")));
6050   BOOST_TEST(testR(S("abcde"), 0, 2, 0, '2', S("cde")));
6051   BOOST_TEST(testR(S("abcde"), 0, 2, 5, '2', S("22222cde")));
6052   BOOST_TEST(testR(S("abcde"), 0, 2, 10, '2', S("2222222222cde")));
6053   BOOST_TEST(testR(S("abcde"), 0, 2, 20, '2', S("22222222222222222222cde")));
6054   BOOST_TEST(testR(S("abcde"), 0, 4, 0, '2', S("e")));
6055   BOOST_TEST(testR(S("abcde"), 0, 4, 5, '2', S("22222e")));
6056   BOOST_TEST(testR(S("abcde"), 0, 4, 10, '2', S("2222222222e")));
6057   BOOST_TEST(testR(S("abcde"), 0, 4, 20, '2', S("22222222222222222222e")));
6058   BOOST_TEST(testR(S("abcde"), 0, 5, 0, '2', S("")));
6059   BOOST_TEST(testR(S("abcde"), 0, 5, 5, '2', S("22222")));
6060   BOOST_TEST(testR(S("abcde"), 0, 5, 10, '2', S("2222222222")));
6061   BOOST_TEST(testR(S("abcde"), 0, 5, 20, '2', S("22222222222222222222")));
6062   BOOST_TEST(testR(S("abcde"), 0, 6, 0, '2', S("")));
6063   BOOST_TEST(testR(S("abcde"), 0, 6, 5, '2', S("22222")));
6064   BOOST_TEST(testR(S("abcde"), 0, 6, 10, '2', S("2222222222")));
6065   BOOST_TEST(testR(S("abcde"), 0, 6, 20, '2', S("22222222222222222222")));
6066   BOOST_TEST(testR(S("abcde"), 1, 0, 0, '2', S("abcde")));
6067   BOOST_TEST(testR(S("abcde"), 1, 0, 5, '2', S("a22222bcde")));
6068   BOOST_TEST(testR(S("abcde"), 1, 0, 10, '2', S("a2222222222bcde")));
6069   BOOST_TEST(testR(S("abcde"), 1, 0, 20, '2', S("a22222222222222222222bcde")));
6070   BOOST_TEST(testR(S("abcde"), 1, 1, 0, '2', S("acde")));
6071   BOOST_TEST(testR(S("abcde"), 1, 1, 5, '2', S("a22222cde")));
6072   BOOST_TEST(testR(S("abcde"), 1, 1, 10, '2', S("a2222222222cde")));
6073   BOOST_TEST(testR(S("abcde"), 1, 1, 20, '2', S("a22222222222222222222cde")));
6074   BOOST_TEST(testR(S("abcde"), 1, 2, 0, '2', S("ade")));
6075   BOOST_TEST(testR(S("abcde"), 1, 2, 5, '2', S("a22222de")));
6076   BOOST_TEST(testR(S("abcde"), 1, 2, 10, '2', S("a2222222222de")));
6077   BOOST_TEST(testR(S("abcde"), 1, 2, 20, '2', S("a22222222222222222222de")));
6078   BOOST_TEST(testR(S("abcde"), 1, 3, 0, '2', S("ae")));
6079   BOOST_TEST(testR(S("abcde"), 1, 3, 5, '2', S("a22222e")));
6080   BOOST_TEST(testR(S("abcde"), 1, 3, 10, '2', S("a2222222222e")));
6081   BOOST_TEST(testR(S("abcde"), 1, 3, 20, '2', S("a22222222222222222222e")));
6082   BOOST_TEST(testR(S("abcde"), 1, 4, 0, '2', S("a")));
6083   BOOST_TEST(testR(S("abcde"), 1, 4, 5, '2', S("a22222")));
6084   BOOST_TEST(testR(S("abcde"), 1, 4, 10, '2', S("a2222222222")));
6085   BOOST_TEST(testR(S("abcde"), 1, 4, 20, '2', S("a22222222222222222222")));
6086   BOOST_TEST(testR(S("abcde"), 1, 5, 0, '2', S("a")));
6087   BOOST_TEST(testR(S("abcde"), 1, 5, 5, '2', S("a22222")));
6088   BOOST_TEST(testR(S("abcde"), 1, 5, 10, '2', S("a2222222222")));
6089   BOOST_TEST(testR(S("abcde"), 1, 5, 20, '2', S("a22222222222222222222")));
6090   BOOST_TEST(testR(S("abcde"), 2, 0, 0, '2', S("abcde")));
6091   BOOST_TEST(testR(S("abcde"), 2, 0, 5, '2', S("ab22222cde")));
6092   BOOST_TEST(testR(S("abcde"), 2, 0, 10, '2', S("ab2222222222cde")));
6093   BOOST_TEST(testR(S("abcde"), 2, 0, 20, '2', S("ab22222222222222222222cde")));
6094   BOOST_TEST(testR(S("abcde"), 2, 1, 0, '2', S("abde")));
6095   BOOST_TEST(testR(S("abcde"), 2, 1, 5, '2', S("ab22222de")));
6096   BOOST_TEST(testR(S("abcde"), 2, 1, 10, '2', S("ab2222222222de")));
6097   BOOST_TEST(testR(S("abcde"), 2, 1, 20, '2', S("ab22222222222222222222de")));
6098   BOOST_TEST(testR(S("abcde"), 2, 2, 0, '2', S("abe")));
6099   BOOST_TEST(testR(S("abcde"), 2, 2, 5, '2', S("ab22222e")));
6100   BOOST_TEST(testR(S("abcde"), 2, 2, 10, '2', S("ab2222222222e")));
6101   BOOST_TEST(testR(S("abcde"), 2, 2, 20, '2', S("ab22222222222222222222e")));
6102   BOOST_TEST(testR(S("abcde"), 2, 3, 0, '2', S("ab")));
6103   BOOST_TEST(testR(S("abcde"), 2, 3, 5, '2', S("ab22222")));
6104   BOOST_TEST(testR(S("abcde"), 2, 3, 10, '2', S("ab2222222222")));
6105   BOOST_TEST(testR(S("abcde"), 2, 3, 20, '2', S("ab22222222222222222222")));
6106   BOOST_TEST(testR(S("abcde"), 2, 4, 0, '2', S("ab")));
6107   BOOST_TEST(testR(S("abcde"), 2, 4, 5, '2', S("ab22222")));
6108   BOOST_TEST(testR(S("abcde"), 2, 4, 10, '2', S("ab2222222222")));
6109   BOOST_TEST(testR(S("abcde"), 2, 4, 20, '2', S("ab22222222222222222222")));
6110   BOOST_TEST(testR(S("abcde"), 4, 0, 0, '2', S("abcde")));
6111   BOOST_TEST(testR(S("abcde"), 4, 0, 5, '2', S("abcd22222e")));
6112   BOOST_TEST(testR(S("abcde"), 4, 0, 10, '2', S("abcd2222222222e")));
6113   BOOST_TEST(testR(S("abcde"), 4, 0, 20, '2', S("abcd22222222222222222222e")));
6114   BOOST_TEST(testR(S("abcde"), 4, 1, 0, '2', S("abcd")));
6115   BOOST_TEST(testR(S("abcde"), 4, 1, 5, '2', S("abcd22222")));
6116   BOOST_TEST(testR(S("abcde"), 4, 1, 10, '2', S("abcd2222222222")));
6117   BOOST_TEST(testR(S("abcde"), 4, 1, 20, '2', S("abcd22222222222222222222")));
6118   BOOST_TEST(testR(S("abcde"), 4, 2, 0, '2', S("abcd")));
6119 
6120   BOOST_TEST(testR(S("abcde"), 4, 2, 5, '2', S("abcd22222")));
6121   BOOST_TEST(testR(S("abcde"), 4, 2, 10, '2', S("abcd2222222222")));
6122   BOOST_TEST(testR(S("abcde"), 4, 2, 20, '2', S("abcd22222222222222222222")));
6123 
6124   BOOST_TEST(testR(S("abcde"), 5, 0, 0, '2', S("abcde")));
6125   BOOST_TEST(testR(S("abcde"), 5, 0, 5, '2', S("abcde22222")));
6126   BOOST_TEST(testR(S("abcde"), 5, 0, 10, '2', S("abcde2222222222")));
6127   BOOST_TEST(testR(S("abcde"), 5, 0, 20, '2', S("abcde22222222222222222222")));
6128 
6129   BOOST_TEST(testR(S("abcde"), 5, 1, 0, '2', S("abcde")));
6130   BOOST_TEST(testR(S("abcde"), 5, 1, 5, '2', S("abcde22222")));
6131   BOOST_TEST(testR(S("abcde"), 5, 1, 10, '2', S("abcde2222222222")));
6132   BOOST_TEST(testR(S("abcde"), 5, 1, 20, '2', S("abcde22222222222222222222")));
6133 
6134   BOOST_TEST(testR(S("abcde"), 0, 4, "12345", 4, S("1234e")));
6135   BOOST_TEST(testR(S("abcde"), 0, 4, "12345", 5, S("12345e")));
6136   BOOST_TEST(testR(S("abcde"), 0, 4, "1234567890", 0, S("e")));
6137   BOOST_TEST(testR(S("abcde"), 0, 4, "1234567890", 1, S("1e")));
6138   BOOST_TEST(testR(S("abcde"), 0, 4, "1234567890", 5, S("12345e")));
6139   BOOST_TEST(testR(S("abcde"), 0, 4, "1234567890", 9, S("123456789e")));
6140   BOOST_TEST(testR(S("abcde"), 0, 4, "1234567890", 10, S("1234567890e")));
6141   BOOST_TEST(testR(S("abcde"), 0, 4, "12345678901234567890", 0, S("e")));
6142   BOOST_TEST(testR(S("abcde"), 0, 4, "12345678901234567890", 1, S("1e")));
6143   BOOST_TEST(testR(S("abcde"), 0, 4, "12345678901234567890", 10, S("1234567890e")));
6144   BOOST_TEST(testR(S("abcde"), 0, 4, "12345678901234567890", 19, S("1234567890123456789e")));
6145   BOOST_TEST(testR(S("abcde"), 0, 4, "12345678901234567890", 20, S("12345678901234567890e")));
6146   BOOST_TEST(testR(S("abcde"), 0, 5, "", 0, S("")));
6147   BOOST_TEST(testR(S("abcde"), 0, 5, "12345", 0, S("")));
6148   BOOST_TEST(testR(S("abcde"), 0, 5, "12345", 1, S("1")));
6149   BOOST_TEST(testR(S("abcde"), 0, 5, "12345", 2, S("12")));
6150   BOOST_TEST(testR(S("abcde"), 0, 5, "12345", 4, S("1234")));
6151   BOOST_TEST(testR(S("abcde"), 0, 5, "12345", 5, S("12345")));
6152   BOOST_TEST(testR(S("abcde"), 0, 5, "1234567890", 0, S("")));
6153   BOOST_TEST(testR(S("abcde"), 0, 5, "1234567890", 1, S("1")));
6154   BOOST_TEST(testR(S("abcde"), 0, 5, "1234567890", 5, S("12345")));
6155   BOOST_TEST(testR(S("abcde"), 0, 5, "1234567890", 9, S("123456789")));
6156   BOOST_TEST(testR(S("abcde"), 0, 5, "1234567890", 10, S("1234567890")));
6157   BOOST_TEST(testR(S("abcde"), 0, 5, "12345678901234567890", 0, S("")));
6158   BOOST_TEST(testR(S("abcde"), 0, 5, "12345678901234567890", 1, S("1")));
6159   BOOST_TEST(testR(S("abcde"), 0, 5, "12345678901234567890", 10, S("1234567890")));
6160   BOOST_TEST(testR(S("abcde"), 0, 5, "12345678901234567890", 19, S("1234567890123456789")));
6161   BOOST_TEST(testR(S("abcde"), 0, 5, "12345678901234567890", 20, S("12345678901234567890")));
6162   BOOST_TEST(testR(S("abcde"), 0, 6, "", 0, S("")));
6163   BOOST_TEST(testR(S("abcde"), 0, 6, "12345", 0, S("")));
6164   BOOST_TEST(testR(S("abcde"), 0, 6, "12345", 1, S("1")));
6165   BOOST_TEST(testR(S("abcde"), 0, 6, "12345", 2, S("12")));
6166   BOOST_TEST(testR(S("abcde"), 0, 6, "12345", 4, S("1234")));
6167   BOOST_TEST(testR(S("abcde"), 0, 6, "12345", 5, S("12345")));
6168   BOOST_TEST(testR(S("abcde"), 0, 6, "1234567890", 0, S("")));
6169   BOOST_TEST(testR(S("abcde"), 0, 6, "1234567890", 1, S("1")));
6170   BOOST_TEST(testR(S("abcde"), 0, 6, "1234567890", 5, S("12345")));
6171   BOOST_TEST(testR(S("abcde"), 0, 6, "1234567890", 9, S("123456789")));
6172   BOOST_TEST(testR(S("abcde"), 0, 6, "1234567890", 10, S("1234567890")));
6173   BOOST_TEST(testR(S("abcde"), 0, 6, "12345678901234567890", 0, S("")));
6174   BOOST_TEST(testR(S("abcde"), 0, 6, "12345678901234567890", 1, S("1")));
6175   BOOST_TEST(testR(S("abcde"), 0, 6, "12345678901234567890", 10, S("1234567890")));
6176   BOOST_TEST(testR(S("abcde"), 0, 6, "12345678901234567890", 19, S("1234567890123456789")));
6177   BOOST_TEST(testR(S("abcde"), 0, 6, "12345678901234567890", 20, S("12345678901234567890")));
6178   BOOST_TEST(testR(S("abcde"), 1, 0, "", 0, S("abcde")));
6179   BOOST_TEST(testR(S("abcde"), 1, 0, "12345", 0, S("abcde")));
6180   BOOST_TEST(testR(S("abcde"), 1, 0, "12345", 1, S("a1bcde")));
6181   BOOST_TEST(testR(S("abcde"), 1, 0, "12345", 2, S("a12bcde")));
6182   BOOST_TEST(testR(S("abcde"), 1, 0, "12345", 4, S("a1234bcde")));
6183   BOOST_TEST(testR(S("abcde"), 1, 0, "12345", 5, S("a12345bcde")));
6184   BOOST_TEST(testR(S("abcde"), 1, 0, "1234567890", 0, S("abcde")));
6185   BOOST_TEST(testR(S("abcde"), 1, 0, "1234567890", 1, S("a1bcde")));
6186   BOOST_TEST(testR(S("abcde"), 1, 0, "1234567890", 5, S("a12345bcde")));
6187   BOOST_TEST(testR(S("abcde"), 1, 0, "1234567890", 9, S("a123456789bcde")));
6188   BOOST_TEST(testR(S("abcde"), 1, 0, "1234567890", 10, S("a1234567890bcde")));
6189   BOOST_TEST(testR(S("abcde"), 1, 0, "12345678901234567890", 0, S("abcde")));
6190   BOOST_TEST(testR(S("abcde"), 1, 0, "12345678901234567890", 1, S("a1bcde")));
6191   BOOST_TEST(testR(S("abcde"), 1, 0, "12345678901234567890", 10, S("a1234567890bcde")));
6192   BOOST_TEST(testR(S("abcde"), 1, 0, "12345678901234567890", 19, S("a1234567890123456789bcde")));
6193   BOOST_TEST(testR(S("abcde"), 1, 0, "12345678901234567890", 20, S("a12345678901234567890bcde")));
6194   BOOST_TEST(testR(S("abcde"), 1, 1, "", 0, S("acde")));
6195   BOOST_TEST(testR(S("abcde"), 1, 1, "12345", 0, S("acde")));
6196   BOOST_TEST(testR(S("abcde"), 1, 1, "12345", 1, S("a1cde")));
6197   BOOST_TEST(testR(S("abcde"), 1, 1, "12345", 2, S("a12cde")));
6198   BOOST_TEST(testR(S("abcde"), 1, 1, "12345", 4, S("a1234cde")));
6199   BOOST_TEST(testR(S("abcde"), 1, 1, "12345", 5, S("a12345cde")));
6200   BOOST_TEST(testR(S("abcde"), 1, 1, "1234567890", 0, S("acde")));
6201   BOOST_TEST(testR(S("abcde"), 1, 1, "1234567890", 1, S("a1cde")));
6202   BOOST_TEST(testR(S("abcde"), 1, 1, "1234567890", 5, S("a12345cde")));
6203   BOOST_TEST(testR(S("abcde"), 1, 1, "1234567890", 9, S("a123456789cde")));
6204   BOOST_TEST(testR(S("abcde"), 1, 1, "1234567890", 10, S("a1234567890cde")));
6205   BOOST_TEST(testR(S("abcde"), 1, 1, "12345678901234567890", 0, S("acde")));
6206   BOOST_TEST(testR(S("abcde"), 1, 1, "12345678901234567890", 1, S("a1cde")));
6207   BOOST_TEST(testR(S("abcde"), 1, 1, "12345678901234567890", 10, S("a1234567890cde")));
6208   BOOST_TEST(testR(S("abcde"), 1, 1, "12345678901234567890", 19, S("a1234567890123456789cde")));
6209   BOOST_TEST(testR(S("abcde"), 1, 1, "12345678901234567890", 20, S("a12345678901234567890cde")));
6210   BOOST_TEST(testR(S("abcde"), 1, 2, "", 0, S("ade")));
6211   BOOST_TEST(testR(S("abcde"), 1, 2, "12345", 0, S("ade")));
6212   BOOST_TEST(testR(S("abcde"), 1, 2, "12345", 1, S("a1de")));
6213   BOOST_TEST(testR(S("abcde"), 1, 2, "12345", 2, S("a12de")));
6214   BOOST_TEST(testR(S("abcde"), 1, 2, "12345", 4, S("a1234de")));
6215   BOOST_TEST(testR(S("abcde"), 1, 2, "12345", 5, S("a12345de")));
6216   BOOST_TEST(testR(S("abcde"), 1, 2, "1234567890", 0, S("ade")));
6217   BOOST_TEST(testR(S("abcde"), 1, 2, "1234567890", 1, S("a1de")));
6218   BOOST_TEST(testR(S("abcde"), 1, 2, "1234567890", 5, S("a12345de")));
6219   BOOST_TEST(testR(S("abcde"), 1, 2, "1234567890", 9, S("a123456789de")));
6220   BOOST_TEST(testR(S("abcde"), 1, 2, "1234567890", 10, S("a1234567890de")));
6221   BOOST_TEST(testR(S("abcde"), 1, 2, "12345678901234567890", 0, S("ade")));
6222   BOOST_TEST(testR(S("abcde"), 1, 2, "12345678901234567890", 1, S("a1de")));
6223   BOOST_TEST(testR(S("abcde"), 1, 2, "12345678901234567890", 10, S("a1234567890de")));
6224   BOOST_TEST(testR(S("abcde"), 1, 2, "12345678901234567890", 19, S("a1234567890123456789de")));
6225   BOOST_TEST(testR(S("abcde"), 1, 2, "12345678901234567890", 20, S("a12345678901234567890de")));
6226   BOOST_TEST(testR(S("abcde"), 1, 3, "", 0, S("ae")));
6227   BOOST_TEST(testR(S("abcde"), 1, 3, "12345", 0, S("ae")));
6228   BOOST_TEST(testR(S("abcde"), 1, 3, "12345", 1, S("a1e")));
6229   BOOST_TEST(testR(S("abcde"), 1, 3, "12345", 2, S("a12e")));
6230   BOOST_TEST(testR(S("abcde"), 1, 3, "12345", 4, S("a1234e")));
6231   BOOST_TEST(testR(S("abcde"), 1, 3, "12345", 5, S("a12345e")));
6232   BOOST_TEST(testR(S("abcde"), 1, 3, "1234567890", 0, S("ae")));
6233   BOOST_TEST(testR(S("abcde"), 1, 3, "1234567890", 1, S("a1e")));
6234   BOOST_TEST(testR(S("abcdefghij"), 1, 10, "1234567890", 5, S("a12345")));
6235   BOOST_TEST(testR(S("abcdefghij"), 1, 10, "1234567890", 9, S("a123456789")));
6236   BOOST_TEST(testR(S("abcdefghij"), 1, 10, "1234567890", 10, S("a1234567890")));
6237   BOOST_TEST(testR(S("abcdefghij"), 1, 10, "12345678901234567890", 0, S("a")));
6238   BOOST_TEST(testR(S("abcdefghij"), 1, 10, "12345678901234567890", 1, S("a1")));
6239   BOOST_TEST(testR(S("abcdefghij"), 1, 10, "12345678901234567890", 10, S("a1234567890")));
6240   BOOST_TEST(testR(S("abcdefghij"), 1, 10, "12345678901234567890", 19, S("a1234567890123456789")));
6241   BOOST_TEST(testR(S("abcdefghij"), 1, 10, "12345678901234567890", 20, S("a12345678901234567890")));
6242   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "", 0, S("abcdefghij")));
6243   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345", 0, S("abcdefghij")));
6244   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345", 1, S("abcde1fghij")));
6245   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345", 2, S("abcde12fghij")));
6246   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345", 4, S("abcde1234fghij")));
6247   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345", 5, S("abcde12345fghij")));
6248   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "1234567890", 0, S("abcdefghij")));
6249   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "1234567890", 1, S("abcde1fghij")));
6250   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "1234567890", 5, S("abcde12345fghij")));
6251   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "1234567890", 9, S("abcde123456789fghij")));
6252   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "1234567890", 10, S("abcde1234567890fghij")));
6253   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345678901234567890", 0, S("abcdefghij")));
6254   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345678901234567890", 1, S("abcde1fghij")));
6255   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345678901234567890", 10, S("abcde1234567890fghij")));
6256   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345678901234567890", 19, S("abcde1234567890123456789fghij")));
6257   BOOST_TEST(testR(S("abcdefghij"), 5, 0, "12345678901234567890", 20, S("abcde12345678901234567890fghij")));
6258   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "", 0, S("abcdeghij")));
6259   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345", 0, S("abcdeghij")));
6260   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345", 1, S("abcde1ghij")));
6261   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345", 2, S("abcde12ghij")));
6262   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345", 4, S("abcde1234ghij")));
6263   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345", 5, S("abcde12345ghij")));
6264   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "1234567890", 0, S("abcdeghij")));
6265   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "1234567890", 1, S("abcde1ghij")));
6266   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "1234567890", 5, S("abcde12345ghij")));
6267   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "1234567890", 9, S("abcde123456789ghij")));
6268   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "1234567890", 10, S("abcde1234567890ghij")));
6269   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345678901234567890", 0, S("abcdeghij")));
6270   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345678901234567890", 1, S("abcde1ghij")));
6271   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345678901234567890", 10, S("abcde1234567890ghij")));
6272   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345678901234567890", 19, S("abcde1234567890123456789ghij")));
6273   BOOST_TEST(testR(S("abcdefghij"), 5, 1, "12345678901234567890", 20, S("abcde12345678901234567890ghij")));
6274   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "", 0, S("abcdehij")));
6275   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345", 0, S("abcdehij")));
6276   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345", 1, S("abcde1hij")));
6277   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345", 2, S("abcde12hij")));
6278   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345", 4, S("abcde1234hij")));
6279   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345", 5, S("abcde12345hij")));
6280   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "1234567890", 0, S("abcdehij")));
6281   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "1234567890", 1, S("abcde1hij")));
6282   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "1234567890", 5, S("abcde12345hij")));
6283   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "1234567890", 9, S("abcde123456789hij")));
6284   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "1234567890", 10, S("abcde1234567890hij")));
6285   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345678901234567890", 0, S("abcdehij")));
6286   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345678901234567890", 1, S("abcde1hij")));
6287   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345678901234567890", 10, S("abcde1234567890hij")));
6288   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345678901234567890", 19, S("abcde1234567890123456789hij")));
6289   BOOST_TEST(testR(S("abcdefghij"), 5, 2, "12345678901234567890", 20, S("abcde12345678901234567890hij")));
6290   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "", 0, S("abcdej")));
6291   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345", 0, S("abcdej")));
6292   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345", 1, S("abcde1j")));
6293   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345", 2, S("abcde12j")));
6294   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345", 4, S("abcde1234j")));
6295   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345", 5, S("abcde12345j")));
6296   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "1234567890", 0, S("abcdej")));
6297   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "1234567890", 1, S("abcde1j")));
6298   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "1234567890", 5, S("abcde12345j")));
6299   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "1234567890", 9, S("abcde123456789j")));
6300   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "1234567890", 10, S("abcde1234567890j")));
6301   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345678901234567890", 0, S("abcdej")));
6302   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345678901234567890", 1, S("abcde1j")));
6303   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345678901234567890", 10, S("abcde1234567890j")));
6304   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345678901234567890", 19, S("abcde1234567890123456789j")));
6305   BOOST_TEST(testR(S("abcdefghij"), 5, 4, "12345678901234567890", 20, S("abcde12345678901234567890j")));
6306   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "", 0, S("abcde")));
6307   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345", 0, S("abcde")));
6308   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345", 1, S("abcde1")));
6309   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345", 2, S("abcde12")));
6310   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345", 4, S("abcde1234")));
6311   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345", 5, S("abcde12345")));
6312   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "1234567890", 0, S("abcde")));
6313   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "1234567890", 1, S("abcde1")));
6314   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "1234567890", 5, S("abcde12345")));
6315   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "1234567890", 9, S("abcde123456789")));
6316   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "1234567890", 10, S("abcde1234567890")));
6317   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345678901234567890", 0, S("abcde")));
6318   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345678901234567890", 1, S("abcde1")));
6319   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345678901234567890", 10, S("abcde1234567890")));
6320   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345678901234567890", 19, S("abcde1234567890123456789")));
6321   BOOST_TEST(testR(S("abcdefghij"), 5, 5, "12345678901234567890", 20, S("abcde12345678901234567890")));
6322   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "", 0, S("abcde")));
6323   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "12345", 0, S("abcde")));
6324   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "12345", 1, S("abcde1")));
6325   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "12345", 2, S("abcde12")));
6326   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "12345", 4, S("abcde1234")));
6327   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "12345", 5, S("abcde12345")));
6328   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "1234567890", 0, S("abcde")));
6329   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "1234567890", 1, S("abcde1")));
6330   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "1234567890", 5, S("abcde12345")));
6331   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "1234567890", 9, S("abcde123456789")));
6332   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "1234567890", 10, S("abcde1234567890")));
6333   BOOST_TEST(testR(S("abcdefghij"), 5, 6, "12345678901234567890", 0, S("abcde")));
6334   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "", 0, S("abcdefghijklmnopqrst")));
6335   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345", 0, S("abcdefghijklmnopqrst")));
6336   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345", 1, S("1abcdefghijklmnopqrst")));
6337   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345", 2, S("12abcdefghijklmnopqrst")));
6338   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345", 4, S("1234abcdefghijklmnopqrst")));
6339   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345", 5, S("12345abcdefghijklmnopqrst")));
6340   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "1234567890", 0, S("abcdefghijklmnopqrst")));
6341   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "1234567890", 1, S("1abcdefghijklmnopqrst")));
6342   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "1234567890", 5, S("12345abcdefghijklmnopqrst")));
6343   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "1234567890", 9, S("123456789abcdefghijklmnopqrst")));
6344   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "1234567890", 10, S("1234567890abcdefghijklmnopqrst")));
6345   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
6346   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345678901234567890", 1, S("1abcdefghijklmnopqrst")));
6347   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345678901234567890", 10, S("1234567890abcdefghijklmnopqrst")));
6348   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345678901234567890", 19, S("1234567890123456789abcdefghijklmnopqrst")));
6349   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 0, "12345678901234567890", 20, S("12345678901234567890abcdefghijklmnopqrst")));
6350   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "", 0, S("bcdefghijklmnopqrst")));
6351   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345", 0, S("bcdefghijklmnopqrst")));
6352   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345", 1, S("1bcdefghijklmnopqrst")));
6353   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345", 2, S("12bcdefghijklmnopqrst")));
6354   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345", 4, S("1234bcdefghijklmnopqrst")));
6355   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345", 5, S("12345bcdefghijklmnopqrst")));
6356   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "1234567890", 0, S("bcdefghijklmnopqrst")));
6357   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "1234567890", 1, S("1bcdefghijklmnopqrst")));
6358   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "1234567890", 5, S("12345bcdefghijklmnopqrst")));
6359   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "1234567890", 9, S("123456789bcdefghijklmnopqrst")));
6360   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "1234567890", 10, S("1234567890bcdefghijklmnopqrst")));
6361   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345678901234567890", 0, S("bcdefghijklmnopqrst")));
6362   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345678901234567890", 1, S("1bcdefghijklmnopqrst")));
6363   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345678901234567890", 10, S("1234567890bcdefghijklmnopqrst")));
6364   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345678901234567890", 19, S("1234567890123456789bcdefghijklmnopqrst")));
6365   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 1, "12345678901234567890", 20, S("12345678901234567890bcdefghijklmnopqrst")));
6366   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "", 0, S("klmnopqrst")));
6367   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345", 0, S("klmnopqrst")));
6368   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345", 1, S("1klmnopqrst")));
6369   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345", 2, S("12klmnopqrst")));
6370   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345", 4, S("1234klmnopqrst")));
6371   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345", 5, S("12345klmnopqrst")));
6372   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "1234567890", 0, S("klmnopqrst")));
6373   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "1234567890", 1, S("1klmnopqrst")));
6374   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "1234567890", 5, S("12345klmnopqrst")));
6375   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "1234567890", 9, S("123456789klmnopqrst")));
6376   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "1234567890", 10, S("1234567890klmnopqrst")));
6377   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345678901234567890", 0, S("klmnopqrst")));
6378   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345678901234567890", 1, S("1klmnopqrst")));
6379   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345678901234567890", 10, S("1234567890klmnopqrst")));
6380   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345678901234567890", 19, S("1234567890123456789klmnopqrst")));
6381   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 10, "12345678901234567890", 20, S("12345678901234567890klmnopqrst")));
6382   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "", 0, S("t")));
6383   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345", 0, S("t")));
6384   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345", 1, S("1t")));
6385   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345", 2, S("12t")));
6386   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345", 4, S("1234t")));
6387   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345", 5, S("12345t")));
6388   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "1234567890", 0, S("t")));
6389   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "1234567890", 1, S("1t")));
6390   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "1234567890", 5, S("12345t")));
6391   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "1234567890", 9, S("123456789t")));
6392   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "1234567890", 10, S("1234567890t")));
6393   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345678901234567890", 0, S("t")));
6394   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345678901234567890", 1, S("1t")));
6395   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345678901234567890", 10, S("1234567890t")));
6396   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345678901234567890", 19, S("1234567890123456789t")));
6397   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 19, "12345678901234567890", 20, S("12345678901234567890t")));
6398   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "", 0, S("")));
6399   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345", 0, S("")));
6400   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345", 1, S("1")));
6401   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345", 2, S("12")));
6402   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345", 4, S("1234")));
6403   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345", 5, S("12345")));
6404   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "1234567890", 0, S("")));
6405   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "1234567890", 1, S("1")));
6406   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "1234567890", 5, S("12345")));
6407   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "1234567890", 9, S("123456789")));
6408   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "1234567890", 10, S("1234567890")));
6409   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345678901234567890", 0, S("")));
6410   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345678901234567890", 1, S("1")));
6411   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345678901234567890", 10, S("1234567890")));
6412   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345678901234567890", 19, S("1234567890123456789")));
6413   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 20, "12345678901234567890", 20, S("12345678901234567890")));
6414   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "", 0, S("")));
6415   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345", 0, S("")));
6416   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345", 1, S("1")));
6417   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345", 2, S("12")));
6418   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345", 4, S("1234")));
6419   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345", 5, S("12345")));
6420   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "1234567890", 0, S("")));
6421   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "1234567890", 1, S("1")));
6422   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "1234567890", 5, S("12345")));
6423   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "1234567890", 9, S("123456789")));
6424   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "1234567890", 10, S("1234567890")));
6425   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345678901234567890", 0, S("")));
6426   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345678901234567890", 1, S("1")));
6427   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345678901234567890", 10, S("1234567890")));
6428   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345678901234567890", 19, S("1234567890123456789")));
6429   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 0, 21, "12345678901234567890", 20, S("12345678901234567890")));
6430   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "", 0, S("abcdefghijklmnopqrst")));
6431   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345", 0, S("abcdefghijklmnopqrst")));
6432   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345", 1, S("a1bcdefghijklmnopqrst")));
6433   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345", 2, S("a12bcdefghijklmnopqrst")));
6434   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345", 4, S("a1234bcdefghijklmnopqrst")));
6435   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345", 5, S("a12345bcdefghijklmnopqrst")));
6436   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "1234567890", 0, S("abcdefghijklmnopqrst")));
6437   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "1234567890", 1, S("a1bcdefghijklmnopqrst")));
6438   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "1234567890", 5, S("a12345bcdefghijklmnopqrst")));
6439   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "1234567890", 9, S("a123456789bcdefghijklmnopqrst")));
6440   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "1234567890", 10, S("a1234567890bcdefghijklmnopqrst")));
6441   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
6442   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345678901234567890", 1, S("a1bcdefghijklmnopqrst")));
6443   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345678901234567890", 10, S("a1234567890bcdefghijklmnopqrst")));
6444   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345678901234567890", 19, S("a1234567890123456789bcdefghijklmnopqrst")));
6445   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 0, "12345678901234567890", 20, S("a12345678901234567890bcdefghijklmnopqrst")));
6446   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "", 0, S("acdefghijklmnopqrst")));
6447   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345", 0, S("acdefghijklmnopqrst")));
6448   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345", 1, S("a1cdefghijklmnopqrst")));
6449   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345", 2, S("a12cdefghijklmnopqrst")));
6450   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345", 4, S("a1234cdefghijklmnopqrst")));
6451   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345", 5, S("a12345cdefghijklmnopqrst")));
6452   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "1234567890", 0, S("acdefghijklmnopqrst")));
6453   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "1234567890", 1, S("a1cdefghijklmnopqrst")));
6454   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "1234567890", 5, S("a12345cdefghijklmnopqrst")));
6455   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "1234567890", 9, S("a123456789cdefghijklmnopqrst")));
6456   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "1234567890", 10, S("a1234567890cdefghijklmnopqrst")));
6457   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345678901234567890", 0, S("acdefghijklmnopqrst")));
6458   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345678901234567890", 1, S("a1cdefghijklmnopqrst")));
6459   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345678901234567890", 10, S("a1234567890cdefghijklmnopqrst")));
6460   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345678901234567890", 19, S("a1234567890123456789cdefghijklmnopqrst")));
6461   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 1, "12345678901234567890", 20, S("a12345678901234567890cdefghijklmnopqrst")));
6462   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "", 0, S("aklmnopqrst")));
6463   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345", 0, S("aklmnopqrst")));
6464   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345", 1, S("a1klmnopqrst")));
6465   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345", 2, S("a12klmnopqrst")));
6466   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345", 4, S("a1234klmnopqrst")));
6467   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345", 5, S("a12345klmnopqrst")));
6468   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "1234567890", 0, S("aklmnopqrst")));
6469   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "1234567890", 1, S("a1klmnopqrst")));
6470   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "1234567890", 5, S("a12345klmnopqrst")));
6471   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "1234567890", 9, S("a123456789klmnopqrst")));
6472   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "1234567890", 10, S("a1234567890klmnopqrst")));
6473   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345678901234567890", 0, S("aklmnopqrst")));
6474   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345678901234567890", 1, S("a1klmnopqrst")));
6475   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345678901234567890", 10, S("a1234567890klmnopqrst")));
6476   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345678901234567890", 19, S("a1234567890123456789klmnopqrst")));
6477   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 9, "12345678901234567890", 20, S("a12345678901234567890klmnopqrst")));
6478   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "", 0, S("at")));
6479   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345", 0, S("at")));
6480   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345", 1, S("a1t")));
6481   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345", 2, S("a12t")));
6482   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345", 4, S("a1234t")));
6483   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345", 5, S("a12345t")));
6484   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "1234567890", 0, S("at")));
6485   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "1234567890", 1, S("a1t")));
6486   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "1234567890", 5, S("a12345t")));
6487   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "1234567890", 9, S("a123456789t")));
6488   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "1234567890", 10, S("a1234567890t")));
6489   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345678901234567890", 0, S("at")));
6490   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345678901234567890", 1, S("a1t")));
6491   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345678901234567890", 10, S("a1234567890t")));
6492   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345678901234567890", 19, S("a1234567890123456789t")));
6493   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 18, "12345678901234567890", 20, S("a12345678901234567890t")));
6494   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "", 0, S("a")));
6495   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345", 0, S("a")));
6496   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345", 1, S("a1")));
6497   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345", 2, S("a12")));
6498   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345", 4, S("a1234")));
6499   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345", 5, S("a12345")));
6500   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "1234567890", 0, S("a")));
6501   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "1234567890", 1, S("a1")));
6502   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "1234567890", 5, S("a12345")));
6503   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "1234567890", 9, S("a123456789")));
6504   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "1234567890", 10, S("a1234567890")));
6505   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345678901234567890", 0, S("a")));
6506   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345678901234567890", 1, S("a1")));
6507   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345678901234567890", 10, S("a1234567890")));
6508   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345678901234567890", 19, S("a1234567890123456789")));
6509   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 19, "12345678901234567890", 20, S("a12345678901234567890")));
6510   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "", 0, S("a")));
6511   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345", 0, S("a")));
6512   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345", 1, S("a1")));
6513   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345", 2, S("a12")));
6514   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345", 4, S("a1234")));
6515   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345", 5, S("a12345")));
6516   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "1234567890", 0, S("a")));
6517   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "1234567890", 1, S("a1")));
6518   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "1234567890", 5, S("a12345")));
6519   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "1234567890", 9, S("a123456789")));
6520   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "1234567890", 10, S("a1234567890")));
6521   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345678901234567890", 0, S("a")));
6522   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345678901234567890", 1, S("a1")));
6523   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345678901234567890", 10, S("a1234567890")));
6524   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345678901234567890", 19, S("a1234567890123456789")));
6525   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 1, 20, "12345678901234567890", 20, S("a12345678901234567890")));
6526   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "", 0, S("abcdefghijklmnopqrst")));
6527   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345", 0, S("abcdefghijklmnopqrst")));
6528   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345", 1, S("abcdefghij1klmnopqrst")));
6529   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345", 2, S("abcdefghij12klmnopqrst")));
6530   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345", 4, S("abcdefghij1234klmnopqrst")));
6531   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345", 5, S("abcdefghij12345klmnopqrst")));
6532   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "1234567890", 0, S("abcdefghijklmnopqrst")));
6533   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "1234567890", 1, S("abcdefghij1klmnopqrst")));
6534   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "1234567890", 5, S("abcdefghij12345klmnopqrst")));
6535   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "1234567890", 9, S("abcdefghij123456789klmnopqrst")));
6536   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "1234567890", 10, S("abcdefghij1234567890klmnopqrst")));
6537   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
6538   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345678901234567890", 1, S("abcdefghij1klmnopqrst")));
6539   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345678901234567890", 10, S("abcdefghij1234567890klmnopqrst")));
6540   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345678901234567890", 19, S("abcdefghij1234567890123456789klmnopqrst")));
6541   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 0, "12345678901234567890", 20, S("abcdefghij12345678901234567890klmnopqrst")));
6542   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "", 0, S("abcdefghijlmnopqrst")));
6543   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345", 0, S("abcdefghijlmnopqrst")));
6544   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345", 1, S("abcdefghij1lmnopqrst")));
6545   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345", 2, S("abcdefghij12lmnopqrst")));
6546   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345", 4, S("abcdefghij1234lmnopqrst")));
6547   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345", 5, S("abcdefghij12345lmnopqrst")));
6548   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "1234567890", 0, S("abcdefghijlmnopqrst")));
6549   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "1234567890", 1, S("abcdefghij1lmnopqrst")));
6550   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "1234567890", 5, S("abcdefghij12345lmnopqrst")));
6551   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "1234567890", 9, S("abcdefghij123456789lmnopqrst")));
6552   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "1234567890", 10, S("abcdefghij1234567890lmnopqrst")));
6553   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345678901234567890", 0, S("abcdefghijlmnopqrst")));
6554   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345678901234567890", 1, S("abcdefghij1lmnopqrst")));
6555   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345678901234567890", 10, S("abcdefghij1234567890lmnopqrst")));
6556   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345678901234567890", 19, S("abcdefghij1234567890123456789lmnopqrst")));
6557   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 1, "12345678901234567890", 20, S("abcdefghij12345678901234567890lmnopqrst")));
6558   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "", 0, S("abcdefghijpqrst")));
6559   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345", 0, S("abcdefghijpqrst")));
6560   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345", 1, S("abcdefghij1pqrst")));
6561   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345", 2, S("abcdefghij12pqrst")));
6562   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345", 4, S("abcdefghij1234pqrst")));
6563   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345", 5, S("abcdefghij12345pqrst")));
6564   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "1234567890", 0, S("abcdefghijpqrst")));
6565   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "1234567890", 1, S("abcdefghij1pqrst")));
6566   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "1234567890", 5, S("abcdefghij12345pqrst")));
6567   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "1234567890", 9, S("abcdefghij123456789pqrst")));
6568   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "1234567890", 10, S("abcdefghij1234567890pqrst")));
6569   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345678901234567890", 0, S("abcdefghijpqrst")));
6570   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345678901234567890", 1, S("abcdefghij1pqrst")));
6571   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345678901234567890", 10, S("abcdefghij1234567890pqrst")));
6572   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345678901234567890", 19, S("abcdefghij1234567890123456789pqrst")));
6573   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 5, "12345678901234567890", 20, S("abcdefghij12345678901234567890pqrst")));
6574   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "", 0, S("abcdefghijt")));
6575   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345", 0, S("abcdefghijt")));
6576   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345", 1, S("abcdefghij1t")));
6577   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345", 2, S("abcdefghij12t")));
6578   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345", 4, S("abcdefghij1234t")));
6579   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345", 5, S("abcdefghij12345t")));
6580   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "1234567890", 0, S("abcdefghijt")));
6581   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "1234567890", 1, S("abcdefghij1t")));
6582   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "1234567890", 5, S("abcdefghij12345t")));
6583   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "1234567890", 9, S("abcdefghij123456789t")));
6584   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "1234567890", 10, S("abcdefghij1234567890t")));
6585   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345678901234567890", 0, S("abcdefghijt")));
6586   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345678901234567890", 1, S("abcdefghij1t")));
6587   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345678901234567890", 10, S("abcdefghij1234567890t")));
6588   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345678901234567890", 19, S("abcdefghij1234567890123456789t")));
6589   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 9, "12345678901234567890", 20, S("abcdefghij12345678901234567890t")));
6590   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "", 0, S("abcdefghij")));
6591   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345", 0, S("abcdefghij")));
6592   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345", 1, S("abcdefghij1")));
6593   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345", 2, S("abcdefghij12")));
6594   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345", 4, S("abcdefghij1234")));
6595   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345", 5, S("abcdefghij12345")));
6596   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "1234567890", 0, S("abcdefghij")));
6597   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "1234567890", 1, S("abcdefghij1")));
6598   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "1234567890", 5, S("abcdefghij12345")));
6599   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "1234567890", 9, S("abcdefghij123456789")));
6600   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "1234567890", 10, S("abcdefghij1234567890")));
6601   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345678901234567890", 0, S("abcdefghij")));
6602   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345678901234567890", 1, S("abcdefghij1")));
6603   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345678901234567890", 10, S("abcdefghij1234567890")));
6604   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345678901234567890", 19, S("abcdefghij1234567890123456789")));
6605   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 10, "12345678901234567890", 20, S("abcdefghij12345678901234567890")));
6606   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "", 0, S("abcdefghij")));
6607   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345", 0, S("abcdefghij")));
6608   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345", 1, S("abcdefghij1")));
6609   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345", 2, S("abcdefghij12")));
6610   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345", 4, S("abcdefghij1234")));
6611   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345", 5, S("abcdefghij12345")));
6612   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "1234567890", 0, S("abcdefghij")));
6613   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "1234567890", 1, S("abcdefghij1")));
6614   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "1234567890", 5, S("abcdefghij12345")));
6615   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "1234567890", 9, S("abcdefghij123456789")));
6616   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "1234567890", 10, S("abcdefghij1234567890")));
6617   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345678901234567890", 0, S("abcdefghij")));
6618   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345678901234567890", 1, S("abcdefghij1")));
6619   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345678901234567890", 10, S("abcdefghij1234567890")));
6620   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345678901234567890", 19, S("abcdefghij1234567890123456789")));
6621   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 10, 11, "12345678901234567890", 20, S("abcdefghij12345678901234567890")));
6622   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "", 0, S("abcdefghijklmnopqrst")));
6623   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345", 0, S("abcdefghijklmnopqrst")));
6624   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345", 1, S("abcdefghijklmnopqrs1t")));
6625   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345", 2, S("abcdefghijklmnopqrs12t")));
6626   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345", 4, S("abcdefghijklmnopqrs1234t")));
6627   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345", 5, S("abcdefghijklmnopqrs12345t")));
6628   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "1234567890", 0, S("abcdefghijklmnopqrst")));
6629   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "1234567890", 1, S("abcdefghijklmnopqrs1t")));
6630   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "1234567890", 5, S("abcdefghijklmnopqrs12345t")));
6631   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "1234567890", 9, S("abcdefghijklmnopqrs123456789t")));
6632   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "1234567890", 10, S("abcdefghijklmnopqrs1234567890t")));
6633   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
6634   BOOST_TEST(testR(S(""), 1, 0, "12345", 0, S("can't happen")));
6635   BOOST_TEST(testR(S(""), 1, 0, "12345", 1, S("can't happen")));
6636   BOOST_TEST(testR(S(""), 1, 0, "12345", 2, S("can't happen")));
6637   BOOST_TEST(testR(S(""), 1, 0, "12345", 4, S("can't happen")));
6638   BOOST_TEST(testR(S(""), 1, 0, "12345", 5, S("can't happen")));
6639   BOOST_TEST(testR(S(""), 1, 0, "1234567890", 0, S("can't happen")));
6640   BOOST_TEST(testR(S(""), 1, 0, "1234567890", 1, S("can't happen")));
6641   BOOST_TEST(testR(S(""), 1, 0, "1234567890", 5, S("can't happen")));
6642   BOOST_TEST(testR(S(""), 1, 0, "1234567890", 9, S("can't happen")));
6643   BOOST_TEST(testR(S(""), 1, 0, "1234567890", 10, S("can't happen")));
6644   BOOST_TEST(testR(S(""), 1, 0, "12345678901234567890", 0, S("can't happen")));
6645   BOOST_TEST(testR(S(""), 1, 0, "12345678901234567890", 1, S("can't happen")));
6646   BOOST_TEST(testR(S(""), 1, 0, "12345678901234567890", 10, S("can't happen")));
6647   BOOST_TEST(testR(S(""), 1, 0, "12345678901234567890", 19, S("can't happen")));
6648   BOOST_TEST(testR(S(""), 1, 0, "12345678901234567890", 20, S("can't happen")));
6649   BOOST_TEST(testR(S("abcde"), 6, 0, "", 0, S("can't happen")));
6650   BOOST_TEST(testR(S("abcde"), 6, 0, "12345", 0, S("can't happen")));
6651   BOOST_TEST(testR(S("abcde"), 6, 0, "12345", 1, S("can't happen")));
6652   BOOST_TEST(testR(S("abcde"), 6, 0, "12345", 2, S("can't happen")));
6653   BOOST_TEST(testR(S("abcde"), 6, 0, "12345", 4, S("can't happen")));
6654   BOOST_TEST(testR(S("abcde"), 6, 0, "12345", 5, S("can't happen")));
6655   BOOST_TEST(testR(S("abcde"), 6, 0, "1234567890", 0, S("can't happen")));
6656   BOOST_TEST(testR(S("abcde"), 6, 0, "1234567890", 1, S("can't happen")));
6657   BOOST_TEST(testR(S("abcde"), 6, 0, "1234567890", 5, S("can't happen")));
6658   BOOST_TEST(testR(S("abcde"), 6, 0, "1234567890", 9, S("can't happen")));
6659   BOOST_TEST(testR(S("abcde"), 6, 0, "1234567890", 10, S("can't happen")));
6660   BOOST_TEST(testR(S("abcde"), 6, 0, "12345678901234567890", 0, S("can't happen")));
6661   BOOST_TEST(testR(S("abcde"), 6, 0, "12345678901234567890", 1, S("can't happen")));
6662   BOOST_TEST(testR(S("abcde"), 6, 0, "12345678901234567890", 10, S("can't happen")));
6663   BOOST_TEST(testR(S("abcde"), 6, 0, "12345678901234567890", 19, S("can't happen")));
6664   BOOST_TEST(testR(S("abcde"), 6, 0, "12345678901234567890", 20, S("can't happen")));
6665   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "", 0, S("can't happen")));
6666   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345", 0, S("can't happen")));
6667   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345", 1, S("can't happen")));
6668   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345", 2, S("can't happen")));
6669   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345", 4, S("can't happen")));
6670   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345", 5, S("can't happen")));
6671   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "1234567890", 0, S("can't happen")));
6672   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "1234567890", 1, S("can't happen")));
6673   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "1234567890", 5, S("can't happen")));
6674   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "1234567890", 9, S("can't happen")));
6675   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "1234567890", 10, S("can't happen")));
6676   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345678901234567890", 0, S("can't happen")));
6677   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345678901234567890", 1, S("can't happen")));
6678   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345678901234567890", 10, S("can't happen")));
6679   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345678901234567890", 19, S("can't happen")));
6680   BOOST_TEST(testR(S("abcdefghij"), 11, 0, "12345678901234567890", 20, S("can't happen")));
6681   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "", 0, S("can't happen")));
6682   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345", 0, S("can't happen")));
6683   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345", 1, S("can't happen")));
6684   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345", 2, S("can't happen")));
6685   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345", 4, S("can't happen")));
6686   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345", 5, S("can't happen")));
6687   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "1234567890", 0, S("can't happen")));
6688   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "1234567890", 1, S("can't happen")));
6689   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "1234567890", 5, S("can't happen")));
6690   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "1234567890", 9, S("can't happen")));
6691   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "1234567890", 10, S("can't happen")));
6692   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345678901234567890", 0, S("can't happen")));
6693   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345678901234567890", 1, S("can't happen")));
6694   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345678901234567890", 10, S("can't happen")));
6695   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345678901234567890", 19, S("can't happen")));
6696   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 21, 0, "12345678901234567890", 20, S("can't happen")));
6697   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345678901234567890", 1, S("abcdefghijklmnopqrs1t")));
6698   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345678901234567890", 10, S("abcdefghijklmnopqrs1234567890t")));
6699   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345678901234567890", 19, S("abcdefghijklmnopqrs1234567890123456789t")));
6700   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 0, "12345678901234567890", 20, S("abcdefghijklmnopqrs12345678901234567890t")));
6701   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "", 0, S("abcdefghijklmnopqrs")));
6702   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345", 0, S("abcdefghijklmnopqrs")));
6703   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345", 1, S("abcdefghijklmnopqrs1")));
6704   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345", 2, S("abcdefghijklmnopqrs12")));
6705   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345", 4, S("abcdefghijklmnopqrs1234")));
6706   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345", 5, S("abcdefghijklmnopqrs12345")));
6707   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "1234567890", 0, S("abcdefghijklmnopqrs")));
6708   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "1234567890", 1, S("abcdefghijklmnopqrs1")));
6709   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "1234567890", 5, S("abcdefghijklmnopqrs12345")));
6710   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "1234567890", 9, S("abcdefghijklmnopqrs123456789")));
6711   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "1234567890", 10, S("abcdefghijklmnopqrs1234567890")));
6712   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345678901234567890", 0, S("abcdefghijklmnopqrs")));
6713   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345678901234567890", 1, S("abcdefghijklmnopqrs1")));
6714   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345678901234567890", 10, S("abcdefghijklmnopqrs1234567890")));
6715   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345678901234567890", 19, S("abcdefghijklmnopqrs1234567890123456789")));
6716   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 1, "12345678901234567890", 20, S("abcdefghijklmnopqrs12345678901234567890")));
6717   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "", 0, S("abcdefghijklmnopqrs")));
6718   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345", 0, S("abcdefghijklmnopqrs")));
6719   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345", 1, S("abcdefghijklmnopqrs1")));
6720   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345", 2, S("abcdefghijklmnopqrs12")));
6721   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345", 4, S("abcdefghijklmnopqrs1234")));
6722   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345", 5, S("abcdefghijklmnopqrs12345")));
6723   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "1234567890", 0, S("abcdefghijklmnopqrs")));
6724   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "1234567890", 1, S("abcdefghijklmnopqrs1")));
6725   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "1234567890", 5, S("abcdefghijklmnopqrs12345")));
6726   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "1234567890", 9, S("abcdefghijklmnopqrs123456789")));
6727   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "1234567890", 10, S("abcdefghijklmnopqrs1234567890")));
6728   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345678901234567890", 0, S("abcdefghijklmnopqrs")));
6729   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345678901234567890", 1, S("abcdefghijklmnopqrs1")));
6730   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345678901234567890", 10, S("abcdefghijklmnopqrs1234567890")));
6731   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345678901234567890", 19, S("abcdefghijklmnopqrs1234567890123456789")));
6732   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 19, 2, "12345678901234567890", 20, S("abcdefghijklmnopqrs12345678901234567890")));
6733   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "", 0, S("abcdefghijklmnopqrst")));
6734   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345", 0, S("abcdefghijklmnopqrst")));
6735   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345", 1, S("abcdefghijklmnopqrst1")));
6736   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345", 2, S("abcdefghijklmnopqrst12")));
6737   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345", 4, S("abcdefghijklmnopqrst1234")));
6738   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345", 5, S("abcdefghijklmnopqrst12345")));
6739   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "1234567890", 0, S("abcdefghijklmnopqrst")));
6740   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "1234567890", 1, S("abcdefghijklmnopqrst1")));
6741   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "1234567890", 5, S("abcdefghijklmnopqrst12345")));
6742   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "1234567890", 9, S("abcdefghijklmnopqrst123456789")));
6743   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "1234567890", 10, S("abcdefghijklmnopqrst1234567890")));
6744   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
6745   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345678901234567890", 1, S("abcdefghijklmnopqrst1")));
6746   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345678901234567890", 10, S("abcdefghijklmnopqrst1234567890")));
6747   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345678901234567890", 19, S("abcdefghijklmnopqrst1234567890123456789")));
6748   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 0, "12345678901234567890", 20, S("abcdefghijklmnopqrst12345678901234567890")));
6749   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "", 0, S("abcdefghijklmnopqrst")));
6750   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345", 0, S("abcdefghijklmnopqrst")));
6751   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345", 1, S("abcdefghijklmnopqrst1")));
6752   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345", 2, S("abcdefghijklmnopqrst12")));
6753   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345", 4, S("abcdefghijklmnopqrst1234")));
6754   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345", 5, S("abcdefghijklmnopqrst12345")));
6755   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "1234567890", 0, S("abcdefghijklmnopqrst")));
6756   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "1234567890", 1, S("abcdefghijklmnopqrst1")));
6757   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "1234567890", 5, S("abcdefghijklmnopqrst12345")));
6758   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "1234567890", 9, S("abcdefghijklmnopqrst123456789")));
6759   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "1234567890", 10, S("abcdefghijklmnopqrst1234567890")));
6760   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345678901234567890", 0, S("abcdefghijklmnopqrst")));
6761   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345678901234567890", 1, S("abcdefghijklmnopqrst1")));
6762   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345678901234567890", 10, S("abcdefghijklmnopqrst1234567890")));
6763   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345678901234567890", 19, S("abcdefghijklmnopqrst1234567890123456789")));
6764   BOOST_TEST(testR(S("abcdefghijklmnopqrst"), 20, 1, "12345678901234567890", 20, S("abcdefghijklmnopqrst12345678901234567890")));
6765 
6766   using T = static_string<10>;
6767   BOOST_TEST_THROWS(T("12345").replace(0, 1, 500, 'a'), std::length_error);
6768   BOOST_TEST_THROWS(T("12345").replace(0, 1, "aaaaaaaaaaaaaa"), std::length_error);
6769 
6770   // unchecked replacement throwing
6771   BOOST_TEST_THROWS(S("aaaaa").replace(10, 1, T("bbbbb")), std::out_of_range);
6772   BOOST_TEST_THROWS(T("aaaaa").replace(0, 1, S("bbbbbbbbbbbbb")), std::length_error);
6773 }
6774 
6775 // done
6776 void
testSubstr()6777 testSubstr()
6778 {
6779   using S = static_string<400>;
6780   BOOST_TEST(testS(S(""), 0, 0));
6781   BOOST_TEST(testS(S(""), 1, 0));
6782   BOOST_TEST(testS(S("pniot"), 0, 0));
6783   BOOST_TEST(testS(S("htaob"), 0, 1));
6784   BOOST_TEST(testS(S("fodgq"), 0, 2));
6785   BOOST_TEST(testS(S("hpqia"), 0, 4));
6786   BOOST_TEST(testS(S("qanej"), 0, 5));
6787   BOOST_TEST(testS(S("dfkap"), 1, 0));
6788   BOOST_TEST(testS(S("clbao"), 1, 1));
6789   BOOST_TEST(testS(S("ihqrf"), 1, 2));
6790   BOOST_TEST(testS(S("mekdn"), 1, 3));
6791   BOOST_TEST(testS(S("ngtjf"), 1, 4));
6792   BOOST_TEST(testS(S("srdfq"), 2, 0));
6793   BOOST_TEST(testS(S("qkdrs"), 2, 1));
6794   BOOST_TEST(testS(S("ikcrq"), 2, 2));
6795   BOOST_TEST(testS(S("cdaih"), 2, 3));
6796   BOOST_TEST(testS(S("dmajb"), 4, 0));
6797   BOOST_TEST(testS(S("karth"), 4, 1));
6798   BOOST_TEST(testS(S("lhcdo"), 5, 0));
6799   BOOST_TEST(testS(S("acbsj"), 6, 0));
6800   BOOST_TEST(testS(S("pbsjikaole"), 0, 0));
6801   BOOST_TEST(testS(S("pcbahntsje"), 0, 1));
6802   BOOST_TEST(testS(S("mprdjbeiak"), 0, 5));
6803   BOOST_TEST(testS(S("fhepcrntko"), 0, 9));
6804   BOOST_TEST(testS(S("eqmpaidtls"), 0, 10));
6805   BOOST_TEST(testS(S("joidhalcmq"), 1, 0));
6806   BOOST_TEST(testS(S("omigsphflj"), 1, 1));
6807   BOOST_TEST(testS(S("kocgbphfji"), 1, 4));
6808   BOOST_TEST(testS(S("onmjekafbi"), 1, 8));
6809   BOOST_TEST(testS(S("fbslrjiqkm"), 1, 9));
6810   BOOST_TEST(testS(S("oqmrjahnkg"), 5, 0));
6811   BOOST_TEST(testS(S("jeidpcmalh"), 5, 1));
6812   BOOST_TEST(testS(S("schfalibje"), 5, 2));
6813   BOOST_TEST(testS(S("crliponbqe"), 5, 4));
6814   BOOST_TEST(testS(S("igdscopqtm"), 5, 5));
6815   BOOST_TEST(testS(S("qngpdkimlc"), 9, 0));
6816   BOOST_TEST(testS(S("thdjgafrlb"), 9, 1));
6817   BOOST_TEST(testS(S("hcjitbfapl"), 10, 0));
6818   BOOST_TEST(testS(S("mgojkldsqh"), 11, 0));
6819   BOOST_TEST(testS(S("gfshlcmdjreqipbontak"), 0, 0));
6820   BOOST_TEST(testS(S("nadkhpfemgclosibtjrq"), 0, 1));
6821   BOOST_TEST(testS(S("nkodajteqplrbifhmcgs"), 0, 10));
6822   BOOST_TEST(testS(S("ofdrqmkeblthacpgijsn"), 0, 19));
6823   BOOST_TEST(testS(S("gbmetiprqdoasckjfhln"), 0, 20));
6824   BOOST_TEST(testS(S("bdfjqgatlksriohemnpc"), 1, 0));
6825   BOOST_TEST(testS(S("crnklpmegdqfiashtojb"), 1, 1));
6826   BOOST_TEST(testS(S("ejqcnahdrkfsmptilgbo"), 1, 9));
6827   BOOST_TEST(testS(S("jsbtafedocnirgpmkhql"), 1, 18));
6828   BOOST_TEST(testS(S("prqgnlbaejsmkhdctoif"), 1, 19));
6829   BOOST_TEST(testS(S("qnmodrtkebhpasifgcjl"), 10, 0));
6830   BOOST_TEST(testS(S("pejafmnokrqhtisbcdgl"), 10, 1));
6831   BOOST_TEST(testS(S("cpebqsfmnjdolhkratgi"), 10, 5));
6832   BOOST_TEST(testS(S("odnqkgijrhabfmcestlp"), 10, 9));
6833   BOOST_TEST(testS(S("lmofqdhpkibagnrcjste"), 10, 10));
6834   BOOST_TEST(testS(S("lgjqketopbfahrmnsicd"), 19, 0));
6835   BOOST_TEST(testS(S("ktsrmnqagdecfhijpobl"), 19, 1));
6836   BOOST_TEST(testS(S("lsaijeqhtrbgcdmpfkno"), 20, 0));
6837   BOOST_TEST(testS(S("dplqartnfgejichmoskb"), 21, 0));
6838   BOOST_TEST(testS(S(""), 0, 0));
6839   BOOST_TEST(testS(S(""), 1, 0));
6840   BOOST_TEST(testS(S("pniot"), 0, 0));
6841   BOOST_TEST(testS(S("htaob"), 0, 1));
6842   BOOST_TEST(testS(S("fodgq"), 0, 2));
6843   BOOST_TEST(testS(S("hpqia"), 0, 4));
6844   BOOST_TEST(testS(S("qanej"), 0, 5));
6845   BOOST_TEST(testS(S("dfkap"), 1, 0));
6846   BOOST_TEST(testS(S("clbao"), 1, 1));
6847   BOOST_TEST(testS(S("ihqrf"), 1, 2));
6848   BOOST_TEST(testS(S("mekdn"), 1, 3));
6849   BOOST_TEST(testS(S("ngtjf"), 1, 4));
6850   BOOST_TEST(testS(S("srdfq"), 2, 0));
6851   BOOST_TEST(testS(S("qkdrs"), 2, 1));
6852   BOOST_TEST(testS(S("ikcrq"), 2, 2));
6853   BOOST_TEST(testS(S("cdaih"), 2, 3));
6854   BOOST_TEST(testS(S("dmajb"), 4, 0));
6855   BOOST_TEST(testS(S("karth"), 4, 1));
6856   BOOST_TEST(testS(S("lhcdo"), 5, 0));
6857   BOOST_TEST(testS(S("acbsj"), 6, 0));
6858   BOOST_TEST(testS(S("pbsjikaole"), 0, 0));
6859   BOOST_TEST(testS(S("pcbahntsje"), 0, 1));
6860   BOOST_TEST(testS(S("mprdjbeiak"), 0, 5));
6861   BOOST_TEST(testS(S("fhepcrntko"), 0, 9));
6862   BOOST_TEST(testS(S("eqmpaidtls"), 0, 10));
6863   BOOST_TEST(testS(S("joidhalcmq"), 1, 0));
6864   BOOST_TEST(testS(S("omigsphflj"), 1, 1));
6865   BOOST_TEST(testS(S("kocgbphfji"), 1, 4));
6866   BOOST_TEST(testS(S("onmjekafbi"), 1, 8));
6867   BOOST_TEST(testS(S("fbslrjiqkm"), 1, 9));
6868   BOOST_TEST(testS(S("oqmrjahnkg"), 5, 0));
6869   BOOST_TEST(testS(S("jeidpcmalh"), 5, 1));
6870   BOOST_TEST(testS(S("schfalibje"), 5, 2));
6871   BOOST_TEST(testS(S("crliponbqe"), 5, 4));
6872   BOOST_TEST(testS(S("igdscopqtm"), 5, 5));
6873   BOOST_TEST(testS(S("qngpdkimlc"), 9, 0));
6874   BOOST_TEST(testS(S("thdjgafrlb"), 9, 1));
6875   BOOST_TEST(testS(S("hcjitbfapl"), 10, 0));
6876   BOOST_TEST(testS(S("mgojkldsqh"), 11, 0));
6877   BOOST_TEST(testS(S("gfshlcmdjreqipbontak"), 0, 0));
6878   BOOST_TEST(testS(S("nadkhpfemgclosibtjrq"), 0, 1));
6879   BOOST_TEST(testS(S("nkodajteqplrbifhmcgs"), 0, 10));
6880   BOOST_TEST(testS(S("ofdrqmkeblthacpgijsn"), 0, 19));
6881   BOOST_TEST(testS(S("gbmetiprqdoasckjfhln"), 0, 20));
6882   BOOST_TEST(testS(S("bdfjqgatlksriohemnpc"), 1, 0));
6883   BOOST_TEST(testS(S("crnklpmegdqfiashtojb"), 1, 1));
6884   BOOST_TEST(testS(S("ejqcnahdrkfsmptilgbo"), 1, 9));
6885   BOOST_TEST(testS(S("jsbtafedocnirgpmkhql"), 1, 18));
6886   BOOST_TEST(testS(S("prqgnlbaejsmkhdctoif"), 1, 19));
6887   BOOST_TEST(testS(S("qnmodrtkebhpasifgcjl"), 10, 0));
6888   BOOST_TEST(testS(S("pejafmnokrqhtisbcdgl"), 10, 1));
6889   BOOST_TEST(testS(S("cpebqsfmnjdolhkratgi"), 10, 5));
6890   BOOST_TEST(testS(S("odnqkgijrhabfmcestlp"), 10, 9));
6891   BOOST_TEST(testS(S("lmofqdhpkibagnrcjste"), 10, 10));
6892   BOOST_TEST(testS(S("lgjqketopbfahrmnsicd"), 19, 0));
6893   BOOST_TEST(testS(S("ktsrmnqagdecfhijpobl"), 19, 1));
6894   BOOST_TEST(testS(S("lsaijeqhtrbgcdmpfkno"), 20, 0));
6895   BOOST_TEST(testS(S("dplqartnfgejichmoskb"), 21, 0));
6896 }
6897 
6898 // done
6899 void
testSubview()6900 testSubview()
6901 {
6902   using S = static_string<400>;
6903   BOOST_TEST(testSV(S(""), 0, 0));
6904   BOOST_TEST(testSV(S(""), 1, 0));
6905   BOOST_TEST(testSV(S("pniot"), 0, 0));
6906   BOOST_TEST(testSV(S("htaob"), 0, 1));
6907   BOOST_TEST(testSV(S("fodgq"), 0, 2));
6908   BOOST_TEST(testSV(S("hpqia"), 0, 4));
6909   BOOST_TEST(testSV(S("qanej"), 0, 5));
6910   BOOST_TEST(testSV(S("dfkap"), 1, 0));
6911   BOOST_TEST(testSV(S("clbao"), 1, 1));
6912   BOOST_TEST(testSV(S("ihqrf"), 1, 2));
6913   BOOST_TEST(testSV(S("mekdn"), 1, 3));
6914   BOOST_TEST(testSV(S("ngtjf"), 1, 4));
6915   BOOST_TEST(testSV(S("srdfq"), 2, 0));
6916   BOOST_TEST(testSV(S("qkdrs"), 2, 1));
6917   BOOST_TEST(testSV(S("ikcrq"), 2, 2));
6918   BOOST_TEST(testSV(S("cdaih"), 2, 3));
6919   BOOST_TEST(testSV(S("dmajb"), 4, 0));
6920   BOOST_TEST(testSV(S("karth"), 4, 1));
6921   BOOST_TEST(testSV(S("lhcdo"), 5, 0));
6922   BOOST_TEST(testSV(S("acbsj"), 6, 0));
6923   BOOST_TEST(testSV(S("pbsjikaole"), 0, 0));
6924   BOOST_TEST(testSV(S("pcbahntsje"), 0, 1));
6925   BOOST_TEST(testSV(S("mprdjbeiak"), 0, 5));
6926   BOOST_TEST(testSV(S("fhepcrntko"), 0, 9));
6927   BOOST_TEST(testSV(S("eqmpaidtls"), 0, 10));
6928   BOOST_TEST(testSV(S("joidhalcmq"), 1, 0));
6929   BOOST_TEST(testSV(S("omigsphflj"), 1, 1));
6930   BOOST_TEST(testSV(S("kocgbphfji"), 1, 4));
6931   BOOST_TEST(testSV(S("onmjekafbi"), 1, 8));
6932   BOOST_TEST(testSV(S("fbslrjiqkm"), 1, 9));
6933   BOOST_TEST(testSV(S("oqmrjahnkg"), 5, 0));
6934   BOOST_TEST(testSV(S("jeidpcmalh"), 5, 1));
6935   BOOST_TEST(testSV(S("schfalibje"), 5, 2));
6936   BOOST_TEST(testSV(S("crliponbqe"), 5, 4));
6937   BOOST_TEST(testSV(S("igdscopqtm"), 5, 5));
6938   BOOST_TEST(testSV(S("qngpdkimlc"), 9, 0));
6939   BOOST_TEST(testSV(S("thdjgafrlb"), 9, 1));
6940   BOOST_TEST(testSV(S("hcjitbfapl"), 10, 0));
6941   BOOST_TEST(testSV(S("mgojkldsqh"), 11, 0));
6942   BOOST_TEST(testSV(S("gfshlcmdjreqipbontak"), 0, 0));
6943   BOOST_TEST(testSV(S("nadkhpfemgclosibtjrq"), 0, 1));
6944   BOOST_TEST(testSV(S("nkodajteqplrbifhmcgs"), 0, 10));
6945   BOOST_TEST(testSV(S("ofdrqmkeblthacpgijsn"), 0, 19));
6946   BOOST_TEST(testSV(S("gbmetiprqdoasckjfhln"), 0, 20));
6947   BOOST_TEST(testSV(S("bdfjqgatlksriohemnpc"), 1, 0));
6948   BOOST_TEST(testSV(S("crnklpmegdqfiashtojb"), 1, 1));
6949   BOOST_TEST(testSV(S("ejqcnahdrkfsmptilgbo"), 1, 9));
6950   BOOST_TEST(testSV(S("jsbtafedocnirgpmkhql"), 1, 18));
6951   BOOST_TEST(testSV(S("prqgnlbaejsmkhdctoif"), 1, 19));
6952   BOOST_TEST(testSV(S("qnmodrtkebhpasifgcjl"), 10, 0));
6953   BOOST_TEST(testSV(S("pejafmnokrqhtisbcdgl"), 10, 1));
6954   BOOST_TEST(testSV(S("cpebqsfmnjdolhkratgi"), 10, 5));
6955   BOOST_TEST(testSV(S("odnqkgijrhabfmcestlp"), 10, 9));
6956   BOOST_TEST(testSV(S("lmofqdhpkibagnrcjste"), 10, 10));
6957   BOOST_TEST(testSV(S("lgjqketopbfahrmnsicd"), 19, 0));
6958   BOOST_TEST(testSV(S("ktsrmnqagdecfhijpobl"), 19, 1));
6959   BOOST_TEST(testSV(S("lsaijeqhtrbgcdmpfkno"), 20, 0));
6960   BOOST_TEST(testSV(S("dplqartnfgejichmoskb"), 21, 0));
6961   BOOST_TEST(testSV(S(""), 0, 0));
6962   BOOST_TEST(testSV(S(""), 1, 0));
6963   BOOST_TEST(testSV(S("pniot"), 0, 0));
6964   BOOST_TEST(testSV(S("htaob"), 0, 1));
6965   BOOST_TEST(testSV(S("fodgq"), 0, 2));
6966   BOOST_TEST(testSV(S("hpqia"), 0, 4));
6967   BOOST_TEST(testSV(S("qanej"), 0, 5));
6968   BOOST_TEST(testSV(S("dfkap"), 1, 0));
6969   BOOST_TEST(testSV(S("clbao"), 1, 1));
6970   BOOST_TEST(testSV(S("ihqrf"), 1, 2));
6971   BOOST_TEST(testSV(S("mekdn"), 1, 3));
6972   BOOST_TEST(testSV(S("ngtjf"), 1, 4));
6973   BOOST_TEST(testSV(S("srdfq"), 2, 0));
6974   BOOST_TEST(testSV(S("qkdrs"), 2, 1));
6975   BOOST_TEST(testSV(S("ikcrq"), 2, 2));
6976   BOOST_TEST(testSV(S("cdaih"), 2, 3));
6977   BOOST_TEST(testSV(S("dmajb"), 4, 0));
6978   BOOST_TEST(testSV(S("karth"), 4, 1));
6979   BOOST_TEST(testSV(S("lhcdo"), 5, 0));
6980   BOOST_TEST(testSV(S("acbsj"), 6, 0));
6981   BOOST_TEST(testSV(S("pbsjikaole"), 0, 0));
6982   BOOST_TEST(testSV(S("pcbahntsje"), 0, 1));
6983   BOOST_TEST(testSV(S("mprdjbeiak"), 0, 5));
6984   BOOST_TEST(testSV(S("fhepcrntko"), 0, 9));
6985   BOOST_TEST(testSV(S("eqmpaidtls"), 0, 10));
6986   BOOST_TEST(testSV(S("joidhalcmq"), 1, 0));
6987   BOOST_TEST(testSV(S("omigsphflj"), 1, 1));
6988   BOOST_TEST(testSV(S("kocgbphfji"), 1, 4));
6989   BOOST_TEST(testSV(S("onmjekafbi"), 1, 8));
6990   BOOST_TEST(testSV(S("fbslrjiqkm"), 1, 9));
6991   BOOST_TEST(testSV(S("oqmrjahnkg"), 5, 0));
6992   BOOST_TEST(testSV(S("jeidpcmalh"), 5, 1));
6993   BOOST_TEST(testSV(S("schfalibje"), 5, 2));
6994   BOOST_TEST(testSV(S("crliponbqe"), 5, 4));
6995   BOOST_TEST(testSV(S("igdscopqtm"), 5, 5));
6996   BOOST_TEST(testSV(S("qngpdkimlc"), 9, 0));
6997   BOOST_TEST(testSV(S("thdjgafrlb"), 9, 1));
6998   BOOST_TEST(testSV(S("hcjitbfapl"), 10, 0));
6999   BOOST_TEST(testSV(S("mgojkldsqh"), 11, 0));
7000   BOOST_TEST(testSV(S("gfshlcmdjreqipbontak"), 0, 0));
7001   BOOST_TEST(testSV(S("nadkhpfemgclosibtjrq"), 0, 1));
7002   BOOST_TEST(testSV(S("nkodajteqplrbifhmcgs"), 0, 10));
7003   BOOST_TEST(testSV(S("ofdrqmkeblthacpgijsn"), 0, 19));
7004   BOOST_TEST(testSV(S("gbmetiprqdoasckjfhln"), 0, 20));
7005   BOOST_TEST(testSV(S("bdfjqgatlksriohemnpc"), 1, 0));
7006   BOOST_TEST(testSV(S("crnklpmegdqfiashtojb"), 1, 1));
7007   BOOST_TEST(testSV(S("ejqcnahdrkfsmptilgbo"), 1, 9));
7008   BOOST_TEST(testSV(S("jsbtafedocnirgpmkhql"), 1, 18));
7009   BOOST_TEST(testSV(S("prqgnlbaejsmkhdctoif"), 1, 19));
7010   BOOST_TEST(testSV(S("qnmodrtkebhpasifgcjl"), 10, 0));
7011   BOOST_TEST(testSV(S("pejafmnokrqhtisbcdgl"), 10, 1));
7012   BOOST_TEST(testSV(S("cpebqsfmnjdolhkratgi"), 10, 5));
7013   BOOST_TEST(testSV(S("odnqkgijrhabfmcestlp"), 10, 9));
7014   BOOST_TEST(testSV(S("lmofqdhpkibagnrcjste"), 10, 10));
7015   BOOST_TEST(testSV(S("lgjqketopbfahrmnsicd"), 19, 0));
7016   BOOST_TEST(testSV(S("ktsrmnqagdecfhijpobl"), 19, 1));
7017   BOOST_TEST(testSV(S("lsaijeqhtrbgcdmpfkno"), 20, 0));
7018   BOOST_TEST(testSV(S("dplqartnfgejichmoskb"), 21, 0));
7019 }
7020 
7021 // done
7022 void
testStartsEnds()7023 testStartsEnds()
7024 {
7025   using S = static_string<400>;
7026   BOOST_TEST(S("1234567890").starts_with('1'));
7027   BOOST_TEST(S("1234567890").starts_with("123"));
7028   BOOST_TEST(S("1234567890").starts_with("1234567890"));
7029   BOOST_TEST(!S("1234567890").starts_with("234"));
7030   BOOST_TEST(!S("1234567890").starts_with("12345678900"));
7031   BOOST_TEST(S("1234567890").starts_with(string_view("1234567890")));
7032 
7033   BOOST_TEST(S("1234567890").ends_with('0'));
7034   BOOST_TEST(S("1234567890").ends_with("890"));
7035   BOOST_TEST(S("1234567890").ends_with("1234567890"));
7036   BOOST_TEST(!S("1234567890").ends_with("234"));
7037   BOOST_TEST(!S("1234567890").ends_with("12345678900"));
7038   BOOST_TEST(S("1234567890").ends_with(string_view("1234567890")));
7039 
7040   BOOST_TEST(!S().starts_with('0'));
7041   BOOST_TEST(!S().starts_with("0"));
7042   BOOST_TEST(!S().starts_with(string_view("0")));
7043   BOOST_TEST(!S().ends_with('0'));
7044   BOOST_TEST(!S().ends_with("0"));
7045   BOOST_TEST(!S().ends_with(string_view("0")));
7046 }
7047 
7048 void
testHash()7049 testHash()
7050 {
7051   using U = static_string<30>;
7052   std::hash<U> hasher;
7053   BOOST_TEST(hasher(U("1")) != hasher(U("123456789")));
7054   BOOST_TEST(hasher(U("1234567890")) == hasher(U("1234567890")));
7055 }
7056 
7057 void
testEmpty()7058 testEmpty()
7059 {
7060   static_string<0> a;
7061   BOOST_TEST(a.size() == 0);
7062   BOOST_TEST(a.data() != nullptr);
7063   BOOST_TEST(a.capacity() == 0);
7064 }
7065 
7066 void
testResize()7067 testResize()
7068 {
7069   static_string<10> a = "a";
7070   a.resize(a.size() + 1);
7071   BOOST_TEST(a.size() == 2);
7072 
7073   static_string<10> b = "a";
7074   b.resize(b.size() + 1, 'a');
7075   BOOST_TEST(b == "aa");
7076   BOOST_TEST(b.size() == 2);
7077 }
7078 
7079 void
testStream()7080 testStream()
7081 {
7082   std::stringstream a;
7083   static_string<10> b = "abcdefghij";
7084   a << b;
7085   static_string<10> c(std::istream_iterator<char>{a}, std::istream_iterator<char>{});
7086   BOOST_TEST(a.str() == b.subview());
7087   BOOST_TEST(b == c);
7088 }
7089 
7090 void
testOperatorPlus()7091 testOperatorPlus()
7092 {
7093   static_string<10> s1 = "hello";
7094   static_string<10> s2 = "world";
7095 
7096   // operator+(static_string, static_string)
7097   {
7098     auto res = s1 + s2;
7099     BOOST_TEST(res == "helloworld");
7100     BOOST_TEST(res.capacity() == 20);
7101     BOOST_TEST(res.size() == 10);
7102   }
7103 
7104   // operator+(static_string, CharT)
7105   {
7106     auto res = s1 + '!';
7107     BOOST_TEST(res == "hello!");
7108     BOOST_TEST(res.capacity() == 11);
7109     BOOST_TEST(res.size() == 6);
7110   }
7111 
7112   // operator+(CharT, static_string)
7113   {
7114     auto res = '!' + s1;
7115     BOOST_TEST(res == "!hello");
7116     BOOST_TEST(res.capacity() == 11);
7117     BOOST_TEST(res.size() == 6);
7118   }
7119 
7120   // operator+(static_string, CharT(&)[N])
7121   {
7122     auto res = s1 + "world";
7123     BOOST_TEST(res == "helloworld");
7124     BOOST_TEST(res.capacity() == 16);
7125     BOOST_TEST(res.size() == 10);
7126   }
7127 
7128   // operator+(CharT(&)[N], static_string)
7129   {
7130     auto res = "hello" + s2;
7131     BOOST_TEST(res == "helloworld");
7132     BOOST_TEST(res.capacity() == 16);
7133     BOOST_TEST(res.size() == 10);
7134   }
7135 
7136   // operator+(static_string, CharT(&)[N]), no null
7137   {
7138     char arr[10] = {'w', 'o', 'r', 'l', 'd'};
7139     auto res = s1 + arr;
7140     BOOST_TEST(res == "helloworld");
7141     BOOST_TEST(res.capacity() == 20);
7142     BOOST_TEST(res.size() == 10);
7143   }
7144 
7145   // operator+(CharT(&)[N], static_string), no null
7146   {
7147     char arr[10] = {'h', 'e', 'l', 'l', 'o'};
7148     auto res = arr + s2;
7149     BOOST_TEST(res == "helloworld");
7150     BOOST_TEST(res.capacity() == 20);
7151     BOOST_TEST(res.size() == 10);
7152   }
7153 }
7154 
7155 int
runTests()7156 runTests()
7157 {
7158   constexpr auto cxper = testConstantEvaluation();
7159   static_cast<void>(cxper);
7160 
7161   testConstruct();
7162 
7163   testAssignment();
7164 
7165   testElements();
7166 
7167   testIterators();
7168 
7169   testCapacity();
7170 
7171   testClear();
7172   testInsert();
7173   testErase();
7174   testPushBack();
7175   testPopBack();
7176   testAppend();
7177   testPlusEquals();
7178 
7179   testCompare();
7180   testSwap();
7181   testGeneral();
7182   testToStaticString();
7183   testResize();
7184 
7185   testFind();
7186 
7187   testReplace();
7188   testSubstr();
7189   testStartsEnds();
7190 
7191   testHash();
7192   testEmpty();
7193   testStream();
7194   testOperatorPlus();
7195 
7196   return report_errors();
7197 }
7198 } // static_string
7199 } // boost
7200 
7201 int
main()7202 main()
7203 {
7204   return boost::static_strings::runTests();
7205 }