00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00061 #ifndef _STL_UNINITIALIZED_H
00062 #define _STL_UNINITIALIZED_H 1
00063 
00064 #include <cstring>
00065 
00066 namespace std
00067 {
00068   
00069   template<typename _InputIterator, typename _ForwardIterator>
00070     inline _ForwardIterator
00071     __uninitialized_copy_aux(_InputIterator __first, _InputIterator __last,
00072                  _ForwardIterator __result,
00073                  __true_type)
00074     { return std::copy(__first, __last, __result); }
00075 
00076   template<typename _InputIterator, typename _ForwardIterator>
00077     inline _ForwardIterator
00078     __uninitialized_copy_aux(_InputIterator __first, _InputIterator __last,
00079                  _ForwardIterator __result,
00080                  __false_type)
00081     {
00082       _ForwardIterator __cur = __result;
00083       try
00084     {
00085       for (; __first != __last; ++__first, ++__cur)
00086         std::_Construct(&*__cur, *__first);
00087       return __cur;
00088     }
00089       catch(...)
00090     {
00091       std::_Destroy(__result, __cur);
00092       __throw_exception_again;
00093     }
00094     }
00095 
00105   template<typename _InputIterator, typename _ForwardIterator>
00106     inline _ForwardIterator
00107     uninitialized_copy(_InputIterator __first, _InputIterator __last,
00108                _ForwardIterator __result)
00109     {
00110       typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
00111       typedef typename std::__is_scalar<_ValueType>::__type _Is_POD;
00112       return std::__uninitialized_copy_aux(__first, __last, __result,
00113                        _Is_POD());
00114     }
00115 
00116   inline char*
00117   uninitialized_copy(const char* __first, const char* __last, char* __result)
00118   {
00119     std::memmove(__result, __first, __last - __first);
00120     return __result + (__last - __first);
00121   }
00122 
00123   inline wchar_t*
00124   uninitialized_copy(const wchar_t* __first, const wchar_t* __last,
00125              wchar_t* __result)
00126   {
00127     std::memmove(__result, __first, sizeof(wchar_t) * (__last - __first));
00128     return __result + (__last - __first);
00129   }
00130 
00131   
00132   
00133   template<typename _ForwardIterator, typename _Tp>
00134     inline void
00135     __uninitialized_fill_aux(_ForwardIterator __first,
00136                  _ForwardIterator __last,
00137                  const _Tp& __x, __true_type)
00138     { std::fill(__first, __last, __x); }
00139 
00140   template<typename _ForwardIterator, typename _Tp>
00141     void
00142     __uninitialized_fill_aux(_ForwardIterator __first, _ForwardIterator __last,
00143                  const _Tp& __x, __false_type)
00144     {
00145       _ForwardIterator __cur = __first;
00146       try
00147     {
00148       for (; __cur != __last; ++__cur)
00149         std::_Construct(&*__cur, __x);
00150     }
00151       catch(...)
00152     {
00153       std::_Destroy(__first, __cur);
00154       __throw_exception_again;
00155     }
00156     }
00157 
00167   template<typename _ForwardIterator, typename _Tp>
00168     inline void
00169     uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,
00170                const _Tp& __x)
00171     {
00172       typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
00173       typedef typename std::__is_scalar<_ValueType>::__type _Is_POD;
00174       std::__uninitialized_fill_aux(__first, __last, __x, _Is_POD());
00175     }
00176 
00177   
00178   
00179   template<typename _ForwardIterator, typename _Size, typename _Tp>
00180     inline void
00181     __uninitialized_fill_n_aux(_ForwardIterator __first, _Size __n,
00182                    const _Tp& __x, __true_type)
00183     { std::fill_n(__first, __n, __x); }
00184 
00185   template<typename _ForwardIterator, typename _Size, typename _Tp>
00186     void
00187     __uninitialized_fill_n_aux(_ForwardIterator __first, _Size __n,
00188                    const _Tp& __x, __false_type)
00189     {
00190       _ForwardIterator __cur = __first;
00191       try
00192     {
00193       for (; __n > 0; --__n, ++__cur)
00194         std::_Construct(&*__cur, __x);
00195     }
00196       catch(...)
00197     {
00198       std::_Destroy(__first, __cur);
00199       __throw_exception_again;
00200     }
00201     }
00202 
00212   template<typename _ForwardIterator, typename _Size, typename _Tp>
00213     inline void
00214     uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)
00215     {
00216       typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
00217       typedef typename std::__is_scalar<_ValueType>::__type _Is_POD;
00218       std::__uninitialized_fill_n_aux(__first, __n, __x, _Is_POD());
00219     }
00220 
00221   
00222   
00223   
00224   
00225   
00226 
00227   template<typename _InputIterator, typename _ForwardIterator,
00228        typename _Allocator>
00229     _ForwardIterator
00230     __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
00231                _ForwardIterator __result,
00232                _Allocator __alloc)
00233     {
00234       _ForwardIterator __cur = __result;
00235       try
00236     {
00237       for (; __first != __last; ++__first, ++__cur)
00238         __alloc.construct(&*__cur, *__first);
00239       return __cur;
00240     }
00241       catch(...)
00242     {
00243       std::_Destroy(__result, __cur, __alloc);
00244       __throw_exception_again;
00245     }
00246     }
00247 
00248   template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
00249     inline _ForwardIterator
00250     __uninitialized_copy_a(_InputIterator __first, _InputIterator __last,
00251                _ForwardIterator __result,
00252                allocator<_Tp>)
00253     {
00254       return std::uninitialized_copy(__first, __last, __result);
00255     }
00256 
00257   template<typename _ForwardIterator, typename _Tp, typename _Allocator>
00258     void
00259     __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
00260                const _Tp& __x, _Allocator __alloc)
00261     {
00262       _ForwardIterator __cur = __first;
00263       try
00264     {
00265       for (; __cur != __last; ++__cur)
00266         __alloc.construct(&*__cur, __x);
00267     }
00268       catch(...)
00269     {
00270       std::_Destroy(__first, __cur, __alloc);
00271       __throw_exception_again;
00272     }
00273     }
00274 
00275   template<typename _ForwardIterator, typename _Tp, typename _Tp2>
00276     inline void
00277     __uninitialized_fill_a(_ForwardIterator __first, _ForwardIterator __last,
00278                const _Tp& __x, allocator<_Tp2>)
00279     {
00280       std::uninitialized_fill(__first, __last, __x);
00281     }
00282 
00283   template<typename _ForwardIterator, typename _Size, typename _Tp,
00284        typename _Allocator>
00285     void
00286     __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n, 
00287                  const _Tp& __x,
00288                  _Allocator __alloc)
00289     {
00290       _ForwardIterator __cur = __first;
00291       try
00292     {
00293       for (; __n > 0; --__n, ++__cur)
00294         __alloc.construct(&*__cur, __x);
00295     }
00296       catch(...)
00297     {
00298       std::_Destroy(__first, __cur, __alloc);
00299       __throw_exception_again;
00300     }
00301     }
00302 
00303   template<typename _ForwardIterator, typename _Size, typename _Tp,
00304        typename _Tp2>
00305     void
00306     __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n, 
00307                  const _Tp& __x,
00308                  allocator<_Tp2>)
00309     {
00310       std::uninitialized_fill_n(__first, __n, __x);
00311     }
00312 
00313 
00314   
00315   
00316   
00317 
00318   
00319   
00320   
00321   
00322 
00323   template<typename _InputIterator1, typename _InputIterator2,
00324        typename _ForwardIterator, typename _Allocator>
00325     inline _ForwardIterator
00326     __uninitialized_copy_copy(_InputIterator1 __first1,
00327                   _InputIterator1 __last1,
00328                   _InputIterator2 __first2,
00329                   _InputIterator2 __last2,
00330                   _ForwardIterator __result,
00331                   _Allocator __alloc)
00332     {
00333       _ForwardIterator __mid = std::__uninitialized_copy_a(__first1, __last1,
00334                                __result,
00335                                __alloc);
00336       try
00337     {
00338       return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
00339     }
00340       catch(...)
00341     {
00342       std::_Destroy(__result, __mid, __alloc);
00343       __throw_exception_again;
00344     }
00345     }
00346 
00347   
00348   
00349   
00350   template<typename _ForwardIterator, typename _Tp, typename _InputIterator,
00351        typename _Allocator>
00352     inline _ForwardIterator
00353     __uninitialized_fill_copy(_ForwardIterator __result, _ForwardIterator __mid,
00354                   const _Tp& __x, _InputIterator __first,
00355                   _InputIterator __last,
00356                   _Allocator __alloc)
00357     {
00358       std::__uninitialized_fill_a(__result, __mid, __x, __alloc);
00359       try
00360     {
00361       return std::__uninitialized_copy_a(__first, __last, __mid, __alloc);
00362     }
00363       catch(...)
00364     {
00365       std::_Destroy(__result, __mid, __alloc);
00366       __throw_exception_again;
00367     }
00368     }
00369 
00370   
00371   
00372   
00373   template<typename _InputIterator, typename _ForwardIterator, typename _Tp,
00374        typename _Allocator>
00375     inline void
00376     __uninitialized_copy_fill(_InputIterator __first1, _InputIterator __last1,
00377                   _ForwardIterator __first2,
00378                   _ForwardIterator __last2, const _Tp& __x,
00379                   _Allocator __alloc)
00380     {
00381       _ForwardIterator __mid2 = std::__uninitialized_copy_a(__first1, __last1,
00382                                 __first2,
00383                                 __alloc);
00384       try
00385     {
00386       std::__uninitialized_fill_a(__mid2, __last2, __x, __alloc);
00387     }
00388       catch(...)
00389     {
00390       std::_Destroy(__first2, __mid2, __alloc);
00391       __throw_exception_again;
00392     }
00393     }
00394 
00395 } 
00396 
00397 #endif