You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.8 KiB
102 lines
2.8 KiB
/* |
|
* |
|
* Copyright (c) 1994 |
|
* Hewlett-Packard Company |
|
* |
|
* Permission to use, copy, modify, distribute and sell this software |
|
* and its documentation for any purpose is hereby granted without fee, |
|
* provided that the above copyright notice appear in all copies and |
|
* that both that copyright notice and this permission notice appear |
|
* in supporting documentation. Hewlett-Packard Company makes no |
|
* representations about the suitability of this software for any |
|
* purpose. It is provided "as is" without express or implied warranty. |
|
* |
|
*/ |
|
|
|
#ifndef ALGO_H |
|
#define ALGO_H |
|
|
|
#include <stdlib.h> |
|
#ifndef __GNUG__ |
|
#include <ministl/bool.h> |
|
#endif |
|
#include <ministl/pair> |
|
|
|
template <class InputIterator, class Function> |
|
Function for_each(InputIterator first, InputIterator last, Function f) { |
|
while (first != last) f(*first++); |
|
return f; |
|
} |
|
|
|
template <class InputIterator, class T> |
|
InputIterator find(InputIterator first, InputIterator last, const T& value) { |
|
while (first != last && *first != value) ++first; |
|
return first; |
|
} |
|
|
|
template <class InputIterator, class Predicate> |
|
InputIterator find_if(InputIterator first, InputIterator last, |
|
Predicate pred) { |
|
while (first != last && !pred(*first)) ++first; |
|
return first; |
|
} |
|
|
|
template <class ForwardIterator> |
|
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last) { |
|
if (first == last) return last; |
|
ForwardIterator next = first; |
|
while(++next != last) { |
|
if (*first == *next) return first; |
|
first = next; |
|
} |
|
return last; |
|
} |
|
|
|
template <class ForwardIterator, class BinaryPredicate> |
|
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, |
|
BinaryPredicate binary_pred) { |
|
if (first == last) return last; |
|
ForwardIterator next = first; |
|
while(++next != last) { |
|
if (binary_pred(*first, *next)) return first; |
|
first = next; |
|
} |
|
return last; |
|
} |
|
|
|
template <class InputIterator, class T, class Size> |
|
void count(InputIterator first, InputIterator last, const T& value, |
|
Size& n) { |
|
while (first != last) |
|
if (*first++ == value) ++n; |
|
} |
|
|
|
template <class InputIterator, class Predicate, class Size> |
|
void count_if(InputIterator first, InputIterator last, Predicate pred, |
|
Size& n) { |
|
while (first != last) |
|
if (pred(*first++)) ++n; |
|
} |
|
|
|
#ifndef min |
|
#define min(a,b) (((a) < (b)) ? (a) : (b)) |
|
#endif |
|
#ifndef max |
|
#define max(a,b) (((a) > (b)) ? (a) : (b)) |
|
#endif |
|
/* |
|
template<class _II, class _OI, class _Uop> inline |
|
_OI transform(_II _F, _II _L, _OI _X, _Uop _U) |
|
{for (; _F != _L; ++_F, ++_X) |
|
*_X = _U(*_F); |
|
return (_X); } |
|
// TEMPLATE FUNCTION transform WITH BINARY OP |
|
template<class _II1, class _II2, class _OI, class _Bop> inline |
|
_OI transform(_II1 _F1, _II1 _L1, _II2 _F2, _OI _X, _Bop _B) |
|
{for (; _F1 != _L1; ++_F1, ++_F2, ++_X) |
|
*_X = _B(*_F1, *_F2); |
|
return (_X); } |
|
// TEMPLATE FUNCTION replace |
|
*/ |
|
#endif |
|
|
|
|