1 // Copyright (C) 2010-2016 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_
;
57 struct generate_unique
<bool>
59 typedef bool value_type
;
63 static value_type _S_
;
69 template<typename _Tp1
, typename _Tp2
>
70 struct generate_unique
<std::pair
<_Tp1
, _Tp2
> >
72 typedef _Tp1 first_type
;
73 typedef _Tp2 second_type
;
74 typedef std::pair
<_Tp1
, _Tp2
> pair_type
;
78 static first_type _S_1
;
79 static second_type _S_2
;
82 return pair_type(_S_1
, _S_2
);
86 // Check that invalid range of pointers is detected
87 template<typename _Tp
>
91 typedef _Tp cont_type
;
92 typedef typename
cont_type::value_type cont_val_type
;
93 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
94 typedef std::vector
<val_type
> vector_type
;
96 generate_unique
<val_type
> gu
;
99 for (int i
= 0; i
!= 5; ++i
)
100 v
.push_back(gu
.build());
101 VERIFY(v
.size() == 5);
103 const val_type
* first
= &v
.front() + 1;
104 const val_type
* last
= first
+ 2;
107 c1
.assign(first
, last
);
108 VERIFY(c1
.size() == 2);
111 c2
.assign(last
, first
); // Expected failure
114 // Check that invalid range of debug random iterators is detected
115 template<typename _Tp
>
119 typedef _Tp cont_type
;
120 typedef typename
cont_type::value_type cont_val_type
;
121 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
122 typedef std::vector
<val_type
> vector_type
;
124 generate_unique
<val_type
> gu
;
127 for (int i
= 0; i
!= 5; ++i
)
128 v
.push_back(gu
.build());
129 VERIFY(v
.size() == 5);
131 typename
vector_type::iterator first
= v
.begin() + 1;
132 typename
vector_type::iterator last
= first
+ 2;
134 c1
.assign(first
, last
);
135 VERIFY(c1
.size() == 2);
138 c2
.assign(last
, first
); // Expected failure
141 // Check that invalid range of debug not random iterators is detected
142 template<typename _Tp
>
146 typedef _Tp cont_type
;
147 typedef typename
cont_type::value_type cont_val_type
;
148 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
149 typedef std::list
<val_type
> list_type
;
151 generate_unique
<val_type
> gu
;
154 for (int i
= 0; i
!= 5; ++i
)
155 l
.push_back(gu
.build());
156 VERIFY(l
.size() == 5);
158 typename
list_type::iterator first
= l
.begin(); ++first
;
159 typename
list_type::iterator last
= first
; ++last
; ++last
;
161 c1
.assign(first
, last
);
162 VERIFY(c1
.size() == 2);
165 c2
.assign(last
, first
); // Expected failure
168 // Check that invalid range of pointers is detected
169 template<typename _Tp
>
173 typedef _Tp cont_type
;
174 typedef typename
cont_type::value_type cont_val_type
;
175 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
176 typedef std::vector
<val_type
> vector_type
;
178 generate_unique
<val_type
> gu
;
181 for (int i
= 0; i
!= 5; ++i
)
182 v
.push_back(gu
.build());
183 VERIFY(v
.size() == 5);
185 val_type
*first
= &v
.front() + 1;
186 val_type
*last
= first
+ 2;
188 cont_type
c(last
, first
); // Expected failure
191 // Check that invalid range of debug random iterators is detected
192 template<typename _Tp
>
196 typedef _Tp cont_type
;
197 typedef typename
cont_type::value_type cont_val_type
;
198 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
199 typedef std::vector
<val_type
> vector_type
;
201 generate_unique
<val_type
> gu
;
204 for (int i
= 0; i
!= 5; ++i
)
205 v
.push_back(gu
.build());
206 VERIFY(v
.size() == 5);
208 typename
vector_type::iterator first
= v
.begin() + 1;
209 typename
vector_type::iterator last
= first
+ 2;
211 cont_type
c(last
, first
); // Expected failure
214 // Check that invalid range of debug not random iterators is detected
215 template<typename _Tp
>
219 typedef _Tp cont_type
;
220 typedef typename
cont_type::value_type cont_val_type
;
221 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
222 typedef std::list
<val_type
> list_type
;
224 generate_unique
<val_type
> gu
;
227 for (int i
= 0; i
!= 5; ++i
)
228 l
.push_back(gu
.build());
229 VERIFY(l
.size() == 5);
231 typename
list_type::iterator first
= l
.begin(); ++first
;
232 typename
list_type::iterator last
= first
; ++last
; ++last
;
234 cont_type
c(last
, first
); // Expected failure
237 template <typename _Cont
>
238 struct InsertRangeHelper
240 template <typename _It
>
242 Insert(_Cont
& cont
, _It first
, _It last
)
243 { cont
.insert(first
, last
); }
246 template <typename _Cont
>
247 struct InsertRangeHelperAux
249 template <typename _It
>
251 Insert(_Cont
& cont
, _It first
, _It last
)
252 { cont
.insert(cont
.begin(), first
, last
); }
255 template <typename _Tp1
, typename _Tp2
>
256 struct InsertRangeHelper
<std::vector
<_Tp1
, _Tp2
> >
257 : InsertRangeHelperAux
<std::vector
<_Tp1
, _Tp2
> >
260 template <typename _Tp1
, typename _Tp2
>
261 struct InsertRangeHelper
<std::deque
<_Tp1
, _Tp2
> >
262 : InsertRangeHelperAux
<std::deque
<_Tp1
, _Tp2
> >
265 template <typename _Tp1
, typename _Tp2
>
266 struct InsertRangeHelper
<std::list
<_Tp1
, _Tp2
> >
267 : InsertRangeHelperAux
<std::list
<_Tp1
, _Tp2
> >
270 #ifndef _GLIBCXX_DEBUG
271 template <typename _Tp1
, typename _Tp2
>
272 struct InsertRangeHelper
<__gnu_debug::vector
<_Tp1
, _Tp2
> >
273 : InsertRangeHelperAux
<__gnu_debug::vector
<_Tp1
, _Tp2
> >
276 template <typename _Tp1
, typename _Tp2
>
277 struct InsertRangeHelper
<__gnu_debug::deque
<_Tp1
, _Tp2
> >
278 : InsertRangeHelperAux
<__gnu_debug::deque
<_Tp1
, _Tp2
> >
281 template <typename _Tp1
, typename _Tp2
>
282 struct InsertRangeHelper
<__gnu_debug::list
<_Tp1
, _Tp2
> >
283 : InsertRangeHelperAux
<__gnu_debug::list
<_Tp1
, _Tp2
> >
287 template<typename _Tp
>
291 typedef _Tp cont_type
;
292 typedef typename
cont_type::value_type cont_val_type
;
293 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
294 typedef std::vector
<val_type
> vector_type
;
296 generate_unique
<val_type
> gu
;
299 for (int i
= 0; i
!= 5; ++i
)
300 v
.push_back(gu
.build());
301 VERIFY(v
.size() == 5);
303 const val_type
* first
= &v
.front() + 1;
304 const val_type
* last
= first
+ 2;
307 InsertRangeHelper
<cont_type
>::Insert(c1
, first
, last
);
308 VERIFY(c1
.size() == 2);
311 InsertRangeHelper
<cont_type
>::Insert(c2
, last
, first
); // Expected failure
314 template<typename _Tp
>
318 typedef _Tp cont_type
;
319 typedef typename
cont_type::value_type cont_val_type
;
320 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
321 typedef std::vector
<val_type
> vector_type
;
323 generate_unique
<val_type
> gu
;
326 for (int i
= 0; i
!= 5; ++i
)
327 v
.push_back(gu
.build());
328 VERIFY(v
.size() == 5);
330 typename
vector_type::iterator first
= v
.begin() + 1;
331 typename
vector_type::iterator last
= first
+ 2;
334 InsertRangeHelper
<cont_type
>::Insert(c1
, first
, last
);
335 VERIFY(c1
.size() == 2);
338 InsertRangeHelper
<cont_type
>::Insert(c2
, last
, first
); // Expected failure
341 template<typename _Tp
>
345 typedef _Tp cont_type
;
346 typedef typename
cont_type::value_type cont_val_type
;
347 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
348 typedef std::list
<val_type
> list_type
;
350 generate_unique
<val_type
> gu
;
353 for (int i
= 0; i
!= 5; ++i
)
354 l
.push_back(gu
.build());
355 VERIFY(l
.size() == 5);
357 typename
list_type::iterator first
= l
.begin(); ++first
;
358 typename
list_type::iterator last
= first
; ++last
; ++last
;
361 InsertRangeHelper
<cont_type
>::Insert(c1
, first
, last
);
362 VERIFY(c1
.size() == 2);
365 InsertRangeHelper
<cont_type
>::Insert(c2
, last
, first
); // Expected failure
368 template<typename _Tp
>
372 typedef _Tp cont_type
;
373 typedef typename
cont_type::value_type cont_val_type
;
374 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
375 typedef std::list
<val_type
> list_type
;
377 generate_unique
<val_type
> gu
;
380 for (int i
= 0; i
!= 5; ++i
)
381 l
.push_back(gu
.build());
382 VERIFY(l
.size() == 5);
384 typename
list_type::iterator first
= l
.begin(); ++first
;
385 typename
list_type::iterator last
= first
; ++last
; ++last
;
388 InsertRangeHelper
<cont_type
>::Insert(c1
, l
.begin(), l
.end());
389 VERIFY(c1
.size() == 5);
391 c1
.insert(c1
.begin(), c1
.begin(), c1
.end()); // Expected failure.
394 template<typename _Tp
>
395 void use_invalid_iterator()
397 typedef _Tp cont_type
;
398 typedef typename
cont_type::value_type cont_val_type
;
399 typedef typename CopyableValueType
<cont_val_type
>::value_type val_type
;
400 generate_unique
<val_type
> gu
;
403 for (size_t i
= 0; i
!= 5; ++i
)
404 c
.insert(gu
.build());
406 typename
cont_type::iterator it
= c
.begin();
407 cont_val_type val
= *it
;
409 VERIFY( *it
== val
);