111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Raw memory manipulators -*- C++ -*-
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 2001-2014 Free Software Foundation, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library.  This library is free
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option)
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful,
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details.
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program;
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1994
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Hewlett-Packard Company
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use, copy, modify, distribute and sell this software
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * and its documentation for any purpose is hereby granted without fee,
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided that the above copyright notice appear in all copies and
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * that both that copyright notice and this permission notice appear
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in supporting documentation.  Hewlett-Packard Company makes no
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * representations about the suitability of this software for any
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * purpose.  It is provided "as is" without express or implied warranty.
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1996,1997
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc.
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use, copy, modify, distribute and sell this software
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * and its documentation for any purpose is hereby granted without fee,
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided that the above copyright notice appear in all copies and
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * that both that copyright notice and this permission notice appear
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in supporting documentation.  Silicon Graphics makes no
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * representations about the suitability of this software for any
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * purpose.  It is provided "as is" without express or implied warranty.
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** @file bits/stl_uninitialized.h
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  This is an internal header file, included by other library headers.
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  Do not attempt to use it directly. @headername{memory}
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STL_UNINITIALIZED_H
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STL_UNINITIALIZED_H 1
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<bool _TrivialValueTypes>
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_copy
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _InputIterator, typename _ForwardIterator>
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static _ForwardIterator
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_copy(_InputIterator __first, _InputIterator __last,
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      _ForwardIterator __result)
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _ForwardIterator __cur = __result;
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __try
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      for (; __first != __last; ++__first, ++__cur)
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		std::_Construct(std::__addressof(*__cur), *__first);
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      return __cur;
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __catch(...)
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::_Destroy(__result, __cur);
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      __throw_exception_again;
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_copy<true>
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _InputIterator, typename _ForwardIterator>
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static _ForwardIterator
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_copy(_InputIterator __first, _InputIterator __last,
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      _ForwardIterator __result)
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { return std::copy(__first, __last, __result); }
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief Copies the range [first,last) into result.
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __first  An input iterator.
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __last   An input iterator.
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __result An output iterator.
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @return   __result + (__first - __last)
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Like copy(), but does not require an initialized output range.
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator, typename _ForwardIterator>
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _ForwardIterator
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    uninitialized_copy(_InputIterator __first, _InputIterator __last,
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		       _ForwardIterator __result)
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename iterator_traits<_InputIterator>::value_type
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_ValueType1;
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename iterator_traits<_ForwardIterator>::value_type
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_ValueType2;
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus < 201103L
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const bool __assignable = true;
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // trivial types can have deleted assignment
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename iterator_traits<_InputIterator>::reference _RefType1;
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename iterator_traits<_ForwardIterator>::reference _RefType2;
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const bool __assignable = is_assignable<_RefType2, _RefType1>::value;
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return std::__uninitialized_copy<__is_trivial(_ValueType1)
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				       && __is_trivial(_ValueType2)
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				       && __assignable>::
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__uninit_copy(__first, __last, __result);
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<bool _TrivialValueType>
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_fill
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator, typename _Tp>
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static void
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      const _Tp& __x)
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _ForwardIterator __cur = __first;
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __try
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      for (; __cur != __last; ++__cur)
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		std::_Construct(std::__addressof(*__cur), __x);
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __catch(...)
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::_Destroy(__first, __cur);
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      __throw_exception_again;
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_fill<true>
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator, typename _Tp>
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static void
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      const _Tp& __x)
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { std::fill(__first, __last, __x); }
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief Copies the value x into the range [first,last).
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __first  An input iterator.
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __last   An input iterator.
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __x      The source value.
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @return   Nothing.
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Like fill(), but does not require an initialized output range.
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Tp>
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		       const _Tp& __x)
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename iterator_traits<_ForwardIterator>::value_type
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_ValueType;
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus < 201103L
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const bool __assignable = true;
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // trivial types can have deleted assignment
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const bool __assignable = is_copy_assignable<_ValueType>::value;
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__uninitialized_fill<__is_trivial(_ValueType) && __assignable>::
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__uninit_fill(__first, __last, __x);
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<bool _TrivialValueType>
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_fill_n
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator, typename _Size, typename _Tp>
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static void
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_fill_n(_ForwardIterator __first, _Size __n,
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const _Tp& __x)
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _ForwardIterator __cur = __first;
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __try
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      for (; __n > 0; --__n, ++__cur)
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		std::_Construct(std::__addressof(*__cur), __x);
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __catch(...)
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::_Destroy(__first, __cur);
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      __throw_exception_again;
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_fill_n<true>
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator, typename _Size, typename _Tp>
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static void
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_fill_n(_ForwardIterator __first, _Size __n,
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			const _Tp& __x)
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        { std::fill_n(__first, __n, __x); }
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief Copies the value x into the range [first,first+n).
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __first  An input iterator.
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __n      The number of copies to make.
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __x      The source value.
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @return   Nothing.
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Like fill_n(), but does not require an initialized output range.
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Size, typename _Tp>
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename iterator_traits<_ForwardIterator>::value_type
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_ValueType;
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus < 201103L
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const bool __assignable = true;
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // trivial types can have deleted assignment
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const bool __assignable = is_copy_assignable<_ValueType>::value;
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__uninitialized_fill_n<__is_trivial(_ValueType) && __assignable>::
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__uninit_fill_n(__first, __n, __x);
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Extensions: versions of uninitialized_copy, uninitialized_fill,
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  and uninitialized_fill_n that take an allocator parameter.
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  We dispatch back to the standard versions when we're given the
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  default allocator.  For nondefault allocators we do not use
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  any of the POD optimizations.
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator, typename _ForwardIterator,
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _Allocator>
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _ForwardIterator
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _ForwardIterator __result, _Allocator& __alloc)
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ForwardIterator __cur = __result;
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  for (; __first != __last; ++__first, ++__cur)
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __traits::construct(__alloc, std::__addressof(*__cur), *__first);
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return __cur;
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__result, __cur, __alloc);
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _ForwardIterator
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _ForwardIterator __result, allocator<_Tp>&)
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::uninitialized_copy(__first, __last, __result); }
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator, typename _ForwardIterator,
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _Allocator>
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _ForwardIterator
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_move_a(_InputIterator __first, _InputIterator __last,
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _ForwardIterator __result, _Allocator& __alloc)
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return std::__uninitialized_copy_a(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					 __result, __alloc);
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator, typename _ForwardIterator,
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _Allocator>
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _ForwardIterator
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_move_if_noexcept_a(_InputIterator __first,
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				       _InputIterator __last,
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				       _ForwardIterator __result,
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				       _Allocator& __alloc)
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return std::__uninitialized_copy_a
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__first),
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(__last), __result, __alloc);
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Tp, typename _Allocator>
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   const _Tp& __x, _Allocator& __alloc)
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ForwardIterator __cur = __first;
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  for (; __cur != __last; ++__cur)
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __traits::construct(__alloc, std::__addressof(*__cur), __x);
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__first, __cur, __alloc);
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Tp, typename _Tp2>
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   const _Tp& __x, allocator<_Tp2>&)
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { std::uninitialized_fill(__first, __last, __x); }
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Size, typename _Tp,
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _Allocator>
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			     const _Tp& __x, _Allocator& __alloc)
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ForwardIterator __cur = __first;
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  for (; __n > 0; --__n, ++__cur)
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __traits::construct(__alloc, std::__addressof(*__cur), __x);
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__first, __cur, __alloc);
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Size, typename _Tp,
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _Tp2>
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			     const _Tp& __x, allocator<_Tp2>&)
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { std::uninitialized_fill_n(__first, __n, __x); }
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Extensions: __uninitialized_copy_move, __uninitialized_move_copy,
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_fill_move, __uninitialized_move_fill.
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // All of these algorithms take a user-supplied allocator, which is used
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // for construction and destruction.
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_copy_move
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Copies [first1, last1) into [result, result + (last1 - first1)), and
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  move [first2, last2) into
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  [result, result + (last1 - first1) + (last2 - first2)).
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator1, typename _InputIterator2,
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _ForwardIterator, typename _Allocator>
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _ForwardIterator
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_copy_move(_InputIterator1 __first1,
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _InputIterator1 __last1,
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _InputIterator2 __first2,
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _InputIterator2 __last2,
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _ForwardIterator __result,
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _Allocator& __alloc)
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert							   __result,
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert							   __alloc);
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return std::__uninitialized_move_a(__first2, __last2, __mid, __alloc);
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__result, __mid, __alloc);
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_move_copy
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Moves [first1, last1) into [result, result + (last1 - first1)), and
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  copies [first2, last2) into
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  [result, result + (last1 - first1) + (last2 - first2)).
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator1, typename _InputIterator2,
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _ForwardIterator, typename _Allocator>
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _ForwardIterator
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_move_copy(_InputIterator1 __first1,
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _InputIterator1 __last1,
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _InputIterator2 __first2,
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _InputIterator2 __last2,
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _ForwardIterator __result,
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _Allocator& __alloc)
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ForwardIterator __mid = std::__uninitialized_move_a(__first1, __last1,
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert							   __result,
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert							   __alloc);
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__result, __mid, __alloc);
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_fill_move
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Fills [result, mid) with x, and moves [first, last) into
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  [mid, mid + (last - first)).
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _Allocator>
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _ForwardIterator
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_fill_move(_ForwardIterator __result, _ForwardIterator __mid,
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      const _Tp& __x, _InputIterator __first,
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _InputIterator __last, _Allocator& __alloc)
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return std::__uninitialized_move_a(__first, __last, __mid, __alloc);
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__result, __mid, __alloc);
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_move_fill
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Moves [first1, last1) into [first2, first2 + (last1 - first1)), and
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //  fills [first2 + (last1 - first1), last2) with x.
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _Allocator>
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_move_fill(_InputIterator __first1, _InputIterator __last1,
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _ForwardIterator __first2,
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _ForwardIterator __last2, const _Tp& __x,
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _Allocator& __alloc)
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ForwardIterator __mid2 = std::__uninitialized_move_a(__first1, __last1,
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert							    __first2,
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert							    __alloc);
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__first2, __mid2, __alloc);
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Extensions: __uninitialized_default, __uninitialized_default_n,
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_default_a, __uninitialized_default_n_a.
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<bool _TrivialValueType>
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_default_1
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator>
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static void
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _ForwardIterator __cur = __first;
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __try
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      for (; __cur != __last; ++__cur)
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		std::_Construct(std::__addressof(*__cur));
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __catch(...)
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::_Destroy(__first, __cur);
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      __throw_exception_again;
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_default_1<true>
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator>
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static void
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_default(_ForwardIterator __first, _ForwardIterator __last)
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef typename iterator_traits<_ForwardIterator>::value_type
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    _ValueType;
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::fill(__first, __last, _ValueType());
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<bool _TrivialValueType>
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_default_n_1
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator, typename _Size>
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static void
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_default_n(_ForwardIterator __first, _Size __n)
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _ForwardIterator __cur = __first;
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __try
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      for (; __n > 0; --__n, ++__cur)
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		std::_Construct(std::__addressof(*__cur));
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __catch(...)
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::_Destroy(__first, __cur);
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      __throw_exception_again;
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __uninitialized_default_n_1<true>
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<typename _ForwardIterator, typename _Size>
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static void
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __uninit_default_n(_ForwardIterator __first, _Size __n)
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef typename iterator_traits<_ForwardIterator>::value_type
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    _ValueType;
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::fill_n(__first, __n, _ValueType());
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_default
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Fills [first, last) with std::distance(first, last) default
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // constructed value_types(s).
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator>
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_default(_ForwardIterator __first,
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			    _ForwardIterator __last)
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename iterator_traits<_ForwardIterator>::value_type
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_ValueType;
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // trivial types can have deleted assignment
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const bool __assignable = is_copy_assignable<_ValueType>::value;
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__uninitialized_default_1<__is_trivial(_ValueType)
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				     && __assignable>::
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__uninit_default(__first, __last);
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_default_n
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Fills [first, first + n) with n default constructed value_type(s).
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Size>
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_default_n(_ForwardIterator __first, _Size __n)
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename iterator_traits<_ForwardIterator>::value_type
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_ValueType;
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // trivial types can have deleted assignment
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const bool __assignable = is_copy_assignable<_ValueType>::value;
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__uninitialized_default_n_1<__is_trivial(_ValueType)
57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				       && __assignable>::
57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__uninit_default_n(__first, __n);
57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_default_a
57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Fills [first, last) with std::distance(first, last) default
57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // constructed value_types(s), constructed with the allocator alloc.
57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Allocator>
57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_default_a(_ForwardIterator __first,
58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _ForwardIterator __last,
58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _Allocator& __alloc)
58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ForwardIterator __cur = __first;
58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  for (; __cur != __last; ++__cur)
58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __traits::construct(__alloc, std::__addressof(*__cur));
59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__first, __cur, __alloc);
59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Tp>
59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_default_a(_ForwardIterator __first,
60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      _ForwardIterator __last,
60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			      allocator<_Tp>&)
60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { std::__uninitialized_default(__first, __last); }
60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // __uninitialized_default_n_a
60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Fills [first, first + n) with n default constructed value_types(s),
60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // constructed with the allocator alloc.
60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Size, typename _Allocator>
61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				_Allocator& __alloc)
61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ForwardIterator __cur = __first;
61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  for (; __n > 0; --__n, ++__cur)
61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __traits::construct(__alloc, std::__addressof(*__cur));
62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__first, __cur, __alloc);
62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _ForwardIterator, typename _Size, typename _Tp>
62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				allocator<_Tp>&)
63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { std::__uninitialized_default_n(__first, __n); }
63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator, typename _Size,
63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _ForwardIterator>
63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _ForwardIterator
63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_copy_n(_InputIterator __first, _Size __n,
63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _ForwardIterator __result, input_iterator_tag)
64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ForwardIterator __cur = __result;
64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __try
64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  for (; __n > 0; --__n, ++__first, ++__cur)
64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    std::_Construct(std::__addressof(*__cur), *__first);
64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return __cur;
64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __catch(...)
64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::_Destroy(__result, __cur);
65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_exception_again;
65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _RandomAccessIterator, typename _Size,
65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   typename _ForwardIterator>
65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _ForwardIterator
65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __uninitialized_copy_n(_RandomAccessIterator __first, _Size __n,
65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _ForwardIterator __result,
66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   random_access_iterator_tag)
66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::uninitialized_copy(__first, __first + __n, __result); }
66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief Copies the range [first,first+n) into result.
66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __first  An input iterator.
66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __n      The number of elements to copy.
66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __result An output iterator.
66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @return  __result + __n
66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  Like copy_n(), but does not require an initialized output range.
67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _InputIterator, typename _Size, typename _ForwardIterator>
67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _ForwardIterator
67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    uninitialized_copy_n(_InputIterator __first, _Size __n,
67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			 _ForwardIterator __result)
67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::__uninitialized_copy_n(__first, __n, __result,
67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					 std::__iterator_category(__first)); }
67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace
68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STL_UNINITIALIZED_H */
684