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