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