LCOV - code coverage report
Current view: top level - bits - stl_uninitialized.h (source / functions) Hit Total Coverage
Test: stap.info Lines: 29 34 85.3 %
Date: 2013-03-08 Functions: 268 301 89.0 %
Branches: 41 138 29.7 %

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

Generated by: LCOV version 1.9