1 // Raw memory manipulators -*- C++ -*-
3 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
5 // Free Software Foundation, Inc.
7 // This file is part of the GNU ISO C++ Library. This library is free
8 // software; you can redistribute it and/or modify it under the
9 // terms of the GNU General Public License as published by the
10 // Free Software Foundation; either version 3, or (at your option)
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // Under Section 7 of GPL version 3, you are granted additional
19 // permissions described in the GCC Runtime Library Exception, version
20 // 3.1, as published by the Free Software Foundation.
22 // You should have received a copy of the GNU General Public License and
23 // a copy of the GCC Runtime Library Exception along with this program;
24 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 // <http://www.gnu.org/licenses/>.
30 * Hewlett-Packard Company
32 * Permission to use, copy, modify, distribute and sell this software
33 * and its documentation for any purpose is hereby granted without fee,
34 * provided that the above copyright notice appear in all copies and
35 * that both that copyright notice and this permission notice appear
36 * in supporting documentation. Hewlett-Packard Company makes no
37 * representations about the suitability of this software for any
38 * purpose. It is provided "as is" without express or implied warranty.
41 * Copyright (c) 1996,1997
42 * Silicon Graphics Computer Systems, Inc.
44 * Permission to use, copy, modify, distribute and sell this software
45 * and its documentation for any purpose is hereby granted without fee,
46 * provided that the above copyright notice appear in all copies and
47 * that both that copyright notice and this permission notice appear
48 * in supporting documentation. Silicon Graphics makes no
49 * representations about the suitability of this software for any
50 * purpose. It is provided "as is" without express or implied warranty.
53 /** @file bits/stl_uninitialized.h
54 * This is an internal header file, included by other library headers.
55 * Do not attempt to use it directly. @headername{memory}
58 #ifndef _STL_UNINITIALIZED_H
59 #define _STL_UNINITIALIZED_H 1
61 namespace std
_GLIBCXX_VISIBILITY(default)
63 _GLIBCXX_BEGIN_NAMESPACE_VERSION
65 template<bool _TrivialValueTypes
>
66 struct __uninitialized_copy
68 template<typename _InputIterator
, typename _ForwardIterator
>
69 static _ForwardIterator
70 __uninit_copy(_InputIterator __first
, _InputIterator __last
,
71 _ForwardIterator __result
)
73 _ForwardIterator __cur
= __result
;
76 for (; __first
!= __last
; ++__first
, ++__cur
)
77 std::_Construct(std::__addressof(*__cur
), *__first
);
82 std::_Destroy(__result
, __cur
);
83 __throw_exception_again
;
89 struct __uninitialized_copy
<true>
91 template<typename _InputIterator
, typename _ForwardIterator
>
92 static _ForwardIterator
93 __uninit_copy(_InputIterator __first
, _InputIterator __last
,
94 _ForwardIterator __result
)
95 { return std::copy(__first
, __last
, __result
); }
99 * @brief Copies the range [first,last) into result.
100 * @param __first An input iterator.
101 * @param __last An input iterator.
102 * @param __result An output iterator.
103 * @return __result + (__first - __last)
105 * Like copy(), but does not require an initialized output range.
107 template<typename _InputIterator
, typename _ForwardIterator
>
108 inline _ForwardIterator
109 uninitialized_copy(_InputIterator __first
, _InputIterator __last
,
110 _ForwardIterator __result
)
112 typedef typename iterator_traits
<_InputIterator
>::value_type
114 typedef typename iterator_traits
<_ForwardIterator
>::value_type
117 return std::__uninitialized_copy
<(__is_trivial(_ValueType1
)
118 && __is_trivial(_ValueType2
))>::
119 __uninit_copy(__first
, __last
, __result
);
123 template<bool _TrivialValueType
>
124 struct __uninitialized_fill
126 template<typename _ForwardIterator
, typename _Tp
>
128 __uninit_fill(_ForwardIterator __first
, _ForwardIterator __last
,
131 _ForwardIterator __cur
= __first
;
134 for (; __cur
!= __last
; ++__cur
)
135 std::_Construct(std::__addressof(*__cur
), __x
);
139 std::_Destroy(__first
, __cur
);
140 __throw_exception_again
;
146 struct __uninitialized_fill
<true>
148 template<typename _ForwardIterator
, typename _Tp
>
150 __uninit_fill(_ForwardIterator __first
, _ForwardIterator __last
,
152 { std::fill(__first
, __last
, __x
); }
156 * @brief Copies the value x into the range [first,last).
157 * @param __first An input iterator.
158 * @param __last An input iterator.
159 * @param __x The source value.
162 * Like fill(), but does not require an initialized output range.
164 template<typename _ForwardIterator
, typename _Tp
>
166 uninitialized_fill(_ForwardIterator __first
, _ForwardIterator __last
,
169 typedef typename iterator_traits
<_ForwardIterator
>::value_type
172 std::__uninitialized_fill
<__is_trivial(_ValueType
)>::
173 __uninit_fill(__first
, __last
, __x
);
177 template<bool _TrivialValueType
>
178 struct __uninitialized_fill_n
180 template<typename _ForwardIterator
, typename _Size
, typename _Tp
>
182 __uninit_fill_n(_ForwardIterator __first
, _Size __n
,
185 _ForwardIterator __cur
= __first
;
188 for (; __n
> 0; --__n
, ++__cur
)
189 std::_Construct(std::__addressof(*__cur
), __x
);
193 std::_Destroy(__first
, __cur
);
194 __throw_exception_again
;
200 struct __uninitialized_fill_n
<true>
202 template<typename _ForwardIterator
, typename _Size
, typename _Tp
>
204 __uninit_fill_n(_ForwardIterator __first
, _Size __n
,
206 { std::fill_n(__first
, __n
, __x
); }
210 * @brief Copies the value x into the range [first,first+n).
211 * @param __first An input iterator.
212 * @param __n The number of copies to make.
213 * @param __x The source value.
216 * Like fill_n(), but does not require an initialized output range.
218 template<typename _ForwardIterator
, typename _Size
, typename _Tp
>
220 uninitialized_fill_n(_ForwardIterator __first
, _Size __n
, const _Tp
& __x
)
222 typedef typename iterator_traits
<_ForwardIterator
>::value_type
225 std::__uninitialized_fill_n
<__is_trivial(_ValueType
)>::
226 __uninit_fill_n(__first
, __n
, __x
);
229 // Extensions: versions of uninitialized_copy, uninitialized_fill,
230 // and uninitialized_fill_n that take an allocator parameter.
231 // We dispatch back to the standard versions when we're given the
232 // default allocator. For nondefault allocators we do not use
233 // any of the POD optimizations.
235 template<typename _InputIterator
, typename _ForwardIterator
,
238 __uninitialized_copy_a(_InputIterator __first
, _InputIterator __last
,
239 _ForwardIterator __result
, _Allocator
& __alloc
)
241 _ForwardIterator __cur
= __result
;
244 typedef __gnu_cxx::__alloc_traits
<_Allocator
> __traits
;
245 for (; __first
!= __last
; ++__first
, ++__cur
)
246 __traits::construct(__alloc
, std::__addressof(*__cur
), *__first
);
251 std::_Destroy(__result
, __cur
, __alloc
);
252 __throw_exception_again
;
256 template<typename _InputIterator
, typename _ForwardIterator
, typename _Tp
>
257 inline _ForwardIterator
258 __uninitialized_copy_a(_InputIterator __first
, _InputIterator __last
,
259 _ForwardIterator __result
, allocator
<_Tp
>&)
260 { return std::uninitialized_copy(__first
, __last
, __result
); }
262 template<typename _InputIterator
, typename _ForwardIterator
,
264 inline _ForwardIterator
265 __uninitialized_move_a(_InputIterator __first
, _InputIterator __last
,
266 _ForwardIterator __result
, _Allocator
& __alloc
)
268 return std::__uninitialized_copy_a(_GLIBCXX_MAKE_MOVE_ITERATOR(__first
),
269 _GLIBCXX_MAKE_MOVE_ITERATOR(__last
),
273 template<typename _InputIterator
, typename _ForwardIterator
,
275 inline _ForwardIterator
276 __uninitialized_move_if_noexcept_a(_InputIterator __first
,
277 _InputIterator __last
,
278 _ForwardIterator __result
,
281 return std::__uninitialized_copy_a
282 (_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__first
),
283 _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__last
), __result
, __alloc
);
286 template<typename _ForwardIterator
, typename _Tp
, typename _Allocator
>
288 __uninitialized_fill_a(_ForwardIterator __first
, _ForwardIterator __last
,
289 const _Tp
& __x
, _Allocator
& __alloc
)
291 _ForwardIterator __cur
= __first
;
294 typedef __gnu_cxx::__alloc_traits
<_Allocator
> __traits
;
295 for (; __cur
!= __last
; ++__cur
)
296 __traits::construct(__alloc
, std::__addressof(*__cur
), __x
);
300 std::_Destroy(__first
, __cur
, __alloc
);
301 __throw_exception_again
;
305 template<typename _ForwardIterator
, typename _Tp
, typename _Tp2
>
307 __uninitialized_fill_a(_ForwardIterator __first
, _ForwardIterator __last
,
308 const _Tp
& __x
, allocator
<_Tp2
>&)
309 { std::uninitialized_fill(__first
, __last
, __x
); }
311 template<typename _ForwardIterator
, typename _Size
, typename _Tp
,
314 __uninitialized_fill_n_a(_ForwardIterator __first
, _Size __n
,
315 const _Tp
& __x
, _Allocator
& __alloc
)
317 _ForwardIterator __cur
= __first
;
320 typedef __gnu_cxx::__alloc_traits
<_Allocator
> __traits
;
321 for (; __n
> 0; --__n
, ++__cur
)
322 __traits::construct(__alloc
, std::__addressof(*__cur
), __x
);
326 std::_Destroy(__first
, __cur
, __alloc
);
327 __throw_exception_again
;
331 template<typename _ForwardIterator
, typename _Size
, typename _Tp
,
334 __uninitialized_fill_n_a(_ForwardIterator __first
, _Size __n
,
335 const _Tp
& __x
, allocator
<_Tp2
>&)
336 { std::uninitialized_fill_n(__first
, __n
, __x
); }
339 // Extensions: __uninitialized_copy_move, __uninitialized_move_copy,
340 // __uninitialized_fill_move, __uninitialized_move_fill.
341 // All of these algorithms take a user-supplied allocator, which is used
342 // for construction and destruction.
344 // __uninitialized_copy_move
345 // Copies [first1, last1) into [result, result + (last1 - first1)), and
346 // move [first2, last2) into
347 // [result, result + (last1 - first1) + (last2 - first2)).
348 template<typename _InputIterator1
, typename _InputIterator2
,
349 typename _ForwardIterator
, typename _Allocator
>
350 inline _ForwardIterator
351 __uninitialized_copy_move(_InputIterator1 __first1
,
352 _InputIterator1 __last1
,
353 _InputIterator2 __first2
,
354 _InputIterator2 __last2
,
355 _ForwardIterator __result
,
358 _ForwardIterator __mid
= std::__uninitialized_copy_a(__first1
, __last1
,
363 return std::__uninitialized_move_a(__first2
, __last2
, __mid
, __alloc
);
367 std::_Destroy(__result
, __mid
, __alloc
);
368 __throw_exception_again
;
372 // __uninitialized_move_copy
373 // Moves [first1, last1) into [result, result + (last1 - first1)), and
374 // copies [first2, last2) into
375 // [result, result + (last1 - first1) + (last2 - first2)).
376 template<typename _InputIterator1
, typename _InputIterator2
,
377 typename _ForwardIterator
, typename _Allocator
>
378 inline _ForwardIterator
379 __uninitialized_move_copy(_InputIterator1 __first1
,
380 _InputIterator1 __last1
,
381 _InputIterator2 __first2
,
382 _InputIterator2 __last2
,
383 _ForwardIterator __result
,
386 _ForwardIterator __mid
= std::__uninitialized_move_a(__first1
, __last1
,
391 return std::__uninitialized_copy_a(__first2
, __last2
, __mid
, __alloc
);
395 std::_Destroy(__result
, __mid
, __alloc
);
396 __throw_exception_again
;
400 // __uninitialized_fill_move
401 // Fills [result, mid) with x, and moves [first, last) into
402 // [mid, mid + (last - first)).
403 template<typename _ForwardIterator
, typename _Tp
, typename _InputIterator
,
405 inline _ForwardIterator
406 __uninitialized_fill_move(_ForwardIterator __result
, _ForwardIterator __mid
,
407 const _Tp
& __x
, _InputIterator __first
,
408 _InputIterator __last
, _Allocator
& __alloc
)
410 std::__uninitialized_fill_a(__result
, __mid
, __x
, __alloc
);
413 return std::__uninitialized_move_a(__first
, __last
, __mid
, __alloc
);
417 std::_Destroy(__result
, __mid
, __alloc
);
418 __throw_exception_again
;
422 // __uninitialized_move_fill
423 // Moves [first1, last1) into [first2, first2 + (last1 - first1)), and
424 // fills [first2 + (last1 - first1), last2) with x.
425 template<typename _InputIterator
, typename _ForwardIterator
, typename _Tp
,
428 __uninitialized_move_fill(_InputIterator __first1
, _InputIterator __last1
,
429 _ForwardIterator __first2
,
430 _ForwardIterator __last2
, const _Tp
& __x
,
433 _ForwardIterator __mid2
= std::__uninitialized_move_a(__first1
, __last1
,
438 std::__uninitialized_fill_a(__mid2
, __last2
, __x
, __alloc
);
442 std::_Destroy(__first2
, __mid2
, __alloc
);
443 __throw_exception_again
;
447 #ifdef __GXX_EXPERIMENTAL_CXX0X__
448 // Extensions: __uninitialized_default, __uninitialized_default_n,
449 // __uninitialized_default_a, __uninitialized_default_n_a.
451 template<bool _TrivialValueType
>
452 struct __uninitialized_default_1
454 template<typename _ForwardIterator
>
456 __uninit_default(_ForwardIterator __first
, _ForwardIterator __last
)
458 _ForwardIterator __cur
= __first
;
461 for (; __cur
!= __last
; ++__cur
)
462 std::_Construct(std::__addressof(*__cur
));
466 std::_Destroy(__first
, __cur
);
467 __throw_exception_again
;
473 struct __uninitialized_default_1
<true>
475 template<typename _ForwardIterator
>
477 __uninit_default(_ForwardIterator __first
, _ForwardIterator __last
)
479 typedef typename iterator_traits
<_ForwardIterator
>::value_type
482 std::fill(__first
, __last
, _ValueType());
486 template<bool _TrivialValueType
>
487 struct __uninitialized_default_n_1
489 template<typename _ForwardIterator
, typename _Size
>
491 __uninit_default_n(_ForwardIterator __first
, _Size __n
)
493 _ForwardIterator __cur
= __first
;
496 for (; __n
> 0; --__n
, ++__cur
)
497 std::_Construct(std::__addressof(*__cur
));
501 std::_Destroy(__first
, __cur
);
502 __throw_exception_again
;
508 struct __uninitialized_default_n_1
<true>
510 template<typename _ForwardIterator
, typename _Size
>
512 __uninit_default_n(_ForwardIterator __first
, _Size __n
)
514 typedef typename iterator_traits
<_ForwardIterator
>::value_type
517 std::fill_n(__first
, __n
, _ValueType());
521 // __uninitialized_default
522 // Fills [first, last) with std::distance(first, last) default
523 // constructed value_types(s).
524 template<typename _ForwardIterator
>
526 __uninitialized_default(_ForwardIterator __first
,
527 _ForwardIterator __last
)
529 typedef typename iterator_traits
<_ForwardIterator
>::value_type
532 std::__uninitialized_default_1
<__is_trivial(_ValueType
)>::
533 __uninit_default(__first
, __last
);
536 // __uninitialized_default_n
537 // Fills [first, first + n) with n default constructed value_type(s).
538 template<typename _ForwardIterator
, typename _Size
>
540 __uninitialized_default_n(_ForwardIterator __first
, _Size __n
)
542 typedef typename iterator_traits
<_ForwardIterator
>::value_type
545 std::__uninitialized_default_n_1
<__is_trivial(_ValueType
)>::
546 __uninit_default_n(__first
, __n
);
550 // __uninitialized_default_a
551 // Fills [first, last) with std::distance(first, last) default
552 // constructed value_types(s), constructed with the allocator alloc.
553 template<typename _ForwardIterator
, typename _Allocator
>
555 __uninitialized_default_a(_ForwardIterator __first
,
556 _ForwardIterator __last
,
559 _ForwardIterator __cur
= __first
;
562 typedef __gnu_cxx::__alloc_traits
<_Allocator
> __traits
;
563 for (; __cur
!= __last
; ++__cur
)
564 __traits::construct(__alloc
, std::__addressof(*__cur
));
568 std::_Destroy(__first
, __cur
, __alloc
);
569 __throw_exception_again
;
573 template<typename _ForwardIterator
, typename _Tp
>
575 __uninitialized_default_a(_ForwardIterator __first
,
576 _ForwardIterator __last
,
578 { std::__uninitialized_default(__first
, __last
); }
581 // __uninitialized_default_n_a
582 // Fills [first, first + n) with n default constructed value_types(s),
583 // constructed with the allocator alloc.
584 template<typename _ForwardIterator
, typename _Size
, typename _Allocator
>
586 __uninitialized_default_n_a(_ForwardIterator __first
, _Size __n
,
589 _ForwardIterator __cur
= __first
;
592 typedef __gnu_cxx::__alloc_traits
<_Allocator
> __traits
;
593 for (; __n
> 0; --__n
, ++__cur
)
594 __traits::construct(__alloc
, std::__addressof(*__cur
));
598 std::_Destroy(__first
, __cur
, __alloc
);
599 __throw_exception_again
;
603 template<typename _ForwardIterator
, typename _Size
, typename _Tp
>
605 __uninitialized_default_n_a(_ForwardIterator __first
, _Size __n
,
607 { std::__uninitialized_default_n(__first
, __n
); }
610 template<typename _InputIterator
, typename _Size
,
611 typename _ForwardIterator
>
613 __uninitialized_copy_n(_InputIterator __first
, _Size __n
,
614 _ForwardIterator __result
, input_iterator_tag
)
616 _ForwardIterator __cur
= __result
;
619 for (; __n
> 0; --__n
, ++__first
, ++__cur
)
620 std::_Construct(std::__addressof(*__cur
), *__first
);
625 std::_Destroy(__result
, __cur
);
626 __throw_exception_again
;
630 template<typename _RandomAccessIterator
, typename _Size
,
631 typename _ForwardIterator
>
632 inline _ForwardIterator
633 __uninitialized_copy_n(_RandomAccessIterator __first
, _Size __n
,
634 _ForwardIterator __result
,
635 random_access_iterator_tag
)
636 { return std::uninitialized_copy(__first
, __first
+ __n
, __result
); }
639 * @brief Copies the range [first,first+n) into result.
640 * @param __first An input iterator.
641 * @param __n The number of elements to copy.
642 * @param __result An output iterator.
643 * @return __result + __n
645 * Like copy_n(), but does not require an initialized output range.
647 template<typename _InputIterator
, typename _Size
, typename _ForwardIterator
>
648 inline _ForwardIterator
649 uninitialized_copy_n(_InputIterator __first
, _Size __n
,
650 _ForwardIterator __result
)
651 { return std::__uninitialized_copy_n(__first
, __n
, __result
,
652 std::__iterator_category(__first
)); }
655 _GLIBCXX_END_NAMESPACE_VERSION
658 #endif /* _STL_UNINITIALIZED_H */