19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* NOTE: This is an internal header file, included by other STL headers.
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *   You should not attempt to use it directly.
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_UNINITIALIZED_H
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_UNINITIALIZED_H
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CSTRING
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cstring.h>
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALGOBASE_H
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_algobase.h>
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CONSTRUCT_H
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_construct.h>
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// uninitialized_copy
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter, class _Distance>
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy(_InputIter __first, _InputIter __last,
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _OutputIter __result, _Distance*) {
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _OutputIter __cur = __result;
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first != __last; ++__first, ++__cur)
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Param_Construct(&*__cur, *__first);
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __cur;
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(__result, __cur))
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_RET_AFTER_THROW(__cur)
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter, class _Distance>
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy(_InputIter __first, _InputIter __last,
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _OutputIter __result, const input_iterator_tag &, _Distance* __d)
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ucopy(__first, __last, __result, __d); }
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter, class _Distance>
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy(_InputIter __first, _InputIter __last,
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _OutputIter __result, const forward_iterator_tag &, _Distance* __d)
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ucopy(__first, __last, __result, __d); }
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter, class _Distance>
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy(_InputIter __first, _InputIter __last,
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _OutputIter __result, const bidirectional_iterator_tag &, _Distance* __d)
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ucopy(__first, __last, __result, __d); }
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _RandomAccessIter, class _OutputIter, class _Distance>
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy(_RandomAccessIter __first, _RandomAccessIter __last,
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _OutputIter __result, const random_access_iterator_tag &, _Distance*) {
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _OutputIter __cur = __result;
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (_Distance __n = __last - __first; __n > 0; --__n) {
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Param_Construct(&*__cur, *__first);
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__first;
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__cur;
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __cur;
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(__result, __cur))
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_RET_AFTER_THROW(__cur)
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//Used internaly
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _RandomAccessIter, class _OutputIter>
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy(_RandomAccessIter __first, _RandomAccessIter __last, _OutputIter __result)
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ucopy(__first, __last, __result, random_access_iterator_tag(), (ptrdiff_t*)0); }
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void*
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__ucopy_trivial(const void* __first, const void* __last, void* __result) {
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //dums: this version can use memcpy (__copy_trivial can't)
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (__last == __first) ? __result :
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ((char*)memcpy(__result, __first, ((const char*)__last - (const char*)__first))) +
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ((const char*)__last - (const char*)__first);
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result,
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                const __false_type& /*TrivialUCopy*/)
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ucopy(__first, __last, __result, random_access_iterator_tag(), (ptrdiff_t*)0); }
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result,
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                const __true_type& /*TrivialUCopy*/) {
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // we know they all pointers, so this cast is OK
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  return (_OutputIter)__copy_trivial(&(*__first), &(*__last), &(*__result));
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (_OutputIter)__ucopy_trivial(__first, __last, __result);
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy_aux(_InputIter __first, _InputIter __last, _OutputIter __result,
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const __true_type& /*BothPtrType*/) {
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __ucopy_ptrs(__first, __last, __result,
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                      _UseTrivialUCopy(_STLP_VALUE_TYPE(__first, _InputIter),
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                       _STLP_VALUE_TYPE(__result, _OutputIter))._Answer());
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __ucopy_aux(_InputIter __first, _InputIter __last, _OutputIter __result,
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const __false_type& /*BothPtrType*/) {
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __ucopy(__first, __last, __result,
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 _STLP_ITERATOR_CATEGORY(__first, _InputIter),
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 _STLP_DISTANCE_TYPE(__first, _InputIter));
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _ForwardIter>
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockuninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result)
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return _STLP_PRIV __ucopy_aux(__first, __last, __result, _BothPtrType< _InputIter, _ForwardIter>::_Answer()); }
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline char*
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockuninitialized_copy(const char* __first, const char* __last, char* __result)
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return  (char*)_STLP_PRIV __ucopy_trivial(__first, __last, __result); }
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_HAS_WCHAR_T) // dwa 8/15/97
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline wchar_t*
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockuninitialized_copy(const wchar_t* __first, const wchar_t* __last, wchar_t* __result)
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return  (wchar_t*)_STLP_PRIV __ucopy_trivial (__first, __last, __result); }
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// uninitialized_copy_n (not part of the C++ standard)
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Size, class _ForwardIter>
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpair<_InputIter, _ForwardIter>
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__ucopy_n(_InputIter __first, _Size __count, _ForwardIter __result,
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          const input_iterator_tag &) {
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _ForwardIter __cur = __result;
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __count > 0 ; --__count, ++__first, ++__cur)
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Param_Construct(&*__cur, *__first);
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return pair<_InputIter, _ForwardIter>(__first, __cur);
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(__result, __cur))
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_RET_AFTER_THROW((pair<_InputIter, _ForwardIter>(__first, __cur)))
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Size, class _ForwardIterator>
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline pair<_InputIter, _ForwardIterator>
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__ucopy_n(_InputIter __first, _Size __count,
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       _ForwardIterator __result,
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const forward_iterator_tag &)
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ucopy_n(__first, __count, __result, input_iterator_tag()); }
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Size, class _ForwardIterator>
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline pair<_InputIter, _ForwardIterator>
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__ucopy_n(_InputIter __first, _Size __count,
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       _ForwardIterator __result,
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const bidirectional_iterator_tag &)
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ucopy_n(__first, __count, __result, input_iterator_tag()); }
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _RandomAccessIter, class _Size, class _ForwardIter>
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline pair<_RandomAccessIter, _ForwardIter>
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__ucopy_n(_RandomAccessIter __first, _Size __count, _ForwardIter __result,
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const random_access_iterator_tag &) {
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _RandomAccessIter __last = __first + __count;
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return pair<_RandomAccessIter, _ForwardIter>(__last, uninitialized_copy(__first, __last, __result));
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This is used internally in <rope> , which is extension itself.
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Size, class _ForwardIter>
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline pair<_InputIter, _ForwardIter>
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__ucopy_n(_InputIter __first, _Size __count, _ForwardIter __result)
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return _STLP_PRIV __ucopy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); }
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_EXTENSIONS)
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Size, class _ForwardIter>
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline pair<_InputIter, _ForwardIter>
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockuninitialized_copy_n(_InputIter __first, _Size __count, _ForwardIter __result)
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return _STLP_PRIV __ucopy_n(__first, __count, __result); }
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp, class _Distance>
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __ufill(_ForwardIter __first, _ForwardIter __last, const _Tp& __x, _Distance*) {
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _ForwardIter __cur = __first;
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __cur != __last; ++__cur)
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Param_Construct(&*__cur, __x);
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(__first, __cur))
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp, class _Distance>
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __ufill(_ForwardIter __first, _ForwardIter __last,
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    const _Tp& __x, const input_iterator_tag &, _Distance* __d)
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ __ufill(__first, __last, __x, __d); }
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp, class _Distance>
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __ufill(_ForwardIter __first, _ForwardIter __last,
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    const _Tp& __x, const forward_iterator_tag &, _Distance* __d)
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ __ufill(__first, __last, __x, __d); }
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp, class _Distance>
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __ufill(_ForwardIter __first, _ForwardIter __last,
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    const _Tp& __x, const bidirectional_iterator_tag &, _Distance* __d)
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ __ufill(__first, __last, __x, __d); }
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp, class _Distance>
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __ufill(_ForwardIter __first, _ForwardIter __last,
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                    const _Tp& __x, const random_access_iterator_tag &, _Distance*) {
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _ForwardIter __cur = __first;
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (_Distance __n = __last - __first; __n > 0; --__n, ++__cur)
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Param_Construct(&*__cur, __x);
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(__first, __cur))
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp>
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void uninitialized_fill(_ForwardIter __first, _ForwardIter __last,  const _Tp& __x) {
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __ufill(__first, __last, __x,
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _STLP_ITERATOR_CATEGORY(__first, _ForwardIter),
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _STLP_DISTANCE_TYPE(__first, _ForwardIter));
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Specialization: for one-byte types we can use memset.
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void uninitialized_fill(unsigned char* __first, unsigned char* __last,
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const unsigned char& __val) {
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  unsigned char __tmp = __val;
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset(__first, __tmp, __last - __first);
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_SIGNED_BUILTINS)
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void uninitialized_fill(signed char* __first, signed char* __last,
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const signed char& __val) {
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  signed char __tmp = __val;
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void uninitialized_fill(char* __first, char* __last, const char& __val) {
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char __tmp = __val;
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __ufill_n(_ForwardIter __first, _Size __n, const _Tp& __x) {
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _ForwardIter __cur = __first;
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __n > 0; --__n, ++__cur)
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Param_Construct(&*__cur, __x);
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(__first, __cur))
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __cur;
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __ufill_n(_ForwardIter __first, _Size __n, const _Tp& __x,
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const input_iterator_tag &)
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ufill_n(__first, __n, __x); }
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __ufill_n(_ForwardIter __first, _Size __n, const _Tp& __x,
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const forward_iterator_tag &)
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ufill_n(__first, __n, __x); }
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __ufill_n(_ForwardIter __first, _Size __n, const _Tp& __x,
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const bidirectional_iterator_tag &)
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ufill_n(__first, __n, __x); }
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x) {
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _ForwardIter __last = __first + __n;
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __ufill(__first, __last, __x, random_access_iterator_tag(), (ptrdiff_t*)0);
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __last;
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __ufill_n(_ForwardIter __first, _Size __n, const _Tp& __x,
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const random_access_iterator_tag &)
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __uninitialized_fill_n(__first, __n, __x); }
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* __uninitialized_init is an internal algo to init a range with a value
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * built using default constructor. It is only called with pointer as
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * iterator.
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __uinit_aux_aux(_ForwardIter __first, _Size __n, const _Tp& __val,
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    const __false_type& /*_HasDefaultZero*/)
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __uninitialized_fill_n(__first, __n, __val); }
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline _ForwardIter __uinit_aux_aux(_ForwardIter __first, _Size __n, const _Tp& /* __val */,
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    const __true_type& /*_HasDefaultZero*/) {
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset((unsigned char*)__first, 0, __n * sizeof(_Tp));
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __first + __n;
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __uinit_aux(_ForwardIter __first, _Size __n, const _Tp&,
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                const __true_type& /*_TrivialInit*/)
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __first + __n; }
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __uinit_aux(_ForwardIter __first, _Size __n, const _Tp& __val,
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                const __false_type& /*_TrivialInit*/)
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __uinit_aux_aux(__first, __n, __val, _HasDefaultZeroValue(__first)._Answer()); }
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter __uninitialized_init(_ForwardIter __first, _Size __n, const _Tp& __val)
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __uinit_aux(__first, __n, __val, _UseTrivialInit(__first)._Answer()); }
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Size, class _Tp>
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockuninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x)
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ _STLP_PRIV __ufill_n(__first, __n, __x, _STLP_ITERATOR_CATEGORY(__first, _ForwardIter)); }
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill,
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __uninitialized_fill_copy.
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __uninitialized_copy_copy
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Copies [first1, last1) into [result, result + (last1 - first1)), and
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  copies [first2, last2) into
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  [result + (last1 - first1), result + (last1 - first1) + (last2 - first2)).
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter1, class _InputIter2, class _ForwardIter>
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _InputIter2 __first2, _InputIter2 __last2,
375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                          _ForwardIter __result) {
376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _ForwardIter __new_result = uninitialized_copy(__first1, __last1, __result);
377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_TRY {
378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return uninitialized_copy(__first2, __last2, __new_result);
379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_UNWIND(_STLP_STD::_Destroy_Range(__result, __new_result))
381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_RET_AFTER_THROW(__result)
382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __uninitialized_fill_copy
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Fills [result, mid) with x, and copies [first, last) into
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  [mid, mid + (last - first)).
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp, class _InputIter>
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid, const _Tp& __x,
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _InputIter __first, _InputIter __last) {
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  uninitialized_fill(__result, __mid, __x);
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return uninitialized_copy(__first, __last, __mid);
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(__result, __mid))
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_RET_AFTER_THROW(__result)
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// __uninitialized_copy_fill
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//  fills [first2 + (last1 - first1), last2) with x.
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Iter, class _Tp>
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__uninitialized_copy_fill(_Iter __first1, _Iter __last1, _Iter __first2, _Iter __last2,
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const _Tp& __x) {
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Iter __mid2 = uninitialized_copy(__first1, __last1, __first2);
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    uninitialized_fill(__mid2, __last2, __x);
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(__first2, __mid2))
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* __uninitialized_move:
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This function is used internaly and only with pointers as iterators.
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _ForwardIter, class _TrivialUCpy>
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _ForwardIter
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__uninitialized_move(_InputIter __first, _InputIter __last, _ForwardIter __result,
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _TrivialUCpy __trivial_ucpy, const __false_type& /*_Movable*/)
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __ucopy_ptrs(__first, __last, __result, __trivial_ucpy); }
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _ForwardIter, class _TrivialUCpy>
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_ForwardIter
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__uninitialized_move(_InputIter __first, _InputIter __last, _ForwardIter __result,
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _TrivialUCpy , const __true_type& /*_Movable*/) {
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //Move constructor should not throw so we do not need to take care of exceptions here.
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (ptrdiff_t __n = __last - __first ; __n > 0; --__n) {
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Move_Construct(&*__result, *__first);
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__first; ++__result;
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result;
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_UNINITIALIZED_H */
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
444