libstdc++
stl_uninitialized.h
Go to the documentation of this file.
1 // Raw memory manipulators -*- C++ -*-
2 
3 // Copyright (C) 2001-2019 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /*
26  *
27  * Copyright (c) 1994
28  * Hewlett-Packard Company
29  *
30  * Permission to use, copy, modify, distribute and sell this software
31  * and its documentation for any purpose is hereby granted without fee,
32  * provided that the above copyright notice appear in all copies and
33  * that both that copyright notice and this permission notice appear
34  * in supporting documentation. Hewlett-Packard Company makes no
35  * representations about the suitability of this software for any
36  * purpose. It is provided "as is" without express or implied warranty.
37  *
38  *
39  * Copyright (c) 1996,1997
40  * Silicon Graphics Computer Systems, Inc.
41  *
42  * Permission to use, copy, modify, distribute and sell this software
43  * and its documentation for any purpose is hereby granted without fee,
44  * provided that the above copyright notice appear in all copies and
45  * that both that copyright notice and this permission notice appear
46  * in supporting documentation. Silicon Graphics makes no
47  * representations about the suitability of this software for any
48  * purpose. It is provided "as is" without express or implied warranty.
49  */
50 
51 /** @file bits/stl_uninitialized.h
52  * This is an internal header file, included by other library headers.
53  * Do not attempt to use it directly. @headername{memory}
54  */
55 
56 #ifndef _STL_UNINITIALIZED_H
57 #define _STL_UNINITIALIZED_H 1
58 
59 #if __cplusplus > 201402L
60 #include <utility>
61 #endif
62 
63 #if __cplusplus >= 201103L
64 #include <type_traits>
65 #endif
66 
67 namespace std _GLIBCXX_VISIBILITY(default)
68 {
69 _GLIBCXX_BEGIN_NAMESPACE_VERSION
70 
71  template<bool _TrivialValueTypes>
72  struct __uninitialized_copy
73  {
74  template<typename _InputIterator, typename _ForwardIterator>
75  static _ForwardIterator
76  __uninit_copy(_InputIterator __first, _InputIterator __last,
77  _ForwardIterator __result)
78  {
79  _ForwardIterator __cur = __result;
80  __try
81  {
82  for (; __first != __last; ++__first, (void)++__cur)
83  std::_Construct(std::__addressof(*__cur), *__first);
84  return __cur;
85  }
86  __catch(...)
87  {
88  std::_Destroy(__result, __cur);
89  __throw_exception_again;
90  }
91  }
92  };
93 
94  template<>
95  struct __uninitialized_copy<true>
96  {
97  template<typename _InputIterator, typename _ForwardIterator>
98  static _ForwardIterator
99  __uninit_copy(_InputIterator __first, _InputIterator __last,
100  _ForwardIterator __result)
101  { return std::copy(__first, __last, __result); }
102  };
103 
104  /**
105  * @brief Copies the range [first,last) into result.
106  * @param __first An input iterator.
107  * @param __last An input iterator.
108  * @param __result An output iterator.
109  * @return __result + (__first - __last)
110  *
111  * Like copy(), but does not require an initialized output range.
112  */
113  template<typename _InputIterator, typename _ForwardIterator>
114  inline _ForwardIterator
115  uninitialized_copy(_InputIterator __first, _InputIterator __last,
116  _ForwardIterator __result)
117  {
118  typedef typename iterator_traits<_InputIterator>::value_type
119  _ValueType1;
120  typedef typename iterator_traits<_ForwardIterator>::value_type
121  _ValueType2;
122 #if __cplusplus < 201103L
123  const bool __assignable = true;
124 #else
125  // Trivial types can have deleted copy constructor, but the std::copy
126  // optimization that uses memmove would happily "copy" them anyway.
127  static_assert(is_constructible<_ValueType2, decltype(*__first)>::value,
128  "result type must be constructible from value type of input range");
129 
130  typedef typename iterator_traits<_InputIterator>::reference _RefType1;
131  typedef typename iterator_traits<_ForwardIterator>::reference _RefType2;
132  // Trivial types can have deleted assignment, so using std::copy
133  // would be ill-formed. Require assignability before using std::copy:
134  const bool __assignable = is_assignable<_RefType2, _RefType1>::value;
135 #endif
136 
137  return std::__uninitialized_copy<__is_trivial(_ValueType1)
138  && __is_trivial(_ValueType2)
139  && __assignable>::
140  __uninit_copy(__first, __last, __result);
141  }
142 
143 
144  template<bool _TrivialValueType>
145  struct __uninitialized_fill
146  {
147  template<typename _ForwardIterator, typename _Tp>
148  static void
149  __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
150  const _Tp& __x)
151  {
152  _ForwardIterator __cur = __first;
153  __try
154  {
155  for (; __cur != __last; ++__cur)
156  std::_Construct(std::__addressof(*__cur), __x);
157  }
158  __catch(...)
159  {
160  std::_Destroy(__first, __cur);
161  __throw_exception_again;
162  }
163  }
164  };
165 
166  template<>
167  struct __uninitialized_fill<true>
168  {
169  template<typename _ForwardIterator, typename _Tp>
170  static void
171  __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
172  const _Tp& __x)
173  { std::fill(__first, __last, __x); }
174  };
175 
176  /**
177  * @brief Copies the value x into the range [first,last).
178  * @param __first An input iterator.
179  * @param __last An input iterator.
180  * @param __x The source value.
181  * @return Nothing.
182  *
183  * Like fill(), but does not require an initialized output range.
184  */
185  template<typename _ForwardIterator, typename _Tp>
186  inline void
187  uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
188  const _Tp& __x)
189  {
190  typedef typename iterator_traits<_ForwardIterator>::value_type
191  _ValueType;
192 #if __cplusplus < 201103L
193  const bool __assignable = true;
194 #else
195  // Trivial types can have deleted copy constructor, but the std::fill
196  // optimization that uses memmove would happily "copy" them anyway.
198  "result type must be constructible from input type");
199 
200  // Trivial types can have deleted assignment, so using std::fill
201  // would be ill-formed. Require assignability before using std::fill:
202  const bool __assignable = is_copy_assignable<_ValueType>::value;
203 #endif
204 
205  std::__uninitialized_fill<__is_trivial(_ValueType) && __assignable>::
206  __uninit_fill(__first, __last, __x);
207  }
208 
209 
210  template<bool _TrivialValueType>
211  struct __uninitialized_fill_n
212  {
213  template<typename _ForwardIterator, typename _Size, typename _Tp>
214  static _ForwardIterator
215  __uninit_fill_n(_ForwardIterator __first, _Size __n,
216  const _Tp& __x)
217  {
218  _ForwardIterator __cur = __first;
219  __try
220  {
221  for (; __n > 0; --__n, (void) ++__cur)
222  std::_Construct(std::__addressof(*__cur), __x);
223  return __cur;
224  }
225  __catch(...)
226  {
227  std::_Destroy(__first, __cur);
228  __throw_exception_again;
229  }
230  }
231  };
232 
233  template<>
234  struct __uninitialized_fill_n<true>
235  {
236  template<typename _ForwardIterator, typename _Size, typename _Tp>
237  static _ForwardIterator
238  __uninit_fill_n(_ForwardIterator __first, _Size __n,
239  const _Tp& __x)
240  { return std::fill_n(__first, __n, __x); }
241  };
242 
243  // _GLIBCXX_RESOLVE_LIB_DEFECTS
244  // DR 1339. uninitialized_fill_n should return the end of its range
245  /**
246  * @brief Copies the value x into the range [first,first+n).
247  * @param __first An input iterator.
248  * @param __n The number of copies to make.
249  * @param __x The source value.
250  * @return Nothing.
251  *
252  * Like fill_n(), but does not require an initialized output range.
253  */
254  template<typename _ForwardIterator, typename _Size, typename _Tp>
255  inline _ForwardIterator
256  uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
257  {
258  typedef typename iterator_traits<_ForwardIterator>::value_type
259  _ValueType;
260 #if __cplusplus < 201103L
261  const bool __assignable = true;
262 #else
263  // Trivial types can have deleted copy constructor, but the std::fill
264  // optimization that uses memmove would happily "copy" them anyway.
266  "result type must be constructible from input type");
267 
268  // Trivial types can have deleted assignment, so using std::fill
269  // would be ill-formed. Require assignability before using std::fill:
270  const bool __assignable = is_copy_assignable<_ValueType>::value;
271 #endif
272  return __uninitialized_fill_n<__is_trivial(_ValueType) && __assignable>::
273  __uninit_fill_n(__first, __n, __x);
274  }
275 
276  // Extensions: versions of uninitialized_copy, uninitialized_fill,
277  // and uninitialized_fill_n that take an allocator parameter.
278  // We dispatch back to the standard versions when we're given the
279  // default allocator. For nondefault allocators we do not use
280  // any of the POD optimizations.
281 
282  template<typename _InputIterator, typename _ForwardIterator,
283  typename _Allocator>
284  _ForwardIterator
285  __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
286  _ForwardIterator __result, _Allocator& __alloc)
287  {
288  _ForwardIterator __cur = __result;
289  __try
290  {
291  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
292  for (; __first != __last; ++__first, (void)++__cur)
293  __traits::construct(__alloc, std::__addressof(*__cur), *__first);
294  return __cur;
295  }
296  __catch(...)
297  {
298  std::_Destroy(__result, __cur, __alloc);
299  __throw_exception_again;
300  }
301  }
302 
303  template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
304  inline _ForwardIterator
305  __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
306  _ForwardIterator __result, allocator<_Tp>&)
307  { return std::uninitialized_copy(__first, __last, __result); }
308 
309  template<typename _InputIterator, typename _ForwardIterator,
310  typename _Allocator>
311  inline _ForwardIterator
312  __uninitialized_move_a(_InputIterator __first, _InputIterator __last,
313  _ForwardIterator __result, _Allocator& __alloc)
314  {
315  return std::__uninitialized_copy_a(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
316  _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
317  __result, __alloc);
318  }
319 
320  template<typename _InputIterator, typename _ForwardIterator,
321  typename _Allocator>
322  inline _ForwardIterator
323  __uninitialized_move_if_noexcept_a(_InputIterator __first,
324  _InputIterator __last,
325  _ForwardIterator __result,
326  _Allocator& __alloc)
327  {
328  return std::__uninitialized_copy_a
329  (_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__first),
330  _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__last), __result, __alloc);
331  }
332 
333  template<typename _ForwardIterator, typename _Tp, typename _Allocator>
334  void
335  __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
336  const _Tp& __x, _Allocator& __alloc)
337  {
338  _ForwardIterator __cur = __first;
339  __try
340  {
341  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
342  for (; __cur != __last; ++__cur)
343  __traits::construct(__alloc, std::__addressof(*__cur), __x);
344  }
345  __catch(...)
346  {
347  std::_Destroy(__first, __cur, __alloc);
348  __throw_exception_again;
349  }
350  }
351 
352  template<typename _ForwardIterator, typename _Tp, typename _Tp2>
353  inline void
354  __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
355  const _Tp& __x, allocator<_Tp2>&)
356  { std::uninitialized_fill(__first, __last, __x); }
357 
358  template<typename _ForwardIterator, typename _Size, typename _Tp,
359  typename _Allocator>
360  _ForwardIterator
361  __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
362  const _Tp& __x, _Allocator& __alloc)
363  {
364  _ForwardIterator __cur = __first;
365  __try
366  {
367  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
368  for (; __n > 0; --__n, (void) ++__cur)
369  __traits::construct(__alloc, std::__addressof(*__cur), __x);
370  return __cur;
371  }
372  __catch(...)
373  {
374  std::_Destroy(__first, __cur, __alloc);
375  __throw_exception_again;
376  }
377  }
378 
379  template<typename _ForwardIterator, typename _Size, typename _Tp,
380  typename _Tp2>
381  inline _ForwardIterator
382  __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
383  const _Tp& __x, allocator<_Tp2>&)
384  { return std::uninitialized_fill_n(__first, __n, __x); }
385 
386 
387  // Extensions: __uninitialized_copy_move, __uninitialized_move_copy,
388  // __uninitialized_fill_move, __uninitialized_move_fill.
389  // All of these algorithms take a user-supplied allocator, which is used
390  // for construction and destruction.
391 
392  // __uninitialized_copy_move
393  // Copies [first1, last1) into [result, result + (last1 - first1)), and
394  // move [first2, last2) into
395  // [result, result + (last1 - first1) + (last2 - first2)).
396  template<typename _InputIterator1, typename _InputIterator2,
397  typename _ForwardIterator, typename _Allocator>
398  inline _ForwardIterator
399  __uninitialized_copy_move(_InputIterator1 __first1,
400  _InputIterator1 __last1,
401  _InputIterator2 __first2,
402  _InputIterator2 __last2,
403  _ForwardIterator __result,
404  _Allocator& __alloc)
405  {
406  _ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
407  __result,
408  __alloc);
409  __try
410  {
411  return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
412  }
413  __catch(...)
414  {
415  std::_Destroy(__result, __mid, __alloc);
416  __throw_exception_again;
417  }
418  }
419 
420  // __uninitialized_move_copy
421  // Moves [first1, last1) into [result, result + (last1 - first1)), and
422  // copies [first2, last2) into
423  // [result, result + (last1 - first1) + (last2 - first2)).
424  template<typename _InputIterator1, typename _InputIterator2,
425  typename _ForwardIterator, typename _Allocator>
426  inline _ForwardIterator
427  __uninitialized_move_copy(_InputIterator1 __first1,
428  _InputIterator1 __last1,
429  _InputIterator2 __first2,
430  _InputIterator2 __last2,
431  _ForwardIterator __result,
432  _Allocator& __alloc)
433  {
434  _ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
435  __result,
436  __alloc);
437  __try
438  {
439  return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
440  }
441  __catch(...)
442  {
443  std::_Destroy(__result, __mid, __alloc);
444  __throw_exception_again;
445  }
446  }
447 
448  // __uninitialized_fill_move
449  // Fills [result, mid) with x, and moves [first, last) into
450  // [mid, mid + (last - first)).
451  template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
452  typename _Allocator>
453  inline _ForwardIterator
454  __uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
455  const _Tp& __x, _InputIterator __first,
456  _InputIterator __last, _Allocator& __alloc)
457  {
458  std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
459  __try
460  {
461  return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
462  }
463  __catch(...)
464  {
465  std::_Destroy(__result, __mid, __alloc);
466  __throw_exception_again;
467  }
468  }
469 
470  // __uninitialized_move_fill
471  // Moves [first1, last1) into [first2, first2 + (last1 - first1)), and
472  // fills [first2 + (last1 - first1), last2) with x.
473  template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
474  typename _Allocator>
475  inline void
476  __uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
477  _ForwardIterator __first2,
478  _ForwardIterator __last2, const _Tp& __x,
479  _Allocator& __alloc)
480  {
481  _ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
482  __first2,
483  __alloc);
484  __try
485  {
486  std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
487  }
488  __catch(...)
489  {
490  std::_Destroy(__first2, __mid2, __alloc);
491  __throw_exception_again;
492  }
493  }
494 
495 #if __cplusplus >= 201103L
496  // Extensions: __uninitialized_default, __uninitialized_default_n,
497  // __uninitialized_default_a, __uninitialized_default_n_a.
498 
499  template<bool _TrivialValueType>
500  struct __uninitialized_default_1
501  {
502  template<typename _ForwardIterator>
503  static void
504  __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
505  {
506  _ForwardIterator __cur = __first;
507  __try
508  {
509  for (; __cur != __last; ++__cur)
511  }
512  __catch(...)
513  {
514  std::_Destroy(__first, __cur);
515  __throw_exception_again;
516  }
517  }
518  };
519 
520  template<>
521  struct __uninitialized_default_1<true>
522  {
523  template<typename _ForwardIterator>
524  static void
525  __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
526  {
527  typedef typename iterator_traits<_ForwardIterator>::value_type
528  _ValueType;
529 
530  std::fill(__first, __last, _ValueType());
531  }
532  };
533 
534  template<bool _TrivialValueType>
535  struct __uninitialized_default_n_1
536  {
537  template<typename _ForwardIterator, typename _Size>
538  static _ForwardIterator
539  __uninit_default_n(_ForwardIterator __first, _Size __n)
540  {
541  _ForwardIterator __cur = __first;
542  __try
543  {
544  for (; __n > 0; --__n, (void) ++__cur)
546  return __cur;
547  }
548  __catch(...)
549  {
550  std::_Destroy(__first, __cur);
551  __throw_exception_again;
552  }
553  }
554  };
555 
556  template<>
557  struct __uninitialized_default_n_1<true>
558  {
559  template<typename _ForwardIterator, typename _Size>
560  static _ForwardIterator
561  __uninit_default_n(_ForwardIterator __first, _Size __n)
562  {
563  typedef typename iterator_traits<_ForwardIterator>::value_type
564  _ValueType;
565 
566  return std::fill_n(__first, __n, _ValueType());
567  }
568  };
569 
570  // __uninitialized_default
571  // Fills [first, last) with std::distance(first, last) default
572  // constructed value_types(s).
573  template<typename _ForwardIterator>
574  inline void
575  __uninitialized_default(_ForwardIterator __first,
576  _ForwardIterator __last)
577  {
578  typedef typename iterator_traits<_ForwardIterator>::value_type
579  _ValueType;
580  // trivial types can have deleted assignment
581  const bool __assignable = is_copy_assignable<_ValueType>::value;
582 
583  std::__uninitialized_default_1<__is_trivial(_ValueType)
584  && __assignable>::
585  __uninit_default(__first, __last);
586  }
587 
588  // __uninitialized_default_n
589  // Fills [first, first + n) with n default constructed value_type(s).
590  template<typename _ForwardIterator, typename _Size>
591  inline _ForwardIterator
592  __uninitialized_default_n(_ForwardIterator __first, _Size __n)
593  {
594  typedef typename iterator_traits<_ForwardIterator>::value_type
595  _ValueType;
596  // trivial types can have deleted assignment
597  const bool __assignable = is_copy_assignable<_ValueType>::value;
598 
599  return __uninitialized_default_n_1<__is_trivial(_ValueType)
600  && __assignable>::
601  __uninit_default_n(__first, __n);
602  }
603 
604 
605  // __uninitialized_default_a
606  // Fills [first, last) with std::distance(first, last) default
607  // constructed value_types(s), constructed with the allocator alloc.
608  template<typename _ForwardIterator, typename _Allocator>
609  void
610  __uninitialized_default_a(_ForwardIterator __first,
611  _ForwardIterator __last,
612  _Allocator& __alloc)
613  {
614  _ForwardIterator __cur = __first;
615  __try
616  {
617  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
618  for (; __cur != __last; ++__cur)
619  __traits::construct(__alloc, std::__addressof(*__cur));
620  }
621  __catch(...)
622  {
623  std::_Destroy(__first, __cur, __alloc);
624  __throw_exception_again;
625  }
626  }
627 
628  template<typename _ForwardIterator, typename _Tp>
629  inline void
630  __uninitialized_default_a(_ForwardIterator __first,
631  _ForwardIterator __last,
632  allocator<_Tp>&)
633  { std::__uninitialized_default(__first, __last); }
634 
635 
636  // __uninitialized_default_n_a
637  // Fills [first, first + n) with n default constructed value_types(s),
638  // constructed with the allocator alloc.
639  template<typename _ForwardIterator, typename _Size, typename _Allocator>
640  _ForwardIterator
641  __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
642  _Allocator& __alloc)
643  {
644  _ForwardIterator __cur = __first;
645  __try
646  {
647  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
648  for (; __n > 0; --__n, (void) ++__cur)
649  __traits::construct(__alloc, std::__addressof(*__cur));
650  return __cur;
651  }
652  __catch(...)
653  {
654  std::_Destroy(__first, __cur, __alloc);
655  __throw_exception_again;
656  }
657  }
658 
659  template<typename _ForwardIterator, typename _Size, typename _Tp>
660  inline _ForwardIterator
661  __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
662  allocator<_Tp>&)
663  { return std::__uninitialized_default_n(__first, __n); }
664 
665  template<bool _TrivialValueType>
666  struct __uninitialized_default_novalue_1
667  {
668  template<typename _ForwardIterator>
669  static void
670  __uninit_default_novalue(_ForwardIterator __first,
671  _ForwardIterator __last)
672  {
673  _ForwardIterator __cur = __first;
674  __try
675  {
676  for (; __cur != __last; ++__cur)
677  std::_Construct_novalue(std::__addressof(*__cur));
678  }
679  __catch(...)
680  {
681  std::_Destroy(__first, __cur);
682  __throw_exception_again;
683  }
684  }
685  };
686 
687  template<>
688  struct __uninitialized_default_novalue_1<true>
689  {
690  template<typename _ForwardIterator>
691  static void
692  __uninit_default_novalue(_ForwardIterator __first,
693  _ForwardIterator __last)
694  {
695  }
696  };
697 
698  template<bool _TrivialValueType>
699  struct __uninitialized_default_novalue_n_1
700  {
701  template<typename _ForwardIterator, typename _Size>
702  static _ForwardIterator
703  __uninit_default_novalue_n(_ForwardIterator __first, _Size __n)
704  {
705  _ForwardIterator __cur = __first;
706  __try
707  {
708  for (; __n > 0; --__n, (void) ++__cur)
709  std::_Construct_novalue(std::__addressof(*__cur));
710  return __cur;
711  }
712  __catch(...)
713  {
714  std::_Destroy(__first, __cur);
715  __throw_exception_again;
716  }
717  }
718  };
719 
720  template<>
721  struct __uninitialized_default_novalue_n_1<true>
722  {
723  template<typename _ForwardIterator, typename _Size>
724  static _ForwardIterator
725  __uninit_default_novalue_n(_ForwardIterator __first, _Size __n)
726  { return std::next(__first, __n); }
727  };
728 
729  // __uninitialized_default_novalue
730  // Fills [first, last) with std::distance(first, last) default-initialized
731  // value_types(s).
732  template<typename _ForwardIterator>
733  inline void
734  __uninitialized_default_novalue(_ForwardIterator __first,
735  _ForwardIterator __last)
736  {
737  typedef typename iterator_traits<_ForwardIterator>::value_type
738  _ValueType;
739 
740  std::__uninitialized_default_novalue_1<
741  is_trivially_default_constructible<_ValueType>::value>::
742  __uninit_default_novalue(__first, __last);
743  }
744 
745  // __uninitialized_default_n
746  // Fills [first, first + n) with n default-initialized value_type(s).
747  template<typename _ForwardIterator, typename _Size>
748  inline _ForwardIterator
749  __uninitialized_default_novalue_n(_ForwardIterator __first, _Size __n)
750  {
751  typedef typename iterator_traits<_ForwardIterator>::value_type
752  _ValueType;
753 
754  return __uninitialized_default_novalue_n_1<
755  is_trivially_default_constructible<_ValueType>::value>::
756  __uninit_default_novalue_n(__first, __n);
757  }
758 
759  template<typename _InputIterator, typename _Size,
760  typename _ForwardIterator>
761  _ForwardIterator
762  __uninitialized_copy_n(_InputIterator __first, _Size __n,
763  _ForwardIterator __result, input_iterator_tag)
764  {
765  _ForwardIterator __cur = __result;
766  __try
767  {
768  for (; __n > 0; --__n, (void) ++__first, ++__cur)
769  std::_Construct(std::__addressof(*__cur), *__first);
770  return __cur;
771  }
772  __catch(...)
773  {
774  std::_Destroy(__result, __cur);
775  __throw_exception_again;
776  }
777  }
778 
779  template<typename _RandomAccessIterator, typename _Size,
780  typename _ForwardIterator>
781  inline _ForwardIterator
782  __uninitialized_copy_n(_RandomAccessIterator __first, _Size __n,
783  _ForwardIterator __result,
784  random_access_iterator_tag)
785  { return std::uninitialized_copy(__first, __first + __n, __result); }
786 
787  template<typename _InputIterator, typename _Size,
788  typename _ForwardIterator>
789  pair<_InputIterator, _ForwardIterator>
790  __uninitialized_copy_n_pair(_InputIterator __first, _Size __n,
791  _ForwardIterator __result, input_iterator_tag)
792  {
793  _ForwardIterator __cur = __result;
794  __try
795  {
796  for (; __n > 0; --__n, (void) ++__first, ++__cur)
797  std::_Construct(std::__addressof(*__cur), *__first);
798  return {__first, __cur};
799  }
800  __catch(...)
801  {
802  std::_Destroy(__result, __cur);
803  __throw_exception_again;
804  }
805  }
806 
807  template<typename _RandomAccessIterator, typename _Size,
808  typename _ForwardIterator>
809  inline pair<_RandomAccessIterator, _ForwardIterator>
810  __uninitialized_copy_n_pair(_RandomAccessIterator __first, _Size __n,
811  _ForwardIterator __result,
812  random_access_iterator_tag)
813  {
814  auto __second_res = uninitialized_copy(__first, __first + __n, __result);
815  auto __first_res = std::next(__first, __n);
816  return {__first_res, __second_res};
817  }
818 
819  /**
820  * @brief Copies the range [first,first+n) into result.
821  * @param __first An input iterator.
822  * @param __n The number of elements to copy.
823  * @param __result An output iterator.
824  * @return __result + __n
825  *
826  * Like copy_n(), but does not require an initialized output range.
827  */
828  template<typename _InputIterator, typename _Size, typename _ForwardIterator>
829  inline _ForwardIterator
830  uninitialized_copy_n(_InputIterator __first, _Size __n,
831  _ForwardIterator __result)
832  { return std::__uninitialized_copy_n(__first, __n, __result,
833  std::__iterator_category(__first)); }
834 
835  template<typename _InputIterator, typename _Size, typename _ForwardIterator>
836  inline pair<_InputIterator, _ForwardIterator>
837  __uninitialized_copy_n_pair(_InputIterator __first, _Size __n,
838  _ForwardIterator __result)
839  {
840  return
841  std::__uninitialized_copy_n_pair(__first, __n, __result,
842  std::__iterator_category(__first));
843  }
844 
845 #endif
846 
847 #if __cplusplus >= 201703L
848 # define __cpp_lib_raw_memory_algorithms 201606L
849 
850  template <typename _ForwardIterator>
851  inline void
852  uninitialized_default_construct(_ForwardIterator __first,
853  _ForwardIterator __last)
854  {
855  __uninitialized_default_novalue(__first, __last);
856  }
857 
858  template <typename _ForwardIterator, typename _Size>
859  inline _ForwardIterator
860  uninitialized_default_construct_n(_ForwardIterator __first, _Size __count)
861  {
862  return __uninitialized_default_novalue_n(__first, __count);
863  }
864 
865  template <typename _ForwardIterator>
866  inline void
867  uninitialized_value_construct(_ForwardIterator __first,
868  _ForwardIterator __last)
869  {
870  return __uninitialized_default(__first, __last);
871  }
872 
873  template <typename _ForwardIterator, typename _Size>
874  inline _ForwardIterator
875  uninitialized_value_construct_n(_ForwardIterator __first, _Size __count)
876  {
877  return __uninitialized_default_n(__first, __count);
878  }
879 
880  template <typename _InputIterator, typename _ForwardIterator>
881  inline _ForwardIterator
882  uninitialized_move(_InputIterator __first, _InputIterator __last,
883  _ForwardIterator __result)
884  {
886  (_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
887  _GLIBCXX_MAKE_MOVE_ITERATOR(__last), __result);
888  }
889 
890  template <typename _InputIterator, typename _Size, typename _ForwardIterator>
891  inline pair<_InputIterator, _ForwardIterator>
892  uninitialized_move_n(_InputIterator __first, _Size __count,
893  _ForwardIterator __result)
894  {
895  auto __res = std::__uninitialized_copy_n_pair
896  (_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
897  __count, __result);
898  return {__res.first.base(), __res.second};
899  }
900 #endif // C++17
901 
902 #if __cplusplus >= 201103L
903  template<typename _Tp, typename _Up, typename _Allocator>
904  inline void
905  __relocate_object_a(_Tp* __dest, _Up* __orig, _Allocator& __alloc)
906  noexcept(noexcept(std::allocator_traits<_Allocator>::construct(__alloc,
907  __dest, std::move(*__orig)))
909  __alloc, std::__addressof(*__orig))))
910  {
911  typedef std::allocator_traits<_Allocator> __traits;
912  __traits::construct(__alloc, __dest, std::move(*__orig));
913  __traits::destroy(__alloc, std::__addressof(*__orig));
914  }
915 
916  // This class may be specialized for specific types.
917  // Also known as is_trivially_relocatable.
918  template<typename _Tp, typename = void>
919  struct __is_bitwise_relocatable
920  : is_trivial<_Tp> { };
921 
922  template <typename _Tp, typename _Up>
923  inline __enable_if_t<std::__is_bitwise_relocatable<_Tp>::value, _Tp*>
924  __relocate_a_1(_Tp* __first, _Tp* __last,
925  _Tp* __result, allocator<_Up>&) noexcept
926  {
927  ptrdiff_t __count = __last - __first;
928  if (__count > 0)
929  __builtin_memmove(__result, __first, __count * sizeof(_Tp));
930  return __result + __count;
931  }
932 
933  template <typename _InputIterator, typename _ForwardIterator,
934  typename _Allocator>
935  inline _ForwardIterator
936  __relocate_a_1(_InputIterator __first, _InputIterator __last,
937  _ForwardIterator __result, _Allocator& __alloc)
938  noexcept(noexcept(std::__relocate_object_a(std::addressof(*__result),
939  std::addressof(*__first),
940  __alloc)))
941  {
942  typedef typename iterator_traits<_InputIterator>::value_type
943  _ValueType;
944  typedef typename iterator_traits<_ForwardIterator>::value_type
945  _ValueType2;
947  "relocation is only possible for values of the same type");
948  _ForwardIterator __cur = __result;
949  for (; __first != __last; ++__first, (void)++__cur)
950  std::__relocate_object_a(std::__addressof(*__cur),
951  std::__addressof(*__first), __alloc);
952  return __cur;
953  }
954 
955  template <typename _InputIterator, typename _ForwardIterator,
956  typename _Allocator>
957  inline _ForwardIterator
958  __relocate_a(_InputIterator __first, _InputIterator __last,
959  _ForwardIterator __result, _Allocator& __alloc)
960  noexcept(noexcept(__relocate_a_1(std::__niter_base(__first),
961  std::__niter_base(__last),
962  std::__niter_base(__result), __alloc)))
963  {
964  return __relocate_a_1(std::__niter_base(__first),
965  std::__niter_base(__last),
966  std::__niter_base(__result), __alloc);
967  }
968 #endif
969 
970 _GLIBCXX_END_NAMESPACE_VERSION
971 } // namespace
972 
973 #endif /* _STL_UNINITIALIZED_H */
ISO C++ entities toplevel namespace is std.
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
void uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp &__x)
Copies the value x into the range [first,last).
_ForwardIterator uninitialized_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Copies the range [first,last) into result.
_ForwardIterator uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp &__x)
Copies the value x into the range [first,first+n).
_OI fill_n(_OI __first, _Size __n, const _Tp &__value)
Fills the range [first,first+n) with copies of value.
Definition: stl_algobase.h:802
is_constructible
Definition: type_traits:883
Uniform interface to all allocator types.
is_same
Definition: type_traits:1292
_ForwardIterator uninitialized_copy_n(_InputIterator __first, _Size __n, _ForwardIterator __result)
Copies the range [first,first+n) into result.
is_assignable
Definition: type_traits:1017
Uniform interface to C++98 and C++11 allocators.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
Definition: move.h:47
is_copy_assignable
Definition: type_traits:1035
void _Construct(_T1 *__p, _Args &&... __args)
Definition: stl_construct.h:74
void _Destroy(_Tp *__pointer)
Definition: stl_construct.h:97
_GLIBCXX17_CONSTEXPR _Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
Definition: move.h:138