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