1*e4b17023SJohn Marino // Raw memory manipulators -*- C++ -*-
2*e4b17023SJohn Marino
3*e4b17023SJohn Marino // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4*e4b17023SJohn Marino // 2009, 2010, 2011
5*e4b17023SJohn Marino // Free Software Foundation, Inc.
6*e4b17023SJohn Marino //
7*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free
8*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
9*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
10*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
11*e4b17023SJohn Marino // any later version.
12*e4b17023SJohn Marino
13*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
14*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
15*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*e4b17023SJohn Marino // GNU General Public License for more details.
17*e4b17023SJohn Marino
18*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
19*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
20*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
21*e4b17023SJohn Marino
22*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
23*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
24*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
26*e4b17023SJohn Marino
27*e4b17023SJohn Marino /*
28*e4b17023SJohn Marino *
29*e4b17023SJohn Marino * Copyright (c) 1994
30*e4b17023SJohn Marino * Hewlett-Packard Company
31*e4b17023SJohn Marino *
32*e4b17023SJohn Marino * Permission to use, copy, modify, distribute and sell this software
33*e4b17023SJohn Marino * and its documentation for any purpose is hereby granted without fee,
34*e4b17023SJohn Marino * provided that the above copyright notice appear in all copies and
35*e4b17023SJohn Marino * that both that copyright notice and this permission notice appear
36*e4b17023SJohn Marino * in supporting documentation. Hewlett-Packard Company makes no
37*e4b17023SJohn Marino * representations about the suitability of this software for any
38*e4b17023SJohn Marino * purpose. It is provided "as is" without express or implied warranty.
39*e4b17023SJohn Marino *
40*e4b17023SJohn Marino *
41*e4b17023SJohn Marino * Copyright (c) 1996,1997
42*e4b17023SJohn Marino * Silicon Graphics Computer Systems, Inc.
43*e4b17023SJohn Marino *
44*e4b17023SJohn Marino * Permission to use, copy, modify, distribute and sell this software
45*e4b17023SJohn Marino * and its documentation for any purpose is hereby granted without fee,
46*e4b17023SJohn Marino * provided that the above copyright notice appear in all copies and
47*e4b17023SJohn Marino * that both that copyright notice and this permission notice appear
48*e4b17023SJohn Marino * in supporting documentation. Silicon Graphics makes no
49*e4b17023SJohn Marino * representations about the suitability of this software for any
50*e4b17023SJohn Marino * purpose. It is provided "as is" without express or implied warranty.
51*e4b17023SJohn Marino */
52*e4b17023SJohn Marino
53*e4b17023SJohn Marino /** @file bits/stl_uninitialized.h
54*e4b17023SJohn Marino * This is an internal header file, included by other library headers.
55*e4b17023SJohn Marino * Do not attempt to use it directly. @headername{memory}
56*e4b17023SJohn Marino */
57*e4b17023SJohn Marino
58*e4b17023SJohn Marino #ifndef _STL_UNINITIALIZED_H
59*e4b17023SJohn Marino #define _STL_UNINITIALIZED_H 1
60*e4b17023SJohn Marino
_GLIBCXX_VISIBILITY(default)61*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
62*e4b17023SJohn Marino {
63*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION
64*e4b17023SJohn Marino
65*e4b17023SJohn Marino template<bool _TrivialValueTypes>
66*e4b17023SJohn Marino struct __uninitialized_copy
67*e4b17023SJohn Marino {
68*e4b17023SJohn Marino template<typename _InputIterator, typename _ForwardIterator>
69*e4b17023SJohn Marino static _ForwardIterator
70*e4b17023SJohn Marino __uninit_copy(_InputIterator __first, _InputIterator __last,
71*e4b17023SJohn Marino _ForwardIterator __result)
72*e4b17023SJohn Marino {
73*e4b17023SJohn Marino _ForwardIterator __cur = __result;
74*e4b17023SJohn Marino __try
75*e4b17023SJohn Marino {
76*e4b17023SJohn Marino for (; __first != __last; ++__first, ++__cur)
77*e4b17023SJohn Marino std::_Construct(std::__addressof(*__cur), *__first);
78*e4b17023SJohn Marino return __cur;
79*e4b17023SJohn Marino }
80*e4b17023SJohn Marino __catch(...)
81*e4b17023SJohn Marino {
82*e4b17023SJohn Marino std::_Destroy(__result, __cur);
83*e4b17023SJohn Marino __throw_exception_again;
84*e4b17023SJohn Marino }
85*e4b17023SJohn Marino }
86*e4b17023SJohn Marino };
87*e4b17023SJohn Marino
88*e4b17023SJohn Marino template<>
89*e4b17023SJohn Marino struct __uninitialized_copy<true>
90*e4b17023SJohn Marino {
91*e4b17023SJohn Marino template<typename _InputIterator, typename _ForwardIterator>
92*e4b17023SJohn Marino static _ForwardIterator
93*e4b17023SJohn Marino __uninit_copy(_InputIterator __first, _InputIterator __last,
94*e4b17023SJohn Marino _ForwardIterator __result)
95*e4b17023SJohn Marino { return std::copy(__first, __last, __result); }
96*e4b17023SJohn Marino };
97*e4b17023SJohn Marino
98*e4b17023SJohn Marino /**
99*e4b17023SJohn Marino * @brief Copies the range [first,last) into result.
100*e4b17023SJohn Marino * @param __first An input iterator.
101*e4b17023SJohn Marino * @param __last An input iterator.
102*e4b17023SJohn Marino * @param __result An output iterator.
103*e4b17023SJohn Marino * @return __result + (__first - __last)
104*e4b17023SJohn Marino *
105*e4b17023SJohn Marino * Like copy(), but does not require an initialized output range.
106*e4b17023SJohn Marino */
107*e4b17023SJohn Marino template<typename _InputIterator, typename _ForwardIterator>
108*e4b17023SJohn Marino inline _ForwardIterator
109*e4b17023SJohn Marino uninitialized_copy(_InputIterator __first, _InputIterator __last,
110*e4b17023SJohn Marino _ForwardIterator __result)
111*e4b17023SJohn Marino {
112*e4b17023SJohn Marino typedef typename iterator_traits<_InputIterator>::value_type
113*e4b17023SJohn Marino _ValueType1;
114*e4b17023SJohn Marino typedef typename iterator_traits<_ForwardIterator>::value_type
115*e4b17023SJohn Marino _ValueType2;
116*e4b17023SJohn Marino
117*e4b17023SJohn Marino return std::__uninitialized_copy<(__is_trivial(_ValueType1)
118*e4b17023SJohn Marino && __is_trivial(_ValueType2))>::
119*e4b17023SJohn Marino __uninit_copy(__first, __last, __result);
120*e4b17023SJohn Marino }
121*e4b17023SJohn Marino
122*e4b17023SJohn Marino
123*e4b17023SJohn Marino template<bool _TrivialValueType>
124*e4b17023SJohn Marino struct __uninitialized_fill
125*e4b17023SJohn Marino {
126*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Tp>
127*e4b17023SJohn Marino static void
128*e4b17023SJohn Marino __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
129*e4b17023SJohn Marino const _Tp& __x)
130*e4b17023SJohn Marino {
131*e4b17023SJohn Marino _ForwardIterator __cur = __first;
132*e4b17023SJohn Marino __try
133*e4b17023SJohn Marino {
134*e4b17023SJohn Marino for (; __cur != __last; ++__cur)
135*e4b17023SJohn Marino std::_Construct(std::__addressof(*__cur), __x);
136*e4b17023SJohn Marino }
137*e4b17023SJohn Marino __catch(...)
138*e4b17023SJohn Marino {
139*e4b17023SJohn Marino std::_Destroy(__first, __cur);
140*e4b17023SJohn Marino __throw_exception_again;
141*e4b17023SJohn Marino }
142*e4b17023SJohn Marino }
143*e4b17023SJohn Marino };
144*e4b17023SJohn Marino
145*e4b17023SJohn Marino template<>
146*e4b17023SJohn Marino struct __uninitialized_fill<true>
147*e4b17023SJohn Marino {
148*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Tp>
149*e4b17023SJohn Marino static void
150*e4b17023SJohn Marino __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
151*e4b17023SJohn Marino const _Tp& __x)
152*e4b17023SJohn Marino { std::fill(__first, __last, __x); }
153*e4b17023SJohn Marino };
154*e4b17023SJohn Marino
155*e4b17023SJohn Marino /**
156*e4b17023SJohn Marino * @brief Copies the value x into the range [first,last).
157*e4b17023SJohn Marino * @param __first An input iterator.
158*e4b17023SJohn Marino * @param __last An input iterator.
159*e4b17023SJohn Marino * @param __x The source value.
160*e4b17023SJohn Marino * @return Nothing.
161*e4b17023SJohn Marino *
162*e4b17023SJohn Marino * Like fill(), but does not require an initialized output range.
163*e4b17023SJohn Marino */
164*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Tp>
165*e4b17023SJohn Marino inline void
166*e4b17023SJohn Marino uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
167*e4b17023SJohn Marino const _Tp& __x)
168*e4b17023SJohn Marino {
169*e4b17023SJohn Marino typedef typename iterator_traits<_ForwardIterator>::value_type
170*e4b17023SJohn Marino _ValueType;
171*e4b17023SJohn Marino
172*e4b17023SJohn Marino std::__uninitialized_fill<__is_trivial(_ValueType)>::
173*e4b17023SJohn Marino __uninit_fill(__first, __last, __x);
174*e4b17023SJohn Marino }
175*e4b17023SJohn Marino
176*e4b17023SJohn Marino
177*e4b17023SJohn Marino template<bool _TrivialValueType>
178*e4b17023SJohn Marino struct __uninitialized_fill_n
179*e4b17023SJohn Marino {
180*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size, typename _Tp>
181*e4b17023SJohn Marino static void
182*e4b17023SJohn Marino __uninit_fill_n(_ForwardIterator __first, _Size __n,
183*e4b17023SJohn Marino const _Tp& __x)
184*e4b17023SJohn Marino {
185*e4b17023SJohn Marino _ForwardIterator __cur = __first;
186*e4b17023SJohn Marino __try
187*e4b17023SJohn Marino {
188*e4b17023SJohn Marino for (; __n > 0; --__n, ++__cur)
189*e4b17023SJohn Marino std::_Construct(std::__addressof(*__cur), __x);
190*e4b17023SJohn Marino }
191*e4b17023SJohn Marino __catch(...)
192*e4b17023SJohn Marino {
193*e4b17023SJohn Marino std::_Destroy(__first, __cur);
194*e4b17023SJohn Marino __throw_exception_again;
195*e4b17023SJohn Marino }
196*e4b17023SJohn Marino }
197*e4b17023SJohn Marino };
198*e4b17023SJohn Marino
199*e4b17023SJohn Marino template<>
200*e4b17023SJohn Marino struct __uninitialized_fill_n<true>
201*e4b17023SJohn Marino {
202*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size, typename _Tp>
203*e4b17023SJohn Marino static void
204*e4b17023SJohn Marino __uninit_fill_n(_ForwardIterator __first, _Size __n,
205*e4b17023SJohn Marino const _Tp& __x)
206*e4b17023SJohn Marino { std::fill_n(__first, __n, __x); }
207*e4b17023SJohn Marino };
208*e4b17023SJohn Marino
209*e4b17023SJohn Marino /**
210*e4b17023SJohn Marino * @brief Copies the value x into the range [first,first+n).
211*e4b17023SJohn Marino * @param __first An input iterator.
212*e4b17023SJohn Marino * @param __n The number of copies to make.
213*e4b17023SJohn Marino * @param __x The source value.
214*e4b17023SJohn Marino * @return Nothing.
215*e4b17023SJohn Marino *
216*e4b17023SJohn Marino * Like fill_n(), but does not require an initialized output range.
217*e4b17023SJohn Marino */
218*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size, typename _Tp>
219*e4b17023SJohn Marino inline void
220*e4b17023SJohn Marino uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
221*e4b17023SJohn Marino {
222*e4b17023SJohn Marino typedef typename iterator_traits<_ForwardIterator>::value_type
223*e4b17023SJohn Marino _ValueType;
224*e4b17023SJohn Marino
225*e4b17023SJohn Marino std::__uninitialized_fill_n<__is_trivial(_ValueType)>::
226*e4b17023SJohn Marino __uninit_fill_n(__first, __n, __x);
227*e4b17023SJohn Marino }
228*e4b17023SJohn Marino
229*e4b17023SJohn Marino // Extensions: versions of uninitialized_copy, uninitialized_fill,
230*e4b17023SJohn Marino // and uninitialized_fill_n that take an allocator parameter.
231*e4b17023SJohn Marino // We dispatch back to the standard versions when we're given the
232*e4b17023SJohn Marino // default allocator. For nondefault allocators we do not use
233*e4b17023SJohn Marino // any of the POD optimizations.
234*e4b17023SJohn Marino
235*e4b17023SJohn Marino template<typename _InputIterator, typename _ForwardIterator,
236*e4b17023SJohn Marino typename _Allocator>
237*e4b17023SJohn Marino _ForwardIterator
238*e4b17023SJohn Marino __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
239*e4b17023SJohn Marino _ForwardIterator __result, _Allocator& __alloc)
240*e4b17023SJohn Marino {
241*e4b17023SJohn Marino _ForwardIterator __cur = __result;
242*e4b17023SJohn Marino __try
243*e4b17023SJohn Marino {
244*e4b17023SJohn Marino typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
245*e4b17023SJohn Marino for (; __first != __last; ++__first, ++__cur)
246*e4b17023SJohn Marino __traits::construct(__alloc, std::__addressof(*__cur), *__first);
247*e4b17023SJohn Marino return __cur;
248*e4b17023SJohn Marino }
249*e4b17023SJohn Marino __catch(...)
250*e4b17023SJohn Marino {
251*e4b17023SJohn Marino std::_Destroy(__result, __cur, __alloc);
252*e4b17023SJohn Marino __throw_exception_again;
253*e4b17023SJohn Marino }
254*e4b17023SJohn Marino }
255*e4b17023SJohn Marino
256*e4b17023SJohn Marino template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
257*e4b17023SJohn Marino inline _ForwardIterator
258*e4b17023SJohn Marino __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
259*e4b17023SJohn Marino _ForwardIterator __result, allocator<_Tp>&)
260*e4b17023SJohn Marino { return std::uninitialized_copy(__first, __last, __result); }
261*e4b17023SJohn Marino
262*e4b17023SJohn Marino template<typename _InputIterator, typename _ForwardIterator,
263*e4b17023SJohn Marino typename _Allocator>
264*e4b17023SJohn Marino inline _ForwardIterator
265*e4b17023SJohn Marino __uninitialized_move_a(_InputIterator __first, _InputIterator __last,
266*e4b17023SJohn Marino _ForwardIterator __result, _Allocator& __alloc)
267*e4b17023SJohn Marino {
268*e4b17023SJohn Marino return std::__uninitialized_copy_a(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
269*e4b17023SJohn Marino _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
270*e4b17023SJohn Marino __result, __alloc);
271*e4b17023SJohn Marino }
272*e4b17023SJohn Marino
273*e4b17023SJohn Marino template<typename _InputIterator, typename _ForwardIterator,
274*e4b17023SJohn Marino typename _Allocator>
275*e4b17023SJohn Marino inline _ForwardIterator
276*e4b17023SJohn Marino __uninitialized_move_if_noexcept_a(_InputIterator __first,
277*e4b17023SJohn Marino _InputIterator __last,
278*e4b17023SJohn Marino _ForwardIterator __result,
279*e4b17023SJohn Marino _Allocator& __alloc)
280*e4b17023SJohn Marino {
281*e4b17023SJohn Marino return std::__uninitialized_copy_a
282*e4b17023SJohn Marino (_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__first),
283*e4b17023SJohn Marino _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__last), __result, __alloc);
284*e4b17023SJohn Marino }
285*e4b17023SJohn Marino
286*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Tp, typename _Allocator>
287*e4b17023SJohn Marino void
288*e4b17023SJohn Marino __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
289*e4b17023SJohn Marino const _Tp& __x, _Allocator& __alloc)
290*e4b17023SJohn Marino {
291*e4b17023SJohn Marino _ForwardIterator __cur = __first;
292*e4b17023SJohn Marino __try
293*e4b17023SJohn Marino {
294*e4b17023SJohn Marino typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
295*e4b17023SJohn Marino for (; __cur != __last; ++__cur)
296*e4b17023SJohn Marino __traits::construct(__alloc, std::__addressof(*__cur), __x);
297*e4b17023SJohn Marino }
298*e4b17023SJohn Marino __catch(...)
299*e4b17023SJohn Marino {
300*e4b17023SJohn Marino std::_Destroy(__first, __cur, __alloc);
301*e4b17023SJohn Marino __throw_exception_again;
302*e4b17023SJohn Marino }
303*e4b17023SJohn Marino }
304*e4b17023SJohn Marino
305*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Tp, typename _Tp2>
306*e4b17023SJohn Marino inline void
307*e4b17023SJohn Marino __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
308*e4b17023SJohn Marino const _Tp& __x, allocator<_Tp2>&)
309*e4b17023SJohn Marino { std::uninitialized_fill(__first, __last, __x); }
310*e4b17023SJohn Marino
311*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size, typename _Tp,
312*e4b17023SJohn Marino typename _Allocator>
313*e4b17023SJohn Marino void
314*e4b17023SJohn Marino __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
315*e4b17023SJohn Marino const _Tp& __x, _Allocator& __alloc)
316*e4b17023SJohn Marino {
317*e4b17023SJohn Marino _ForwardIterator __cur = __first;
318*e4b17023SJohn Marino __try
319*e4b17023SJohn Marino {
320*e4b17023SJohn Marino typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
321*e4b17023SJohn Marino for (; __n > 0; --__n, ++__cur)
322*e4b17023SJohn Marino __traits::construct(__alloc, std::__addressof(*__cur), __x);
323*e4b17023SJohn Marino }
324*e4b17023SJohn Marino __catch(...)
325*e4b17023SJohn Marino {
326*e4b17023SJohn Marino std::_Destroy(__first, __cur, __alloc);
327*e4b17023SJohn Marino __throw_exception_again;
328*e4b17023SJohn Marino }
329*e4b17023SJohn Marino }
330*e4b17023SJohn Marino
331*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size, typename _Tp,
332*e4b17023SJohn Marino typename _Tp2>
333*e4b17023SJohn Marino inline void
334*e4b17023SJohn Marino __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
335*e4b17023SJohn Marino const _Tp& __x, allocator<_Tp2>&)
336*e4b17023SJohn Marino { std::uninitialized_fill_n(__first, __n, __x); }
337*e4b17023SJohn Marino
338*e4b17023SJohn Marino
339*e4b17023SJohn Marino // Extensions: __uninitialized_copy_move, __uninitialized_move_copy,
340*e4b17023SJohn Marino // __uninitialized_fill_move, __uninitialized_move_fill.
341*e4b17023SJohn Marino // All of these algorithms take a user-supplied allocator, which is used
342*e4b17023SJohn Marino // for construction and destruction.
343*e4b17023SJohn Marino
344*e4b17023SJohn Marino // __uninitialized_copy_move
345*e4b17023SJohn Marino // Copies [first1, last1) into [result, result + (last1 - first1)), and
346*e4b17023SJohn Marino // move [first2, last2) into
347*e4b17023SJohn Marino // [result, result + (last1 - first1) + (last2 - first2)).
348*e4b17023SJohn Marino template<typename _InputIterator1, typename _InputIterator2,
349*e4b17023SJohn Marino typename _ForwardIterator, typename _Allocator>
350*e4b17023SJohn Marino inline _ForwardIterator
351*e4b17023SJohn Marino __uninitialized_copy_move(_InputIterator1 __first1,
352*e4b17023SJohn Marino _InputIterator1 __last1,
353*e4b17023SJohn Marino _InputIterator2 __first2,
354*e4b17023SJohn Marino _InputIterator2 __last2,
355*e4b17023SJohn Marino _ForwardIterator __result,
356*e4b17023SJohn Marino _Allocator& __alloc)
357*e4b17023SJohn Marino {
358*e4b17023SJohn Marino _ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
359*e4b17023SJohn Marino __result,
360*e4b17023SJohn Marino __alloc);
361*e4b17023SJohn Marino __try
362*e4b17023SJohn Marino {
363*e4b17023SJohn Marino return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
364*e4b17023SJohn Marino }
365*e4b17023SJohn Marino __catch(...)
366*e4b17023SJohn Marino {
367*e4b17023SJohn Marino std::_Destroy(__result, __mid, __alloc);
368*e4b17023SJohn Marino __throw_exception_again;
369*e4b17023SJohn Marino }
370*e4b17023SJohn Marino }
371*e4b17023SJohn Marino
372*e4b17023SJohn Marino // __uninitialized_move_copy
373*e4b17023SJohn Marino // Moves [first1, last1) into [result, result + (last1 - first1)), and
374*e4b17023SJohn Marino // copies [first2, last2) into
375*e4b17023SJohn Marino // [result, result + (last1 - first1) + (last2 - first2)).
376*e4b17023SJohn Marino template<typename _InputIterator1, typename _InputIterator2,
377*e4b17023SJohn Marino typename _ForwardIterator, typename _Allocator>
378*e4b17023SJohn Marino inline _ForwardIterator
379*e4b17023SJohn Marino __uninitialized_move_copy(_InputIterator1 __first1,
380*e4b17023SJohn Marino _InputIterator1 __last1,
381*e4b17023SJohn Marino _InputIterator2 __first2,
382*e4b17023SJohn Marino _InputIterator2 __last2,
383*e4b17023SJohn Marino _ForwardIterator __result,
384*e4b17023SJohn Marino _Allocator& __alloc)
385*e4b17023SJohn Marino {
386*e4b17023SJohn Marino _ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
387*e4b17023SJohn Marino __result,
388*e4b17023SJohn Marino __alloc);
389*e4b17023SJohn Marino __try
390*e4b17023SJohn Marino {
391*e4b17023SJohn Marino return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
392*e4b17023SJohn Marino }
393*e4b17023SJohn Marino __catch(...)
394*e4b17023SJohn Marino {
395*e4b17023SJohn Marino std::_Destroy(__result, __mid, __alloc);
396*e4b17023SJohn Marino __throw_exception_again;
397*e4b17023SJohn Marino }
398*e4b17023SJohn Marino }
399*e4b17023SJohn Marino
400*e4b17023SJohn Marino // __uninitialized_fill_move
401*e4b17023SJohn Marino // Fills [result, mid) with x, and moves [first, last) into
402*e4b17023SJohn Marino // [mid, mid + (last - first)).
403*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
404*e4b17023SJohn Marino typename _Allocator>
405*e4b17023SJohn Marino inline _ForwardIterator
406*e4b17023SJohn Marino __uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
407*e4b17023SJohn Marino const _Tp& __x, _InputIterator __first,
408*e4b17023SJohn Marino _InputIterator __last, _Allocator& __alloc)
409*e4b17023SJohn Marino {
410*e4b17023SJohn Marino std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
411*e4b17023SJohn Marino __try
412*e4b17023SJohn Marino {
413*e4b17023SJohn Marino return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
414*e4b17023SJohn Marino }
415*e4b17023SJohn Marino __catch(...)
416*e4b17023SJohn Marino {
417*e4b17023SJohn Marino std::_Destroy(__result, __mid, __alloc);
418*e4b17023SJohn Marino __throw_exception_again;
419*e4b17023SJohn Marino }
420*e4b17023SJohn Marino }
421*e4b17023SJohn Marino
422*e4b17023SJohn Marino // __uninitialized_move_fill
423*e4b17023SJohn Marino // Moves [first1, last1) into [first2, first2 + (last1 - first1)), and
424*e4b17023SJohn Marino // fills [first2 + (last1 - first1), last2) with x.
425*e4b17023SJohn Marino template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
426*e4b17023SJohn Marino typename _Allocator>
427*e4b17023SJohn Marino inline void
428*e4b17023SJohn Marino __uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
429*e4b17023SJohn Marino _ForwardIterator __first2,
430*e4b17023SJohn Marino _ForwardIterator __last2, const _Tp& __x,
431*e4b17023SJohn Marino _Allocator& __alloc)
432*e4b17023SJohn Marino {
433*e4b17023SJohn Marino _ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
434*e4b17023SJohn Marino __first2,
435*e4b17023SJohn Marino __alloc);
436*e4b17023SJohn Marino __try
437*e4b17023SJohn Marino {
438*e4b17023SJohn Marino std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
439*e4b17023SJohn Marino }
440*e4b17023SJohn Marino __catch(...)
441*e4b17023SJohn Marino {
442*e4b17023SJohn Marino std::_Destroy(__first2, __mid2, __alloc);
443*e4b17023SJohn Marino __throw_exception_again;
444*e4b17023SJohn Marino }
445*e4b17023SJohn Marino }
446*e4b17023SJohn Marino
447*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
448*e4b17023SJohn Marino // Extensions: __uninitialized_default, __uninitialized_default_n,
449*e4b17023SJohn Marino // __uninitialized_default_a, __uninitialized_default_n_a.
450*e4b17023SJohn Marino
451*e4b17023SJohn Marino template<bool _TrivialValueType>
452*e4b17023SJohn Marino struct __uninitialized_default_1
453*e4b17023SJohn Marino {
454*e4b17023SJohn Marino template<typename _ForwardIterator>
455*e4b17023SJohn Marino static void
456*e4b17023SJohn Marino __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
457*e4b17023SJohn Marino {
458*e4b17023SJohn Marino _ForwardIterator __cur = __first;
459*e4b17023SJohn Marino __try
460*e4b17023SJohn Marino {
461*e4b17023SJohn Marino for (; __cur != __last; ++__cur)
462*e4b17023SJohn Marino std::_Construct(std::__addressof(*__cur));
463*e4b17023SJohn Marino }
464*e4b17023SJohn Marino __catch(...)
465*e4b17023SJohn Marino {
466*e4b17023SJohn Marino std::_Destroy(__first, __cur);
467*e4b17023SJohn Marino __throw_exception_again;
468*e4b17023SJohn Marino }
469*e4b17023SJohn Marino }
470*e4b17023SJohn Marino };
471*e4b17023SJohn Marino
472*e4b17023SJohn Marino template<>
473*e4b17023SJohn Marino struct __uninitialized_default_1<true>
474*e4b17023SJohn Marino {
475*e4b17023SJohn Marino template<typename _ForwardIterator>
476*e4b17023SJohn Marino static void
477*e4b17023SJohn Marino __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
478*e4b17023SJohn Marino {
479*e4b17023SJohn Marino typedef typename iterator_traits<_ForwardIterator>::value_type
480*e4b17023SJohn Marino _ValueType;
481*e4b17023SJohn Marino
482*e4b17023SJohn Marino std::fill(__first, __last, _ValueType());
483*e4b17023SJohn Marino }
484*e4b17023SJohn Marino };
485*e4b17023SJohn Marino
486*e4b17023SJohn Marino template<bool _TrivialValueType>
487*e4b17023SJohn Marino struct __uninitialized_default_n_1
488*e4b17023SJohn Marino {
489*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size>
490*e4b17023SJohn Marino static void
491*e4b17023SJohn Marino __uninit_default_n(_ForwardIterator __first, _Size __n)
492*e4b17023SJohn Marino {
493*e4b17023SJohn Marino _ForwardIterator __cur = __first;
494*e4b17023SJohn Marino __try
495*e4b17023SJohn Marino {
496*e4b17023SJohn Marino for (; __n > 0; --__n, ++__cur)
497*e4b17023SJohn Marino std::_Construct(std::__addressof(*__cur));
498*e4b17023SJohn Marino }
499*e4b17023SJohn Marino __catch(...)
500*e4b17023SJohn Marino {
501*e4b17023SJohn Marino std::_Destroy(__first, __cur);
502*e4b17023SJohn Marino __throw_exception_again;
503*e4b17023SJohn Marino }
504*e4b17023SJohn Marino }
505*e4b17023SJohn Marino };
506*e4b17023SJohn Marino
507*e4b17023SJohn Marino template<>
508*e4b17023SJohn Marino struct __uninitialized_default_n_1<true>
509*e4b17023SJohn Marino {
510*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size>
511*e4b17023SJohn Marino static void
512*e4b17023SJohn Marino __uninit_default_n(_ForwardIterator __first, _Size __n)
513*e4b17023SJohn Marino {
514*e4b17023SJohn Marino typedef typename iterator_traits<_ForwardIterator>::value_type
515*e4b17023SJohn Marino _ValueType;
516*e4b17023SJohn Marino
517*e4b17023SJohn Marino std::fill_n(__first, __n, _ValueType());
518*e4b17023SJohn Marino }
519*e4b17023SJohn Marino };
520*e4b17023SJohn Marino
521*e4b17023SJohn Marino // __uninitialized_default
522*e4b17023SJohn Marino // Fills [first, last) with std::distance(first, last) default
523*e4b17023SJohn Marino // constructed value_types(s).
524*e4b17023SJohn Marino template<typename _ForwardIterator>
525*e4b17023SJohn Marino inline void
526*e4b17023SJohn Marino __uninitialized_default(_ForwardIterator __first,
527*e4b17023SJohn Marino _ForwardIterator __last)
528*e4b17023SJohn Marino {
529*e4b17023SJohn Marino typedef typename iterator_traits<_ForwardIterator>::value_type
530*e4b17023SJohn Marino _ValueType;
531*e4b17023SJohn Marino
532*e4b17023SJohn Marino std::__uninitialized_default_1<__is_trivial(_ValueType)>::
533*e4b17023SJohn Marino __uninit_default(__first, __last);
534*e4b17023SJohn Marino }
535*e4b17023SJohn Marino
536*e4b17023SJohn Marino // __uninitialized_default_n
537*e4b17023SJohn Marino // Fills [first, first + n) with n default constructed value_type(s).
538*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size>
539*e4b17023SJohn Marino inline void
540*e4b17023SJohn Marino __uninitialized_default_n(_ForwardIterator __first, _Size __n)
541*e4b17023SJohn Marino {
542*e4b17023SJohn Marino typedef typename iterator_traits<_ForwardIterator>::value_type
543*e4b17023SJohn Marino _ValueType;
544*e4b17023SJohn Marino
545*e4b17023SJohn Marino std::__uninitialized_default_n_1<__is_trivial(_ValueType)>::
546*e4b17023SJohn Marino __uninit_default_n(__first, __n);
547*e4b17023SJohn Marino }
548*e4b17023SJohn Marino
549*e4b17023SJohn Marino
550*e4b17023SJohn Marino // __uninitialized_default_a
551*e4b17023SJohn Marino // Fills [first, last) with std::distance(first, last) default
552*e4b17023SJohn Marino // constructed value_types(s), constructed with the allocator alloc.
553*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Allocator>
554*e4b17023SJohn Marino void
555*e4b17023SJohn Marino __uninitialized_default_a(_ForwardIterator __first,
556*e4b17023SJohn Marino _ForwardIterator __last,
557*e4b17023SJohn Marino _Allocator& __alloc)
558*e4b17023SJohn Marino {
559*e4b17023SJohn Marino _ForwardIterator __cur = __first;
560*e4b17023SJohn Marino __try
561*e4b17023SJohn Marino {
562*e4b17023SJohn Marino typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
563*e4b17023SJohn Marino for (; __cur != __last; ++__cur)
564*e4b17023SJohn Marino __traits::construct(__alloc, std::__addressof(*__cur));
565*e4b17023SJohn Marino }
566*e4b17023SJohn Marino __catch(...)
567*e4b17023SJohn Marino {
568*e4b17023SJohn Marino std::_Destroy(__first, __cur, __alloc);
569*e4b17023SJohn Marino __throw_exception_again;
570*e4b17023SJohn Marino }
571*e4b17023SJohn Marino }
572*e4b17023SJohn Marino
573*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Tp>
574*e4b17023SJohn Marino inline void
575*e4b17023SJohn Marino __uninitialized_default_a(_ForwardIterator __first,
576*e4b17023SJohn Marino _ForwardIterator __last,
577*e4b17023SJohn Marino allocator<_Tp>&)
578*e4b17023SJohn Marino { std::__uninitialized_default(__first, __last); }
579*e4b17023SJohn Marino
580*e4b17023SJohn Marino
581*e4b17023SJohn Marino // __uninitialized_default_n_a
582*e4b17023SJohn Marino // Fills [first, first + n) with n default constructed value_types(s),
583*e4b17023SJohn Marino // constructed with the allocator alloc.
584*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size, typename _Allocator>
585*e4b17023SJohn Marino void
586*e4b17023SJohn Marino __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
587*e4b17023SJohn Marino _Allocator& __alloc)
588*e4b17023SJohn Marino {
589*e4b17023SJohn Marino _ForwardIterator __cur = __first;
590*e4b17023SJohn Marino __try
591*e4b17023SJohn Marino {
592*e4b17023SJohn Marino typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
593*e4b17023SJohn Marino for (; __n > 0; --__n, ++__cur)
594*e4b17023SJohn Marino __traits::construct(__alloc, std::__addressof(*__cur));
595*e4b17023SJohn Marino }
596*e4b17023SJohn Marino __catch(...)
597*e4b17023SJohn Marino {
598*e4b17023SJohn Marino std::_Destroy(__first, __cur, __alloc);
599*e4b17023SJohn Marino __throw_exception_again;
600*e4b17023SJohn Marino }
601*e4b17023SJohn Marino }
602*e4b17023SJohn Marino
603*e4b17023SJohn Marino template<typename _ForwardIterator, typename _Size, typename _Tp>
604*e4b17023SJohn Marino inline void
605*e4b17023SJohn Marino __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
606*e4b17023SJohn Marino allocator<_Tp>&)
607*e4b17023SJohn Marino { std::__uninitialized_default_n(__first, __n); }
608*e4b17023SJohn Marino
609*e4b17023SJohn Marino
610*e4b17023SJohn Marino template<typename _InputIterator, typename _Size,
611*e4b17023SJohn Marino typename _ForwardIterator>
612*e4b17023SJohn Marino _ForwardIterator
613*e4b17023SJohn Marino __uninitialized_copy_n(_InputIterator __first, _Size __n,
614*e4b17023SJohn Marino _ForwardIterator __result, input_iterator_tag)
615*e4b17023SJohn Marino {
616*e4b17023SJohn Marino _ForwardIterator __cur = __result;
617*e4b17023SJohn Marino __try
618*e4b17023SJohn Marino {
619*e4b17023SJohn Marino for (; __n > 0; --__n, ++__first, ++__cur)
620*e4b17023SJohn Marino std::_Construct(std::__addressof(*__cur), *__first);
621*e4b17023SJohn Marino return __cur;
622*e4b17023SJohn Marino }
623*e4b17023SJohn Marino __catch(...)
624*e4b17023SJohn Marino {
625*e4b17023SJohn Marino std::_Destroy(__result, __cur);
626*e4b17023SJohn Marino __throw_exception_again;
627*e4b17023SJohn Marino }
628*e4b17023SJohn Marino }
629*e4b17023SJohn Marino
630*e4b17023SJohn Marino template<typename _RandomAccessIterator, typename _Size,
631*e4b17023SJohn Marino typename _ForwardIterator>
632*e4b17023SJohn Marino inline _ForwardIterator
633*e4b17023SJohn Marino __uninitialized_copy_n(_RandomAccessIterator __first, _Size __n,
634*e4b17023SJohn Marino _ForwardIterator __result,
635*e4b17023SJohn Marino random_access_iterator_tag)
636*e4b17023SJohn Marino { return std::uninitialized_copy(__first, __first + __n, __result); }
637*e4b17023SJohn Marino
638*e4b17023SJohn Marino /**
639*e4b17023SJohn Marino * @brief Copies the range [first,first+n) into result.
640*e4b17023SJohn Marino * @param __first An input iterator.
641*e4b17023SJohn Marino * @param __n The number of elements to copy.
642*e4b17023SJohn Marino * @param __result An output iterator.
643*e4b17023SJohn Marino * @return __result + __n
644*e4b17023SJohn Marino *
645*e4b17023SJohn Marino * Like copy_n(), but does not require an initialized output range.
646*e4b17023SJohn Marino */
647*e4b17023SJohn Marino template<typename _InputIterator, typename _Size, typename _ForwardIterator>
648*e4b17023SJohn Marino inline _ForwardIterator
649*e4b17023SJohn Marino uninitialized_copy_n(_InputIterator __first, _Size __n,
650*e4b17023SJohn Marino _ForwardIterator __result)
651*e4b17023SJohn Marino { return std::__uninitialized_copy_n(__first, __n, __result,
652*e4b17023SJohn Marino std::__iterator_category(__first)); }
653*e4b17023SJohn Marino #endif
654*e4b17023SJohn Marino
655*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION
656*e4b17023SJohn Marino } // namespace
657*e4b17023SJohn Marino
658*e4b17023SJohn Marino #endif /* _STL_UNINITIALIZED_H */
659