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_ALGOBASE_H
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_ALGOBASE_H
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CSTDDEF
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cstddef.h>
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CSTRING
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cstring.h>
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_CLIMITS
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <climits>
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CSTDLIB
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cstdlib.h>
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_PAIR_H
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_pair.h>
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_iterator_base.h>
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_TYPE_TRAITS_H
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/type_traits.h>
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __swap_aux(_Tp& __a, _Tp& __b, const __true_type& /*SwapImplemented*/) {
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  __a._M_swap_workaround(__b);
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __swap_aux(_Tp& __a, _Tp& __b, const __false_type& /*SwapImplemented*/) {
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Tp __tmp = __a;
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __a = __b;
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __b = __tmp;
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// swap and iter_swap
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void swap(_Tp& __a, _Tp& __b) {
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined(__BORLANDC__)
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _SwapImplemented<_Tp>::_Ret _Implemented;
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  enum { _Is = _SwapImplemented<_Tp>::_Is };
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __bool2type<_Is>::_Ret _Implemented;
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __swap_aux(__a, __b, _Implemented());
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Tp __tmp = __a;
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __a = __b;
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __b = __tmp;
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter1, class _ForwardIter2, class _Value>
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __iter_swap_aux_aux(_ForwardIter1& __i1, _ForwardIter2& __i2, _Value *) {
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Value tmp = *__i1;
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  *__i1 = *__i2;
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  *__i2 = tmp;
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter1, class _ForwardIter2>
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __iter_swap_aux(_ForwardIter1& __i1, _ForwardIter2& __i2, const __true_type& /*OKToSwap*/) {
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /* namespace specification breaks access to the right swap template overload (at least for gcc) */
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /*_STLP_STD::*/ swap(*__i1, *__i2);
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter1, class _ForwardIter2>
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __iter_swap_aux(_ForwardIter1& __i1, _ForwardIter2& __i2, const __false_type& /*OKToSwap*/) {
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV __iter_swap_aux_aux( __i1, __i2, _STLP_VALUE_TYPE(__i1,_ForwardIter1) );
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter1, class _ForwardIter2>
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void iter_swap(_ForwardIter1 __i1, _ForwardIter2 __i2) {
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_PRIV __iter_swap_aux( __i1, __i2, _IsOKToSwap(_STLP_VALUE_TYPE(__i1, _ForwardIter1), _STLP_VALUE_TYPE(__i2, _ForwardIter2),
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                      _STLP_IS_REF_TYPE_REAL_REF(__i1, _ForwardIter1),
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                      _STLP_IS_REF_TYPE_REAL_REF(__i2, _ForwardIter2))._Answer());
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//--------------------------------------------------
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// min and max
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (__BORLANDC__) || defined (_STLP_USE_OWN_NAMESPACE)
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if (defined (__BORLANDC__) && (__BORLANDC__ < 0x580)) && !defined (__STDC__)
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//In not ANSI mode Borland import min/max in global namespace which conflict
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//with STLport min/max when user does a 'using namespace std' in its code
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//(see test/unit/alg_test.cpp). To avoid this clash we simply import Borland min/max
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//in STLport namespace.
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing _STLP_VENDOR_STD::min;
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing _STLP_VENDOR_STD::max;
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline const _Tp& (min)(const _Tp& __a, const _Tp& __b) { return __b < __a ? __b : __a; }
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline const _Tp& (max)(const _Tp& __a, const _Tp& __b) {  return  __a < __b ? __b : __a; }
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (__BORLANDC__) && defined (_STLP_USE_OWN_NAMESPACE)
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline unsigned long (min) (unsigned long __a, unsigned long __b) { return __b < __a ? __b : __a; }
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline unsigned long (max) (unsigned long __a, unsigned long __b) {  return  __a < __b ? __b : __a; }
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (__BORLANDC__) || (__BORLANDC__ < 0x590)
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Compare>
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline const _Tp& (min)(const _Tp& __a, const _Tp& __b, _Compare __comp) {
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __comp(__b, __a) ? __b : __a;
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Compare>
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline const _Tp& (max)(const _Tp& __a, const _Tp& __b, _Compare __comp) {
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __comp(__a, __b) ? __b : __a;
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp, class _Compare>
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline const _Tp (min)(const _Tp __a, const _Tp __b, _Compare __comp) {
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __comp(__b, __a) ? __b : __a;
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp, class _Compare>
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline const _Tp (max)(const _Tp __a, const _Tp __b, _Compare __comp) {
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __comp(__a, __b) ? __b : __a;
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//--------------------------------------------------
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// copy
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// All of these auxiliary functions serve two purposes.  (1) Replace
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// calls to copy with memmove whenever possible.  (Memmove, not memcpy,
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// because the input and output ranges are permitted to overlap.)
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// (2) If we're using random access iterators, then write the loop as
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// a for loop with an explicit count.
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter, class _Distance>
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy(_InputIter __first, _InputIter __last,
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _OutputIter __result, const input_iterator_tag &, _Distance*) {
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first != __last; ++__result, ++__first)
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__result = *__first;
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result;
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter, class _Distance>
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy(_InputIter __first, _InputIter __last,
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _OutputIter __result, const forward_iterator_tag &, _Distance* ) {
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first != __last; ++__result, ++__first)
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__result = *__first;
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result;
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter, class _Distance>
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy(_InputIter __first, _InputIter __last,
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _OutputIter __result, const bidirectional_iterator_tag &, _Distance* ) {
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first != __last; ++__result, ++__first)
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__result = *__first;
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result;
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _RandomAccessIter, class _OutputIter, class _Distance>
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__copy(_RandomAccessIter __first, _RandomAccessIter __last,
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block       _OutputIter __result, const random_access_iterator_tag &, _Distance*) {
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (_Distance __n = __last - __first; __n > 0; --__n) {
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__result = *__first;
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__first;
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__result;
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result;
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void*
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__copy_trivial(const void* __first, const void* __last, void* __result) {
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t __n = (const char*)__last - (const char*)__first;
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n ? (void *)((char*)memmove(__result, __first, __n) + __n) : __result;
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//--------------------------------------------------
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// copy_backward auxiliary functions
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _BidirectionalIter1, class _BidirectionalIter2,
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _Distance>
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _BidirectionalIter2 __copy_backward(_BidirectionalIter1 __first,
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                           _BidirectionalIter1 __last,
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                           _BidirectionalIter2 __result,
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                           const bidirectional_iterator_tag &,
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                           _Distance*) {
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while (__first != __last)
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *--__result = *--__last;
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result;
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _RandomAccessIter, class _BidirectionalIter, class _Distance>
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _BidirectionalIter __copy_backward(_RandomAccessIter __first,
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                          _RandomAccessIter __last,
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                          _BidirectionalIter __result,
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                          const random_access_iterator_tag &,
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                          _Distance*) {
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (_Distance __n = __last - __first; __n > 0; --__n)
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *--__result = *--__last;
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result;
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void*
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__copy_trivial_backward(const void* __first, const void* __last, void* __result) {
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const ptrdiff_t _Num = (const char*)__last - (const char*)__first;
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (_Num > 0) ? memmove((char*)__result - _Num, __first, _Num) : __result ;
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result,
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const __false_type& /*IsOKToMemCpy*/) {
262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_PRIV __copy(__first, __last, __result, random_access_iterator_tag(), (ptrdiff_t*)0);
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result,
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const __true_type& /*IsOKToMemCpy*/) {
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // we know they all pointers, so this cast is OK
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  return (_OutputIter)__copy_trivial(&(*__first), &(*__last), &(*__result));
269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return (_OutputIter)_STLP_PRIV __copy_trivial(__first, __last, __result);
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy_aux(_InputIter __first, _InputIter __last, _OutputIter __result,
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const __true_type& /*BothPtrType*/) {
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_PRIV __copy_ptrs(__first, __last, __result,
276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                _UseTrivialCopy(_STLP_VALUE_TYPE(__first, _InputIter),
277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                _STLP_VALUE_TYPE(__result, _OutputIter))._Answer());
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy_aux(_InputIter __first, _InputIter __last, _OutputIter __result,
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const __false_type& /*BothPtrType*/) {
283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_PRIV __copy(__first, __last, __result,
284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                           _STLP_ITERATOR_CATEGORY(__first, _InputIter),
285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                           _STLP_DISTANCE_TYPE(__first, _InputIter));
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter copy(_InputIter __first, _InputIter __last, _OutputIter __result) {
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _STLP_PRIV __copy_aux(__first, __last, __result, _BothPtrType< _InputIter, _OutputIter>::_Answer());
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy_backward_ptrs(_InputIter __first, _InputIter __last,
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        _OutputIter __result, const __false_type& /*TrivialAssignment*/) {
301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_PRIV __copy_backward(__first, __last, __result,
302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                    _STLP_ITERATOR_CATEGORY(__first, _InputIter),
303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                    _STLP_DISTANCE_TYPE(__first, _InputIter));
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy_backward_ptrs(_InputIter __first, _InputIter __last,
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        _OutputIter __result, const __true_type& /*TrivialAssignment*/) {
308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return (_OutputIter)_STLP_PRIV __copy_trivial_backward(__first, __last, __result);
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy_backward_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_PRIV __copy_backward(__first, __last, __result,
314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                    _STLP_ITERATOR_CATEGORY(__first,_InputIter),
315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                    _STLP_DISTANCE_TYPE(__first, _InputIter));
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter __copy_backward_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_PRIV __copy_backward_ptrs(__first, __last, __result,
321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                         _UseTrivialCopy(_STLP_VALUE_TYPE(__first, _InputIter),
322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                         _STLP_VALUE_TYPE(__result, _OutputIter))._Answer());
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _OutputIter>
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIter copy_backward(_InputIter __first, _InputIter __last, _OutputIter __result) {
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _STLP_PRIV __copy_backward_aux(__first, __last, __result, _BothPtrType< _InputIter, _OutputIter>::_Answer() );
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS)
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _STLP_DECLARE_COPY_TRIVIAL(_Tp)                                       \
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result)          \
336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (_Tp*)_STLP_PRIV __copy_trivial(__first, __last, __result); }          \
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp* copy_backward(const _Tp* __first, const _Tp* __last, _Tp* __result) \
338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return (_Tp*)_STLP_PRIV __copy_trivial_backward(__first, __last, __result); }
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (_STLP_NO_BOOL)
341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLARE_COPY_TRIVIAL(bool)
342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(char)
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_NO_SIGNED_BUILTINS)
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(signed char)
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(unsigned char)
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(short)
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(unsigned short)
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(int)
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(unsigned int)
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(long)
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(unsigned long)
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined(_STLP_NO_WCHAR_T) && !defined (_STLP_WCHAR_T_IS_USHORT)
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(wchar_t)
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_LONG_LONG)
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(_STLP_LONG_LONG)
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(unsigned _STLP_LONG_LONG)
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(float)
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(double)
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_NO_LONG_DOUBLE)
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_DECLARE_COPY_TRIVIAL(long double)
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef _STLP_DECLARE_COPY_TRIVIAL
367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//--------------------------------------------------
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// copy_n (not part of the C++ standard)
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_EXTENSIONS)
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Size, class _OutputIter>
376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_INLINE_LOOP _STLP_STD::pair<_InputIter, _OutputIter>
377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__copy_n(_InputIter __first, _Size __count, _OutputIter __result,
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         const input_iterator_tag &) {
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __count > 0; --__count) {
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__result = *__first;
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__first;
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__result;
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_STD::pair<_InputIter, _OutputIter>(__first, __result);
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _RAIter, class _Size, class _OutputIter>
388e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline _STLP_STD::pair<_RAIter, _OutputIter>
389e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__copy_n(_RAIter __first, _Size __count, _OutputIter __result,
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         const random_access_iterator_tag &) {
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _RAIter __last = __first + __count;
392e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_STD::pair<_RAIter, _OutputIter>(__last, _STLP_STD::copy(__first, __last, __result));
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Size, class _OutputIter>
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline pair<_InputIter, _OutputIter>
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockcopy_n(_InputIter __first, _Size __count, _OutputIter __result) {
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FIX_LITERAL_BUG(__first)
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _STLP_PRIV __copy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//--------------------------------------------------
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// fill and fill_n
407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE
408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp>
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP
411e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid __fill_fwd(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first != __last; ++__first)
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__first = __val;
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _ForwardIter, class _Tp, class _Distance>
417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void __fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
418e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                   const input_iterator_tag &, _Distance*) {
419e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV __fill_fwd(__first, __last, __val);
420e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
422e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
423e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _ForwardIter, class _Tp, class _Distance>
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP
425e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid __fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            const forward_iterator_tag &, _Distance*) {
427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV __fill_fwd(__first, __last, __val);
428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _ForwardIter, class _Tp, class _Distance>
431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_INLINE_LOOP
432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid __fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            const bidirectional_iterator_tag &, _Distance*) {
434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV __fill_fwd(__first, __last, __val);
435e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
436e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
437e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
438e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _RandomAccessIter, class _Tp, class _Distance>
439e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_INLINE_LOOP
440e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid __fill(_RandomAccessIter __first, _RandomAccessIter __last, const _Tp& __val,
441e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott            const random_access_iterator_tag &, _Distance*) {
442e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for (_Distance __n = __last - __first ; __n > 0; ++__first, --__n)
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *__first = __val;
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
448e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _ForwardIter, class _Tp>
449e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
450e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
451e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV __fill(__first, __last, __val,
452e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                    _STLP_ITERATOR_CATEGORY(__first, _ForwardIter),
453e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                    _STLP_DISTANCE_TYPE(__first, _ForwardIter));
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Specialization: for one-byte types we can use memset.
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void fill(unsigned char* __first, unsigned char* __last,
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 const unsigned char& __val) {
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  unsigned char __tmp = __val;
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset(__first, __tmp, __last - __first);
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_SIGNED_BUILTINS)
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void fill(signed char* __first, signed char* __last,
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 const signed char& __val) {
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  signed char __tmp = __val;
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void fill(char* __first, char* __last, const char& __val) {
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  char __tmp = __val;
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
476e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _OutputIter, class _Size, class _Tp>
477e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_INLINE_LOOP
478e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_OutputIter __fill_n(_OutputIter __first, _Size __n, const _Tp& __val) {
479e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_FIX_LITERAL_BUG(__first)
480e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  for ( ; __n > 0; --__n, ++__first)
481e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    *__first = __val;
482e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return __first;
483e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
484e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
485e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Size>
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline unsigned char* __fill_n(unsigned char* __first, _Size __n,
488e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                               const unsigned char& __val) {
489e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STD::fill(__first, __first + __n, __val);
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __first + __n;
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
492e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_SIGNED_BUILTINS)
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Size>
494e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline signed char* __fill_n(signed char* __first, _Size __n,
495e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                             const signed char& __val) {
496e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STD::fill(__first, __first + __n, __val);
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __first + __n;
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
499e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Size>
501e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline char* __fill_n(char* __first, _Size __n,
502e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                      const char& __val) {
503e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STD::fill(__first, __first + __n, __val);
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __first + __n;
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
506e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
509e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
510e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _OutputIter, class _Size, class _Tp>
511e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void fill_n(_OutputIter __first, _Size __n, const _Tp& __val) {
512e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_FIX_LITERAL_BUG(__first)
513e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_PRIV __fill_n(__first, __n, __val);
514e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//--------------------------------------------------
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// equal and mismatch
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter1, class _InputIter2>
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP
522e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_STD::pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
523e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                   _InputIter1 __last1,
524e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                   _InputIter2 __first2) {
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FIX_LITERAL_BUG(__first2)
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while (__first1 != __last1 && *__first1 == *__first2) {
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__first1;
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__first2;
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
531e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_STD::pair<_InputIter1, _InputIter2>(__first1, __first2);
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter1, class _InputIter2, class _BinaryPredicate>
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP
536e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_STD::pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
537e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                   _InputIter1 __last1,
538e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                   _InputIter2 __first2,
539e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                   _BinaryPredicate __binary_pred) {
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FIX_LITERAL_BUG(__first2)
5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) {
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__first1;
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++__first2;
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
546e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_STD::pair<_InputIter1, _InputIter2>(__first1, __first2);
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter1, class _InputIter2>
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool equal(_InputIter1 __first1, _InputIter1 __last1,
552e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott           _InputIter2 __first2) {
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FIX_LITERAL_BUG(__first1) _STLP_FIX_LITERAL_BUG(__last1)  _STLP_FIX_LITERAL_BUG(__first2)
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first1 != __last1; ++__first1, ++__first2)
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!(*__first1 == *__first2))
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return false;
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return true;
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter1, class _InputIter2, class _BinaryPredicate>
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool equal(_InputIter1 __first1, _InputIter1 __last1,
564e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott           _InputIter2 __first2, _BinaryPredicate __binary_pred) {
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FIX_LITERAL_BUG(__first2)
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first1 != __last1; ++__first1, ++__first2)
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (!__binary_pred(*__first1, *__first2))
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return false;
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return true;
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//--------------------------------------------------
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// lexicographical_compare and lexicographical_compare_3way.
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// (the latter is not part of the C++ standard.)
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter1, class _InputIter2>
5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             _InputIter2 __first2, _InputIter2 __last2);
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter1, class _InputIter2, class _Compare>
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             _InputIter2 __first2, _InputIter2 __last2,
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                             _Compare __comp);
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocklexicographical_compare(const unsigned char* __first1,
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                        const unsigned char* __last1,
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                        const unsigned char* __first2,
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                        const unsigned char* __last2) {
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const size_t __len1 = __last1 - __first1;
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const size_t __len2 = __last2 - __first2;
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))
5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const int __result = memcmp(__first1, __first2, (min) (__len1, __len2));
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result != 0 ? (__result < 0) : (__len1 < __len2);
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !(CHAR_MAX == SCHAR_MAX)
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool lexicographical_compare(const char* __first1, const char* __last1,
6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                    const char* __first2, const char* __last2) {
6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))
6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return lexicographical_compare((const unsigned char*) __first1,
6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 (const unsigned char*) __last1,
6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 (const unsigned char*) __first2,
6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 (const unsigned char*) __last2);
6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* CHAR_MAX == SCHAR_MAX */
6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter1, class _InputIter2>
6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockint __lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   _InputIter2 __first2, _InputIter2 __last2);
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline int
6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__lexicographical_compare_3way(const unsigned char* __first1,
6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const unsigned char* __last1,
6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const unsigned char* __first2,
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const unsigned char* __last2) {
6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const ptrdiff_t __len1 = __last1 - __first1;
6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const ptrdiff_t __len2 = __last2 - __first2;
6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const int __result = memcmp(__first1, __first2, (min) (__len1, __len2));
6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __result != 0 ? __result
6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       : (__len1 == __len2 ? 0 : (__len1 < __len2 ? -1 : 1));
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !(CHAR_MAX == SCHAR_MAX)
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline int
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__lexicographical_compare_3way(const char* __first1, const char* __last1,
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const char* __first2, const char* __last2) {
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __lexicographical_compare_3way((const unsigned char*) __first1,
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        (const unsigned char*) __last1,
6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        (const unsigned char*) __first2,
6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        (const unsigned char*) __last2);
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_EXTENSIONS)
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter1, class _InputIter2>
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockint lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                 _InputIter2 __first2, _InputIter2 __last2);
6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
651e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// count
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Tp>
6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_InputIter)
6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockcount(_InputIter __first, _InputIter __last, const _Tp& __val) {
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DIFFERENCE_TYPE(_InputIter) __n = 0;
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first != __last; ++__first)
6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (*__first == __val)
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__n;
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __n;
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// find and find_if. Note find may be expressed in terms of find_if if appropriate binder was available.
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Tp>
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_InputIter find(_InputIter __first, _InputIter __last, const _Tp& __val);
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _Predicate>
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_InputIter find_if(_InputIter __first, _InputIter __last, _Predicate __pred);
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// search.
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     _ForwardIter2 __first2, _ForwardIter2 __last2, _BinaryPred  __predicate);
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// find_first_of
680e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _InputIter, class _ForwardIter>
681e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_InputIter __find_first_of(_InputIter __first1, _InputIter __last1,
682e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                           _ForwardIter __first2, _ForwardIter __last2);
683e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIter, class _ForwardIter, class _BinaryPredicate>
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_InputIter __find_first_of(_InputIter __first1, _InputIter __last1,
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _ForwardIter __first2, _ForwardIter __last2,
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _BinaryPredicate __comp);
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter1, class _ForwardIter2,
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _BinaryPredicate>
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_ForwardIter1
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockfind_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         _ForwardIter2 __first2, _ForwardIter2 __last2,
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         _BinaryPredicate __comp);
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// replace
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp>
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP void
7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockreplace(_ForwardIter __first, _ForwardIter __last,
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const _Tp& __old_value, const _Tp& __new_value) {
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first != __last; ++__first)
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (*__first == __old_value)
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__first = __new_value;
7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIter, class _Tp, class _Compare1, class _Compare2, class _Distance>
7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const _Tp& __val, _Compare1 __comp1, _Compare2 __comp2, _Distance*);
7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION)
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_algobase.c>
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_ALGOBASE_H */
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
729