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