2013-08-01 François Dumont <fdumont@gcc.gnu.org>
[official-gcc.git] / libstdc++-v3 / testsuite / util / debug / checks.h
blob01c5beb5cd4be1a831d4094068fdba9b9e0201c0
1 // Copyright (C) 2010-2013 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8 //
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
19 #include <vector>
20 #include <deque>
21 #include <list>
22 #ifndef _GLIBCXX_DEBUG
23 # include <debug/vector>
24 # include <debug/deque>
25 # include <debug/list>
26 #endif
27 #include <testsuite_hooks.h>
29 namespace __gnu_test
31 template<typename _Tp>
32 struct CopyableValueType
34 typedef _Tp value_type;
37 template<typename _Tp1, typename _Tp2>
38 struct CopyableValueType<std::pair<const _Tp1, _Tp2> >
40 typedef std::pair<_Tp1, _Tp2> value_type;
43 template<typename _Tp>
44 struct generate_unique
46 typedef _Tp value_type;
48 value_type build()
50 static value_type _S_;
51 ++_S_;
52 return _S_;
56 template<typename _Tp1, typename _Tp2>
57 struct generate_unique<std::pair<_Tp1, _Tp2> >
59 typedef _Tp1 first_type;
60 typedef _Tp2 second_type;
61 typedef std::pair<_Tp1, _Tp2> pair_type;
63 pair_type build()
65 static first_type _S_1;
66 static second_type _S_2;
67 ++_S_1;
68 ++_S_2;
69 return pair_type(_S_1, _S_2);
73 // Check that invalid range of pointers is detected
74 template<typename _Tp>
75 void
76 check_assign1()
78 bool test __attribute__((unused)) = true;
80 typedef _Tp cont_type;
81 typedef typename cont_type::value_type cont_val_type;
82 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
83 typedef std::vector<val_type> vector_type;
85 generate_unique<val_type> gu;
87 vector_type v;
88 for (int i = 0; i != 5; ++i)
89 v.push_back(gu.build());
90 VERIFY(v.size() == 5);
92 const val_type* first = &v.front() + 1;
93 const val_type* last = first + 2;
95 cont_type c1;
96 c1.assign(first, last);
97 VERIFY(c1.size() == 2);
99 cont_type c2;
100 c2.assign(last, first); // Expected failure
103 // Check that invalid range of debug random iterators is detected
104 template<typename _Tp>
105 void
106 check_assign2()
108 bool test __attribute__((unused)) = true;
110 typedef _Tp cont_type;
111 typedef typename cont_type::value_type cont_val_type;
112 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
113 typedef std::vector<val_type> vector_type;
115 generate_unique<val_type> gu;
117 vector_type v;
118 for (int i = 0; i != 5; ++i)
119 v.push_back(gu.build());
120 VERIFY(v.size() == 5);
122 typename vector_type::iterator first = v.begin() + 1;
123 typename vector_type::iterator last = first + 2;
124 cont_type c1;
125 c1.assign(first, last);
126 VERIFY(c1.size() == 2);
128 cont_type c2;
129 c2.assign(last, first); // Expected failure
132 // Check that invalid range of debug not random iterators is detected
133 template<typename _Tp>
134 void
135 check_assign3()
137 bool test __attribute__((unused)) = true;
139 typedef _Tp cont_type;
140 typedef typename cont_type::value_type cont_val_type;
141 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
142 typedef std::list<val_type> list_type;
144 generate_unique<val_type> gu;
146 list_type l;
147 for (int i = 0; i != 5; ++i)
148 l.push_back(gu.build());
149 VERIFY(l.size() == 5);
151 typename list_type::iterator first = l.begin(); ++first;
152 typename list_type::iterator last = first; ++last; ++last;
153 cont_type c1;
154 c1.assign(first, last);
155 VERIFY(c1.size() == 2);
157 cont_type c2;
158 c2.assign(last, first); // Expected failure
161 // Check that invalid range of pointers is detected
162 template<typename _Tp>
163 void
164 check_construct1()
166 bool test __attribute__((unused)) = true;
168 typedef _Tp cont_type;
169 typedef typename cont_type::value_type cont_val_type;
170 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
171 typedef std::vector<val_type> vector_type;
173 generate_unique<val_type> gu;
175 vector_type v;
176 for (int i = 0; i != 5; ++i)
177 v.push_back(gu.build());
178 VERIFY(v.size() == 5);
180 val_type *first = &v.front() + 1;
181 val_type *last = first + 2;
182 cont_type c1(first, last);
183 VERIFY(c1.size() == 2);
185 cont_type c2(last, first); // Expected failure
188 // Check that invalid range of debug random iterators is detected
189 template<typename _Tp>
190 void
191 check_construct2()
193 bool test __attribute__((unused)) = true;
195 typedef _Tp cont_type;
196 typedef typename cont_type::value_type cont_val_type;
197 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
198 typedef std::vector<val_type> vector_type;
200 generate_unique<val_type> gu;
202 vector_type v;
203 for (int i = 0; i != 5; ++i)
204 v.push_back(gu.build());
205 VERIFY(v.size() == 5);
207 typename vector_type::iterator first = v.begin() + 1;
208 typename vector_type::iterator last = first + 2;
209 cont_type c1(first, last);
210 VERIFY(c1.size() == 2);
212 cont_type c2(last, first); // Expected failure
215 // Check that invalid range of debug not random iterators is detected
216 template<typename _Tp>
217 void
218 check_construct3()
220 bool test __attribute__((unused)) = true;
222 typedef _Tp cont_type;
223 typedef typename cont_type::value_type cont_val_type;
224 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
225 typedef std::list<val_type> list_type;
227 generate_unique<val_type> gu;
229 list_type l;
230 for (int i = 0; i != 5; ++i)
231 l.push_back(gu.build());
232 VERIFY(l.size() == 5);
234 typename list_type::iterator first = l.begin(); ++first;
235 typename list_type::iterator last = first; ++last; ++last;
236 cont_type c1(first, last);
237 VERIFY(c1.size() == 2);
239 cont_type c2(last, first); // Expected failure
242 template <typename _Cont>
243 struct InsertRangeHelper
245 template <typename _It>
246 static void
247 Insert(_Cont& cont, _It first, _It last)
248 { cont.insert(first, last); }
251 template <typename _Cont>
252 struct InsertRangeHelperAux
254 template <typename _It>
255 static void
256 Insert(_Cont& cont, _It first, _It last)
257 { cont.insert(cont.begin(), first, last); }
260 template <typename _Tp1, typename _Tp2>
261 struct InsertRangeHelper<std::vector<_Tp1, _Tp2> >
262 : InsertRangeHelperAux<std::vector<_Tp1, _Tp2> >
263 { };
265 template <typename _Tp1, typename _Tp2>
266 struct InsertRangeHelper<std::deque<_Tp1, _Tp2> >
267 : InsertRangeHelperAux<std::deque<_Tp1, _Tp2> >
268 { };
270 template <typename _Tp1, typename _Tp2>
271 struct InsertRangeHelper<std::list<_Tp1, _Tp2> >
272 : InsertRangeHelperAux<std::list<_Tp1, _Tp2> >
273 { };
275 #ifndef _GLIBCXX_DEBUG
276 template <typename _Tp1, typename _Tp2>
277 struct InsertRangeHelper<__gnu_debug::vector<_Tp1, _Tp2> >
278 : InsertRangeHelperAux<__gnu_debug::vector<_Tp1, _Tp2> >
279 { };
281 template <typename _Tp1, typename _Tp2>
282 struct InsertRangeHelper<__gnu_debug::deque<_Tp1, _Tp2> >
283 : InsertRangeHelperAux<__gnu_debug::deque<_Tp1, _Tp2> >
284 { };
286 template <typename _Tp1, typename _Tp2>
287 struct InsertRangeHelper<__gnu_debug::list<_Tp1, _Tp2> >
288 : InsertRangeHelperAux<__gnu_debug::list<_Tp1, _Tp2> >
289 { };
290 #endif
292 template<typename _Tp>
293 void
294 check_insert1()
296 bool test __attribute__((unused)) = true;
298 typedef _Tp cont_type;
299 typedef typename cont_type::value_type cont_val_type;
300 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
301 typedef std::vector<val_type> vector_type;
303 generate_unique<val_type> gu;
305 vector_type v;
306 for (int i = 0; i != 5; ++i)
307 v.push_back(gu.build());
308 VERIFY(v.size() == 5);
310 const val_type* first = &v.front() + 1;
311 const val_type* last = first + 2;
313 cont_type c1;
314 InsertRangeHelper<cont_type>::Insert(c1, first, last);
315 VERIFY(c1.size() == 2);
317 cont_type c2;
318 InsertRangeHelper<cont_type>::Insert(c2, last, first); // Expected failure
321 template<typename _Tp>
322 void
323 check_insert2()
325 bool test __attribute__((unused)) = true;
327 typedef _Tp cont_type;
328 typedef typename cont_type::value_type cont_val_type;
329 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
330 typedef std::vector<val_type> vector_type;
332 generate_unique<val_type> gu;
334 vector_type v;
335 for (int i = 0; i != 5; ++i)
336 v.push_back(gu.build());
337 VERIFY(v.size() == 5);
339 typename vector_type::iterator first = v.begin() + 1;
340 typename vector_type::iterator last = first + 2;
342 cont_type c1;
343 InsertRangeHelper<cont_type>::Insert(c1, first, last);
344 VERIFY(c1.size() == 2);
346 cont_type c2;
347 InsertRangeHelper<cont_type>::Insert(c2, last, first); // Expected failure
350 template<typename _Tp>
351 void
352 check_insert3()
354 bool test __attribute__((unused)) = true;
356 typedef _Tp cont_type;
357 typedef typename cont_type::value_type cont_val_type;
358 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
359 typedef std::list<val_type> list_type;
361 generate_unique<val_type> gu;
363 list_type l;
364 for (int i = 0; i != 5; ++i)
365 l.push_back(gu.build());
366 VERIFY(l.size() == 5);
368 typename list_type::iterator first = l.begin(); ++first;
369 typename list_type::iterator last = first; ++last; ++last;
371 cont_type c1;
372 InsertRangeHelper<cont_type>::Insert(c1, first, last);
373 VERIFY(c1.size() == 2);
375 cont_type c2;
376 InsertRangeHelper<cont_type>::Insert(c2, last, first); // Expected failure
379 template<typename _Tp>
380 void
381 check_insert4()
383 bool test __attribute__((unused)) = true;
385 typedef _Tp cont_type;
386 typedef typename cont_type::value_type cont_val_type;
387 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
388 typedef std::list<val_type> list_type;
390 generate_unique<val_type> gu;
392 list_type l;
393 for (int i = 0; i != 5; ++i)
394 l.push_back(gu.build());
395 VERIFY(l.size() == 5);
397 typename list_type::iterator first = l.begin(); ++first;
398 typename list_type::iterator last = first; ++last; ++last;
400 cont_type c1;
401 InsertRangeHelper<cont_type>::Insert(c1, l.begin(), l.end());
402 VERIFY(c1.size() == 5);
404 c1.insert(c1.begin(), c1.begin(), c1.end()); // Expected failure.
407 template<typename _Tp>
408 void use_invalid_iterator()
410 bool test __attribute__((unused)) = true;
412 typedef _Tp cont_type;
413 typedef typename cont_type::value_type cont_val_type;
414 typedef typename CopyableValueType<cont_val_type>::value_type val_type;
415 generate_unique<val_type> gu;
417 cont_type c;
418 for (size_t i = 0; i != 5; ++i)
419 c.insert(gu.build());
421 typename cont_type::iterator it = c.begin();
422 cont_val_type val = *it;
423 c.clear();
424 VERIFY( *it == val );