1 //===----------------------------------------------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // <string>
11
12 // basic_string(const basic_string<charT,traits,Allocator>& str,
13 // size_type pos, size_type n,
14 // const Allocator& a = Allocator());
15 //
16 // basic_string(const basic_string<charT,traits,Allocator>& str,
17 // size_type pos,
18 // const Allocator& a = Allocator());
19
20 #include <string>
21 #include <stdexcept>
22 #include <algorithm>
23 #include <vector>
24 #include <scoped_allocator>
25 #include <cassert>
26
27 #include "test_macros.h"
28 #include "test_allocator.h"
29 #include "min_allocator.h"
30
31 template <class S>
32 void
test(S str,unsigned pos)33 test(S str, unsigned pos)
34 {
35 typedef typename S::traits_type T;
36 typedef typename S::allocator_type A;
37
38 if (pos <= str.size())
39 {
40 S s2(str, pos);
41 LIBCPP_ASSERT(s2.__invariants());
42 typename S::size_type rlen = str.size() - pos;
43 assert(s2.size() == rlen);
44 assert(T::compare(s2.data(), str.data() + pos, rlen) == 0);
45 assert(s2.get_allocator() == A());
46 assert(s2.capacity() >= s2.size());
47 }
48 #ifndef TEST_HAS_NO_EXCEPTIONS
49 else
50 {
51 try
52 {
53 S s2(str, pos);
54 assert(false);
55 }
56 catch (std::out_of_range&)
57 {
58 assert(pos > str.size());
59 }
60 }
61 #endif
62 }
63
64 template <class S>
65 void
test(S str,unsigned pos,unsigned n)66 test(S str, unsigned pos, unsigned n)
67 {
68 typedef typename S::traits_type T;
69 typedef typename S::allocator_type A;
70 if (pos <= str.size())
71 {
72 S s2(str, pos, n);
73 LIBCPP_ASSERT(s2.__invariants());
74 typename S::size_type rlen = std::min<typename S::size_type>(str.size() - pos, n);
75 assert(s2.size() == rlen);
76 assert(T::compare(s2.data(), str.data() + pos, rlen) == 0);
77 assert(s2.get_allocator() == A());
78 assert(s2.capacity() >= s2.size());
79 }
80 #ifndef TEST_HAS_NO_EXCEPTIONS
81 else
82 {
83 try
84 {
85 S s2(str, pos, n);
86 assert(false);
87 }
88 catch (std::out_of_range&)
89 {
90 assert(pos > str.size());
91 }
92 }
93 #endif
94 }
95
96 template <class S>
97 void
test(S str,unsigned pos,unsigned n,const typename S::allocator_type & a)98 test(S str, unsigned pos, unsigned n, const typename S::allocator_type& a)
99 {
100 typedef typename S::traits_type T;
101
102 if (pos <= str.size())
103 {
104 S s2(str, pos, n, a);
105 LIBCPP_ASSERT(s2.__invariants());
106 typename S::size_type rlen = std::min<typename S::size_type>(str.size() - pos, n);
107 assert(s2.size() == rlen);
108 assert(T::compare(s2.data(), str.data() + pos, rlen) == 0);
109 assert(s2.get_allocator() == a);
110 assert(s2.capacity() >= s2.size());
111 }
112 #ifndef TEST_HAS_NO_EXCEPTIONS
113 else
114 {
115 try
116 {
117 S s2(str, pos, n, a);
118 assert(false);
119 }
120 catch (std::out_of_range&)
121 {
122 assert(pos > str.size());
123 }
124 }
125 #endif
126 }
127
128 #if TEST_STD_VER >= 11
129 #ifndef TEST_HAS_NO_EXCEPTIONS
test2583()130 void test2583()
131 { // LWG #2583
132 typedef std::basic_string<char, std::char_traits<char>, test_allocator<char> > StringA;
133 std::vector<StringA, std::scoped_allocator_adaptor<test_allocator<StringA>>> vs;
134 StringA s{"1234"};
135 vs.emplace_back(s, 2);
136
137 try { vs.emplace_back(s, 5); }
138 catch (const std::out_of_range&) { return; }
139 assert(false);
140 }
141 #endif
142 #endif
143
main()144 int main()
145 {
146 {
147 typedef test_allocator<char> A;
148 typedef std::basic_string<char, std::char_traits<char>, A> S;
149
150 test(S(A(3)), 0);
151 test(S(A(3)), 1);
152 test(S("1", A(5)), 0);
153 test(S("1", A(5)), 1);
154 test(S("1", A(5)), 2);
155 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 0);
156 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 5);
157 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50);
158 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 500);
159
160 test(S(A(3)), 0, 0);
161 test(S(A(3)), 0, 1);
162 test(S(A(3)), 1, 0);
163 test(S(A(3)), 1, 1);
164 test(S(A(3)), 1, 2);
165 test(S("1", A(5)), 0, 0);
166 test(S("1", A(5)), 0, 1);
167 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 0);
168 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 1);
169 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 10);
170 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 100);
171
172 test(S(A(3)), 0, 0, A(4));
173 test(S(A(3)), 0, 1, A(4));
174 test(S(A(3)), 1, 0, A(4));
175 test(S(A(3)), 1, 1, A(4));
176 test(S(A(3)), 1, 2, A(4));
177 test(S("1", A(5)), 0, 0, A(6));
178 test(S("1", A(5)), 0, 1, A(6));
179 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 0, A(8));
180 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 1, A(8));
181 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 10, A(8));
182 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A(7)), 50, 100, A(8));
183 }
184 #if TEST_STD_VER >= 11
185 {
186 typedef min_allocator<char> A;
187 typedef std::basic_string<char, std::char_traits<char>, A> S;
188
189 test(S(A()), 0);
190 test(S(A()), 1);
191 test(S("1", A()), 0);
192 test(S("1", A()), 1);
193 test(S("1", A()), 2);
194 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 0);
195 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 5);
196 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50);
197 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 500);
198
199 test(S(A()), 0, 0);
200 test(S(A()), 0, 1);
201 test(S(A()), 1, 0);
202 test(S(A()), 1, 1);
203 test(S(A()), 1, 2);
204 test(S("1", A()), 0, 0);
205 test(S("1", A()), 0, 1);
206 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 0);
207 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 1);
208 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 10);
209 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 100);
210
211 test(S(A()), 0, 0, A());
212 test(S(A()), 0, 1, A());
213 test(S(A()), 1, 0, A());
214 test(S(A()), 1, 1, A());
215 test(S(A()), 1, 2, A());
216 test(S("1", A()), 0, 0, A());
217 test(S("1", A()), 0, 1, A());
218 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 0, A());
219 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 1, A());
220 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 10, A());
221 test(S("1234567890123456789012345678901234567890123456789012345678901234567890", A()), 50, 100, A());
222 }
223
224 #ifndef TEST_HAS_NO_EXCEPTIONS
225 test2583();
226 #endif
227 #endif
228 }
229