56 #ifndef _STL_UNINITIALIZED_H
57 #define _STL_UNINITIALIZED_H 1
59 namespace std _GLIBCXX_VISIBILITY(default)
61 _GLIBCXX_BEGIN_NAMESPACE_VERSION
63 template<
bool _TrivialValueTypes>
64 struct __uninitialized_copy
66 template<
typename _InputIterator,
typename _ForwardIterator>
67 static _ForwardIterator
68 __uninit_copy(_InputIterator __first, _InputIterator __last,
69 _ForwardIterator __result)
71 _ForwardIterator __cur = __result;
74 for (; __first != __last; ++__first, ++__cur)
81 __throw_exception_again;
87 struct __uninitialized_copy<true>
89 template<
typename _InputIterator,
typename _ForwardIterator>
90 static _ForwardIterator
91 __uninit_copy(_InputIterator __first, _InputIterator __last,
92 _ForwardIterator __result)
93 {
return std::copy(__first, __last, __result); }
105 template<
typename _InputIterator,
typename _ForwardIterator>
106 inline _ForwardIterator
108 _ForwardIterator __result)
110 typedef typename iterator_traits<_InputIterator>::value_type
112 typedef typename iterator_traits<_ForwardIterator>::value_type
114 #if __cplusplus < 201103L
115 const bool __assignable =
true;
118 typedef typename iterator_traits<_InputIterator>::reference _RefType;
119 const bool __assignable = is_assignable<_ValueType1, _RefType>::value;
122 return std::__uninitialized_copy<__is_trivial(_ValueType1)
123 && __is_trivial(_ValueType2)
125 __uninit_copy(__first, __last, __result);
129 template<
bool _TrivialValueType>
130 struct __uninitialized_fill
132 template<
typename _ForwardIterator,
typename _Tp>
134 __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
137 _ForwardIterator __cur = __first;
140 for (; __cur != __last; ++__cur)
146 __throw_exception_again;
152 struct __uninitialized_fill<true>
154 template<
typename _ForwardIterator,
typename _Tp>
156 __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
158 { std::fill(__first, __last, __x); }
170 template<
typename _ForwardIterator,
typename _Tp>
175 typedef typename iterator_traits<_ForwardIterator>::value_type
177 #if __cplusplus < 201103L
178 const bool __assignable =
true;
181 const bool __assignable = is_copy_assignable<_ValueType>::value;
184 std::__uninitialized_fill<__is_trivial(_ValueType) && __assignable>::
185 __uninit_fill(__first, __last, __x);
189 template<
bool _TrivialValueType>
190 struct __uninitialized_fill_n
192 template<
typename _ForwardIterator,
typename _Size,
typename _Tp>
194 __uninit_fill_n(_ForwardIterator __first, _Size __n,
197 _ForwardIterator __cur = __first;
200 for (; __n > 0; --__n, ++__cur)
206 __throw_exception_again;
212 struct __uninitialized_fill_n<true>
214 template<
typename _ForwardIterator,
typename _Size,
typename _Tp>
216 __uninit_fill_n(_ForwardIterator __first, _Size __n,
230 template<
typename _ForwardIterator,
typename _Size,
typename _Tp>
234 typedef typename iterator_traits<_ForwardIterator>::value_type
236 #if __cplusplus < 201103L
237 const bool __assignable =
true;
240 const bool __assignable = is_copy_assignable<_ValueType>::value;
243 std::__uninitialized_fill_n<__is_trivial(_ValueType) && __assignable>::
244 __uninit_fill_n(__first, __n, __x);
253 template<
typename _InputIterator,
typename _ForwardIterator,
256 __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
257 _ForwardIterator __result, _Allocator& __alloc)
259 _ForwardIterator __cur = __result;
263 for (; __first != __last; ++__first, ++__cur)
270 __throw_exception_again;
274 template<
typename _InputIterator,
typename _ForwardIterator,
typename _Tp>
275 inline _ForwardIterator
276 __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
277 _ForwardIterator __result, allocator<_Tp>&)
280 template<
typename _InputIterator,
typename _ForwardIterator,
282 inline _ForwardIterator
283 __uninitialized_move_a(_InputIterator __first, _InputIterator __last,
284 _ForwardIterator __result, _Allocator& __alloc)
286 return std::__uninitialized_copy_a(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
287 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
291 template<
typename _InputIterator,
typename _ForwardIterator,
293 inline _ForwardIterator
294 __uninitialized_move_if_noexcept_a(_InputIterator __first,
295 _InputIterator __last,
296 _ForwardIterator __result,
299 return std::__uninitialized_copy_a
300 (_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__first),
301 _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__last), __result, __alloc);
304 template<
typename _ForwardIterator,
typename _Tp,
typename _Allocator>
306 __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
307 const _Tp& __x, _Allocator& __alloc)
309 _ForwardIterator __cur = __first;
313 for (; __cur != __last; ++__cur)
319 __throw_exception_again;
323 template<
typename _ForwardIterator,
typename _Tp,
typename _Tp2>
325 __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
326 const _Tp& __x, allocator<_Tp2>&)
329 template<
typename _ForwardIterator,
typename _Size,
typename _Tp,
332 __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
333 const _Tp& __x, _Allocator& __alloc)
335 _ForwardIterator __cur = __first;
339 for (; __n > 0; --__n, ++__cur)
345 __throw_exception_again;
349 template<
typename _ForwardIterator,
typename _Size,
typename _Tp,
352 __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
353 const _Tp& __x, allocator<_Tp2>&)
366 template<
typename _InputIterator1,
typename _InputIterator2,
367 typename _ForwardIterator,
typename _Allocator>
368 inline _ForwardIterator
369 __uninitialized_copy_move(_InputIterator1 __first1,
370 _InputIterator1 __last1,
371 _InputIterator2 __first2,
372 _InputIterator2 __last2,
373 _ForwardIterator __result,
376 _ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
381 return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
386 __throw_exception_again;
394 template<
typename _InputIterator1,
typename _InputIterator2,
395 typename _ForwardIterator,
typename _Allocator>
396 inline _ForwardIterator
397 __uninitialized_move_copy(_InputIterator1 __first1,
398 _InputIterator1 __last1,
399 _InputIterator2 __first2,
400 _InputIterator2 __last2,
401 _ForwardIterator __result,
404 _ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
409 return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
414 __throw_exception_again;
421 template<
typename _ForwardIterator,
typename _Tp,
typename _InputIterator,
423 inline _ForwardIterator
424 __uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
425 const _Tp& __x, _InputIterator __first,
426 _InputIterator __last, _Allocator& __alloc)
428 std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
431 return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
436 __throw_exception_again;
443 template<
typename _InputIterator,
typename _ForwardIterator,
typename _Tp,
446 __uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
447 _ForwardIterator __first2,
448 _ForwardIterator __last2,
const _Tp& __x,
451 _ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
456 std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
461 __throw_exception_again;
465 #if __cplusplus >= 201103L
469 template<
bool _TrivialValueType>
470 struct __uninitialized_default_1
472 template<
typename _ForwardIterator>
474 __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
476 _ForwardIterator __cur = __first;
479 for (; __cur != __last; ++__cur)
485 __throw_exception_again;
491 struct __uninitialized_default_1<true>
493 template<
typename _ForwardIterator>
495 __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
497 typedef typename iterator_traits<_ForwardIterator>::value_type
500 std::fill(__first, __last, _ValueType());
504 template<
bool _TrivialValueType>
505 struct __uninitialized_default_n_1
507 template<
typename _ForwardIterator,
typename _Size>
509 __uninit_default_n(_ForwardIterator __first, _Size __n)
511 _ForwardIterator __cur = __first;
514 for (; __n > 0; --__n, ++__cur)
520 __throw_exception_again;
526 struct __uninitialized_default_n_1<true>
528 template<
typename _ForwardIterator,
typename _Size>
530 __uninit_default_n(_ForwardIterator __first, _Size __n)
532 typedef typename iterator_traits<_ForwardIterator>::value_type
542 template<
typename _ForwardIterator>
544 __uninitialized_default(_ForwardIterator __first,
545 _ForwardIterator __last)
547 typedef typename iterator_traits<_ForwardIterator>::value_type
550 const bool __assignable = is_copy_assignable<_ValueType>::value;
552 std::__uninitialized_default_1<__is_trivial(_ValueType)
554 __uninit_default(__first, __last);
559 template<
typename _ForwardIterator,
typename _Size>
561 __uninitialized_default_n(_ForwardIterator __first, _Size __n)
563 typedef typename iterator_traits<_ForwardIterator>::value_type
566 const bool __assignable = is_copy_assignable<_ValueType>::value;
568 std::__uninitialized_default_n_1<__is_trivial(_ValueType)
570 __uninit_default_n(__first, __n);
577 template<
typename _ForwardIterator,
typename _Allocator>
579 __uninitialized_default_a(_ForwardIterator __first,
580 _ForwardIterator __last,
583 _ForwardIterator __cur = __first;
587 for (; __cur != __last; ++__cur)
593 __throw_exception_again;
597 template<
typename _ForwardIterator,
typename _Tp>
599 __uninitialized_default_a(_ForwardIterator __first,
600 _ForwardIterator __last,
602 { std::__uninitialized_default(__first, __last); }
608 template<
typename _ForwardIterator,
typename _Size,
typename _Allocator>
610 __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
613 _ForwardIterator __cur = __first;
617 for (; __n > 0; --__n, ++__cur)
623 __throw_exception_again;
627 template<
typename _ForwardIterator,
typename _Size,
typename _Tp>
629 __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
631 { std::__uninitialized_default_n(__first, __n); }
634 template<
typename _InputIterator,
typename _Size,
635 typename _ForwardIterator>
637 __uninitialized_copy_n(_InputIterator __first, _Size __n,
638 _ForwardIterator __result, input_iterator_tag)
640 _ForwardIterator __cur = __result;
643 for (; __n > 0; --__n, ++__first, ++__cur)
650 __throw_exception_again;
654 template<
typename _RandomAccessIterator,
typename _Size,
655 typename _ForwardIterator>
656 inline _ForwardIterator
657 __uninitialized_copy_n(_RandomAccessIterator __first, _Size __n,
658 _ForwardIterator __result,
659 random_access_iterator_tag)
671 template<
typename _InputIterator,
typename _Size,
typename _ForwardIterator>
672 inline _ForwardIterator
674 _ForwardIterator __result)
675 {
return std::__uninitialized_copy_n(__first, __n, __result,
679 _GLIBCXX_END_NAMESPACE_VERSION
Uniform interface to C++98 and C++0x allocators.
void uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp &__x)
Copies the value x into the range [first,first+n).
void _Construct(_T1 *__p, _Args &&...__args)
_ForwardIterator uninitialized_copy_n(_InputIterator __first, _Size __n, _ForwardIterator __result)
Copies the range [first,first+n) into result.
_ForwardIterator uninitialized_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Copies the range [first,last) into result.
void _Destroy(_Tp *__pointer)
iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
_Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
void uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp &__x)
Copies the value x into the range [first,last).
_OI fill_n(_OI __first, _Size __n, const _Tp &__value)
Fills the range [first,first+n) with copies of value.