1 // Copyright (C) 2010-2014 Free Software Foundation, Inc.
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)
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/>.
22 #ifndef _GLIBCXX_DEBUG
23 # include <debug/vector>
24 # include <debug/deque>
25 # include <debug/list>
27 #include <testsuite_hooks.h>
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
;
50 static value_type _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
;
65 static first_type _S_1
;
66 static second_type _S_2
;
69 return pair_type(_S_1
, _S_2
);
73 // Check that invalid range of pointers is detected
74 template<typename _Tp
>
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
;
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;
96 c1
.assign(first
, last
);
97 VERIFY(c1
.size() == 2);
100 c2
.assign(last
, first
); // Expected failure
103 // Check that invalid range of debug random iterators is detected
104 template<typename _Tp
>
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
;
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;
125 c1
.assign(first
, last
);
126 VERIFY(c1
.size() == 2);
129 c2
.assign(last
, first
); // Expected failure
132 // Check that invalid range of debug not random iterators is detected
133 template<typename _Tp
>
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
;
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
;
154 c1
.assign(first
, last
);
155 VERIFY(c1
.size() == 2);
158 c2
.assign(last
, first
); // Expected failure
161 // Check that invalid range of pointers is detected
162 template<typename _Tp
>
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
;
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;
183 cont_type
c(last
, first
); // Expected failure
186 // Check that invalid range of debug random iterators is detected
187 template<typename _Tp
>
191 bool test
__attribute__((unused
)) = true;
193 typedef _Tp cont_type
;
194 typedef typename
cont_type::value_type cont_val_type
;
195 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
196 typedef std::vector
<val_type
> vector_type
;
198 generate_unique
<val_type
> gu
;
201 for (int i
= 0; i
!= 5; ++i
)
202 v
.push_back(gu
.build());
203 VERIFY(v
.size() == 5);
205 typename
vector_type::iterator first
= v
.begin() + 1;
206 typename
vector_type::iterator last
= first
+ 2;
208 cont_type
c(last
, first
); // Expected failure
211 // Check that invalid range of debug not random iterators is detected
212 template<typename _Tp
>
216 bool test
__attribute__((unused
)) = true;
218 typedef _Tp cont_type
;
219 typedef typename
cont_type::value_type cont_val_type
;
220 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
221 typedef std::list
<val_type
> list_type
;
223 generate_unique
<val_type
> gu
;
226 for (int i
= 0; i
!= 5; ++i
)
227 l
.push_back(gu
.build());
228 VERIFY(l
.size() == 5);
230 typename
list_type::iterator first
= l
.begin(); ++first
;
231 typename
list_type::iterator last
= first
; ++last
; ++last
;
233 cont_type
c(last
, first
); // Expected failure
236 template <typename _Cont
>
237 struct InsertRangeHelper
239 template <typename _It
>
241 Insert(_Cont
& cont
, _It first
, _It last
)
242 { cont
.insert(first
, last
); }
245 template <typename _Cont
>
246 struct InsertRangeHelperAux
248 template <typename _It
>
250 Insert(_Cont
& cont
, _It first
, _It last
)
251 { cont
.insert(cont
.begin(), first
, last
); }
254 template <typename _Tp1
, typename _Tp2
>
255 struct InsertRangeHelper
<std::vector
<_Tp1
, _Tp2
> >
256 : InsertRangeHelperAux
<std::vector
<_Tp1
, _Tp2
> >
259 template <typename _Tp1
, typename _Tp2
>
260 struct InsertRangeHelper
<std::deque
<_Tp1
, _Tp2
> >
261 : InsertRangeHelperAux
<std::deque
<_Tp1
, _Tp2
> >
264 template <typename _Tp1
, typename _Tp2
>
265 struct InsertRangeHelper
<std::list
<_Tp1
, _Tp2
> >
266 : InsertRangeHelperAux
<std::list
<_Tp1
, _Tp2
> >
269 #ifndef _GLIBCXX_DEBUG
270 template <typename _Tp1
, typename _Tp2
>
271 struct InsertRangeHelper
<__gnu_debug::vector
<_Tp1
, _Tp2
> >
272 : InsertRangeHelperAux
<__gnu_debug::vector
<_Tp1
, _Tp2
> >
275 template <typename _Tp1
, typename _Tp2
>
276 struct InsertRangeHelper
<__gnu_debug::deque
<_Tp1
, _Tp2
> >
277 : InsertRangeHelperAux
<__gnu_debug::deque
<_Tp1
, _Tp2
> >
280 template <typename _Tp1
, typename _Tp2
>
281 struct InsertRangeHelper
<__gnu_debug::list
<_Tp1
, _Tp2
> >
282 : InsertRangeHelperAux
<__gnu_debug::list
<_Tp1
, _Tp2
> >
286 template<typename _Tp
>
290 bool test
__attribute__((unused
)) = true;
292 typedef _Tp cont_type
;
293 typedef typename
cont_type::value_type cont_val_type
;
294 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
295 typedef std::vector
<val_type
> vector_type
;
297 generate_unique
<val_type
> gu
;
300 for (int i
= 0; i
!= 5; ++i
)
301 v
.push_back(gu
.build());
302 VERIFY(v
.size() == 5);
304 const val_type
* first
= &v
.front() + 1;
305 const val_type
* last
= first
+ 2;
308 InsertRangeHelper
<cont_type
>::Insert(c1
, first
, last
);
309 VERIFY(c1
.size() == 2);
312 InsertRangeHelper
<cont_type
>::Insert(c2
, last
, first
); // Expected failure
315 template<typename _Tp
>
319 bool test
__attribute__((unused
)) = true;
321 typedef _Tp cont_type
;
322 typedef typename
cont_type::value_type cont_val_type
;
323 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
324 typedef std::vector
<val_type
> vector_type
;
326 generate_unique
<val_type
> gu
;
329 for (int i
= 0; i
!= 5; ++i
)
330 v
.push_back(gu
.build());
331 VERIFY(v
.size() == 5);
333 typename
vector_type::iterator first
= v
.begin() + 1;
334 typename
vector_type::iterator last
= first
+ 2;
337 InsertRangeHelper
<cont_type
>::Insert(c1
, first
, last
);
338 VERIFY(c1
.size() == 2);
341 InsertRangeHelper
<cont_type
>::Insert(c2
, last
, first
); // Expected failure
344 template<typename _Tp
>
348 bool test
__attribute__((unused
)) = true;
350 typedef _Tp cont_type
;
351 typedef typename
cont_type::value_type cont_val_type
;
352 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
353 typedef std::list
<val_type
> list_type
;
355 generate_unique
<val_type
> gu
;
358 for (int i
= 0; i
!= 5; ++i
)
359 l
.push_back(gu
.build());
360 VERIFY(l
.size() == 5);
362 typename
list_type::iterator first
= l
.begin(); ++first
;
363 typename
list_type::iterator last
= first
; ++last
; ++last
;
366 InsertRangeHelper
<cont_type
>::Insert(c1
, first
, last
);
367 VERIFY(c1
.size() == 2);
370 InsertRangeHelper
<cont_type
>::Insert(c2
, last
, first
); // Expected failure
373 template<typename _Tp
>
377 bool test
__attribute__((unused
)) = true;
379 typedef _Tp cont_type
;
380 typedef typename
cont_type::value_type cont_val_type
;
381 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
382 typedef std::list
<val_type
> list_type
;
384 generate_unique
<val_type
> gu
;
387 for (int i
= 0; i
!= 5; ++i
)
388 l
.push_back(gu
.build());
389 VERIFY(l
.size() == 5);
391 typename
list_type::iterator first
= l
.begin(); ++first
;
392 typename
list_type::iterator last
= first
; ++last
; ++last
;
395 InsertRangeHelper
<cont_type
>::Insert(c1
, l
.begin(), l
.end());
396 VERIFY(c1
.size() == 5);
398 c1
.insert(c1
.begin(), c1
.begin(), c1
.end()); // Expected failure.
401 template<typename _Tp
>
402 void use_invalid_iterator()
404 bool test
__attribute__((unused
)) = true;
406 typedef _Tp cont_type
;
407 typedef typename
cont_type::value_type cont_val_type
;
408 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
409 generate_unique
<val_type
> gu
;
412 for (size_t i
= 0; i
!= 5; ++i
)
413 c
.insert(gu
.build());
415 typename
cont_type::iterator it
= c
.begin();
416 cont_val_type val
= *it
;
418 VERIFY( *it
== val
);