Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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