xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/bits/stl_uninitialized.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
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