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