summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3/include/bits/stl_algo.h
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/include/bits/stl_algo.h')
-rw-r--r--libstdc++-v3/include/bits/stl_algo.h1473
1 files changed, 917 insertions, 556 deletions
diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h
index 090f0d6720e..929c4ff372f 100644
--- a/libstdc++-v3/include/bits/stl_algo.h
+++ b/libstdc++-v3/include/bits/stl_algo.h
@@ -33,8 +33,7 @@
#include <bits/stl_heap.h>
-// See concept_checks.h for the concept-checking macros
-// __STL_REQUIRES, __STL_CONVERTIBLE, etc.
+// See concept_check.h for the glibcpp_*_requires macros.
namespace std
{
@@ -42,8 +41,10 @@ namespace std
// __median (an extension, not present in the C++ standard).
template <class _Tp>
-inline const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c) {
- __STL_REQUIRES(_Tp, _LessThanComparable);
+inline const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c)
+{
+ // concept requirements
+ glibcpp_function_requires(LessThanComparableConcept<_Tp>);
if (__a < __b)
if (__b < __c)
return __b;
@@ -61,8 +62,10 @@ inline const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c) {
template <class _Tp, class _Compare>
inline const _Tp&
-__median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) {
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
+__median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(BinaryFunctionConcept<_Compare, bool, _Tp, _Tp>);
if (__comp(__a, __b))
if (__comp(__b, __c))
return __b;
@@ -80,8 +83,10 @@ __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) {
// for_each. Apply a function to every element of a range.
template <class _InputIter, class _Function>
-_Function for_each(_InputIter __first, _InputIter __last, _Function __f) {
- __STL_REQUIRES(_InputIter, _InputIterator);
+_Function for_each(_InputIter __first, _InputIter __last, _Function __f)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
for ( ; __first != __last; ++__first)
__f(*__first);
return __f;
@@ -189,28 +194,33 @@ template <class _InputIter, class _Tp>
inline _InputIter find(_InputIter __first, _InputIter __last,
const _Tp& __val)
{
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
- typename iterator_traits<_InputIter>::value_type, _Tp);
- return find(__first, __last, __val, __ITERATOR_CATEGORY(__first));
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(EqualOpConcept<
+ typename iterator_traits<_InputIter>::value_type, _Tp>);
+ return find(__first, __last, __val, __iterator_category(__first));
}
template <class _InputIter, class _Predicate>
inline _InputIter find_if(_InputIter __first, _InputIter __last,
- _Predicate __pred) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
- typename iterator_traits<_InputIter>::value_type);
- return find_if(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
+ _Predicate __pred)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(UnaryPredicateConcept<_Predicate,
+ typename iterator_traits<_InputIter>::value_type>);
+ return find_if(__first, __last, __pred, __iterator_category(__first));
}
// adjacent_find.
template <class _ForwardIter>
-_ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
- _EqualityComparable);
+_ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(EqualityComparableConcept<
+ typename iterator_traits<_ForwardIter>::value_type>);
if (__first == __last)
return __last;
_ForwardIter __next = __first;
@@ -224,11 +234,13 @@ _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) {
template <class _ForwardIter, class _BinaryPredicate>
_ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,
- _BinaryPredicate __binary_pred) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
- typename iterator_traits<_ForwardIter>::value_type,
- typename iterator_traits<_ForwardIter>::value_type);
+ _BinaryPredicate __binary_pred)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_BinaryPredicate,
+ typename iterator_traits<_ForwardIter>::value_type,
+ typename iterator_traits<_ForwardIter>::value_type>);
if (__first == __last)
return __last;
_ForwardIter __next = __first;
@@ -248,11 +260,13 @@ _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,
template <class _InputIter, class _Tp, class _Size>
void count(_InputIter __first, _InputIter __last, const _Tp& __value,
- _Size& __n) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
- _EqualityComparable);
- __STL_REQUIRES(_Tp, _EqualityComparable);
+ _Size& __n)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(EqualityComparableConcept<
+ typename iterator_traits<_InputIter>::value_type >);
+ glibcpp_function_requires(EqualityComparableConcept<_Tp>);
for ( ; __first != __last; ++__first)
if (*__first == __value)
++__n;
@@ -260,10 +274,12 @@ void count(_InputIter __first, _InputIter __last, const _Tp& __value,
template <class _InputIter, class _Predicate, class _Size>
void count_if(_InputIter __first, _InputIter __last, _Predicate __pred,
- _Size& __n) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
- typename iterator_traits<_InputIter>::value_type);
+ _Size& __n)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(UnaryPredicateConcept<_Predicate,
+ typename iterator_traits<_InputIter>::value_type>);
for ( ; __first != __last; ++__first)
if (__pred(*__first))
++__n;
@@ -271,11 +287,13 @@ void count_if(_InputIter __first, _InputIter __last, _Predicate __pred,
template <class _InputIter, class _Tp>
typename iterator_traits<_InputIter>::difference_type
-count(_InputIter __first, _InputIter __last, const _Tp& __value) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
- _EqualityComparable);
- __STL_REQUIRES(_Tp, _EqualityComparable);
+count(_InputIter __first, _InputIter __last, const _Tp& __value)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(EqualityComparableConcept<
+ typename iterator_traits<_InputIter>::value_type >);
+ glibcpp_function_requires(EqualityComparableConcept<_Tp>);
typename iterator_traits<_InputIter>::difference_type __n = 0;
for ( ; __first != __last; ++__first)
if (*__first == __value)
@@ -285,10 +303,12 @@ count(_InputIter __first, _InputIter __last, const _Tp& __value) {
template <class _InputIter, class _Predicate>
typename iterator_traits<_InputIter>::difference_type
-count_if(_InputIter __first, _InputIter __last, _Predicate __pred) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
- typename iterator_traits<_InputIter>::value_type);
+count_if(_InputIter __first, _InputIter __last, _Predicate __pred)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(UnaryPredicateConcept<_Predicate,
+ typename iterator_traits<_InputIter>::value_type>);
typename iterator_traits<_InputIter>::difference_type __n = 0;
for ( ; __first != __last; ++__first)
if (__pred(*__first))
@@ -303,11 +323,12 @@ template <class _ForwardIter1, class _ForwardIter2>
_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
_ForwardIter2 __first2, _ForwardIter2 __last2)
{
- __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
- __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
- __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
- typename iterator_traits<_ForwardIter1>::value_type,
- typename iterator_traits<_ForwardIter2>::value_type);
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter1>);
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter2>);
+ glibcpp_function_requires(EqualOpConcept<
+ typename iterator_traits<_ForwardIter1>::value_type,
+ typename iterator_traits<_ForwardIter2>::value_type>);
// Test for empty ranges
if (__first1 == __last1 || __first2 == __last2)
@@ -354,11 +375,12 @@ _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
_ForwardIter2 __first2, _ForwardIter2 __last2,
_BinaryPred __predicate)
{
- __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
- __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
- __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,
- typename iterator_traits<_ForwardIter1>::value_type,
- typename iterator_traits<_ForwardIter2>::value_type);
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter1>);
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter2>);
+ glibcpp_function_requires(BinaryPredicateConcept<_BinaryPred,
+ typename iterator_traits<_ForwardIter1>::value_type,
+ typename iterator_traits<_ForwardIter2>::value_type>);
// Test for empty ranges
if (__first1 == __last1 || __first2 == __last2)
@@ -412,11 +434,13 @@ _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
template <class _ForwardIter, class _Integer, class _Tp>
_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
- _Integer __count, const _Tp& __val) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
- _EqualityComparable);
- __STL_REQUIRES(_Tp, _EqualityComparable);
+ _Integer __count, const _Tp& __val)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(EqualityComparableConcept<
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(EqualityComparableConcept<_Tp>);
if (__count <= 0)
return __first;
@@ -442,10 +466,13 @@ _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
_Integer __count, const _Tp& __val,
- _BinaryPred __binary_pred) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,
- typename iterator_traits<_ForwardIter>::value_type, _Tp);
+ _BinaryPred __binary_pred)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_BinaryPred,
+ typename iterator_traits<_ForwardIter>::value_type, _Tp>);
+
if (__count <= 0)
return __first;
else {
@@ -481,13 +508,18 @@ _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter1, class _ForwardIter2>
_ForwardIter2 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
- _ForwardIter2 __first2) {
- __STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator);
- __STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator);
- __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type,
- typename iterator_traits<_ForwardIter2>::value_type);
- __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type,
- typename iterator_traits<_ForwardIter1>::value_type);
+ _ForwardIter2 __first2)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter1>);
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter2>);
+ glibcpp_function_requires(ConvertibleConcept<
+ typename iterator_traits<_ForwardIter1>::value_type,
+ typename iterator_traits<_ForwardIter2>::value_type>);
+ glibcpp_function_requires(ConvertibleConcept<
+ typename iterator_traits<_ForwardIter2>::value_type,
+ typename iterator_traits<_ForwardIter1>::value_type>);
+
for ( ; __first1 != __last1; ++__first1, ++__first2)
iter_swap(__first1, __first2);
return __first2;
@@ -497,9 +529,12 @@ _ForwardIter2 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
template <class _InputIter, class _OutputIter, class _UnaryOperation>
_OutputIter transform(_InputIter __first, _InputIter __last,
- _OutputIter __result, _UnaryOperation __unary_op) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
+ _OutputIter __result, _UnaryOperation __unary_op)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter>::value_type>);
for ( ; __first != __last; ++__first, ++__result)
*__result = __unary_op(*__first);
@@ -510,10 +545,15 @@ template <class _InputIter1, class _InputIter2, class _OutputIter,
class _BinaryOperation>
_OutputIter transform(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _OutputIter __result,
- _BinaryOperation __binary_op) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
+ _BinaryOperation __binary_op)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ // XXX really should be "the type returned by _BinaryOperation
+ typename iterator_traits<_InputIter1>::value_type>);
+
for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
*__result = __binary_op(*__first1, *__first2);
return __result;
@@ -523,11 +563,15 @@ _OutputIter transform(_InputIter1 __first1, _InputIter1 __last1,
template <class _ForwardIter, class _Tp>
void replace(_ForwardIter __first, _ForwardIter __last,
- const _Tp& __old_value, const _Tp& __new_value) {
- __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
- __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
- typename iterator_traits<_ForwardIter>::value_type, _Tp);
- __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
+ const _Tp& __old_value, const _Tp& __new_value)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(EqualOpConcept<
+ typename iterator_traits<_ForwardIter>::value_type, _Tp>);
+ glibcpp_function_requires(ConvertibleConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
for ( ; __first != __last; ++__first)
if (*__first == __old_value)
*__first = __new_value;
@@ -535,11 +579,15 @@ void replace(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter, class _Predicate, class _Tp>
void replace_if(_ForwardIter __first, _ForwardIter __last,
- _Predicate __pred, const _Tp& __new_value) {
- __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
- __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
- __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
- typename iterator_traits<_ForwardIter>::value_type);
+ _Predicate __pred, const _Tp& __new_value)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(ConvertibleConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(UnaryPredicateConcept<_Predicate,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
for ( ; __first != __last; ++__first)
if (__pred(*__first))
*__first = __new_value;
@@ -548,11 +596,15 @@ void replace_if(_ForwardIter __first, _ForwardIter __last,
template <class _InputIter, class _OutputIter, class _Tp>
_OutputIter replace_copy(_InputIter __first, _InputIter __last,
_OutputIter __result,
- const _Tp& __old_value, const _Tp& __new_value) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
- typename iterator_traits<_InputIter>::value_type, _Tp);
+ const _Tp& __old_value, const _Tp& __new_value)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter>::value_type>);
+ glibcpp_function_requires(EqualOpConcept<
+ typename iterator_traits<_InputIter>::value_type, _Tp>);
+
for ( ; __first != __last; ++__first, ++__result)
*__result = *__first == __old_value ? __new_value : *__first;
return __result;
@@ -561,11 +613,15 @@ _OutputIter replace_copy(_InputIter __first, _InputIter __last,
template <class _InputIter, class _OutputIter, class _Predicate, class _Tp>
_OutputIter replace_copy_if(_InputIter __first, _InputIter __last,
_OutputIter __result,
- _Predicate __pred, const _Tp& __new_value) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
- typename iterator_traits<_InputIter>::value_type);
+ _Predicate __pred, const _Tp& __new_value)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter>::value_type>);
+ glibcpp_function_requires(UnaryPredicateConcept<_Predicate,
+ typename iterator_traits<_InputIter>::value_type>);
+
for ( ; __first != __last; ++__first, ++__result)
*__result = __pred(*__first) ? __new_value : *__first;
return __result;
@@ -574,17 +630,26 @@ _OutputIter replace_copy_if(_InputIter __first, _InputIter __last,
// generate and generate_n
template <class _ForwardIter, class _Generator>
-void generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_GENERATOR_CHECK(_Generator,
- typename iterator_traits<_ForwardIter>::value_type);
+void generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(GeneratorConcept<_Generator,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
for ( ; __first != __last; ++__first)
*__first = __gen();
}
template <class _OutputIter, class _Size, class _Generator>
-_OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
- __STL_REQUIRES(_OutputIter, _OutputIterator);
+_OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen)
+{
+/*
+ // XXX concept requirements
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ "the return type of _Generator" ?? >);
+*/
+
for ( ; __n > 0; --__n, ++__first)
*__first = __gen();
return __first;
@@ -594,11 +659,15 @@ _OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
template <class _InputIter, class _OutputIter, class _Tp>
_OutputIter remove_copy(_InputIter __first, _InputIter __last,
- _OutputIter __result, const _Tp& __value) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
- typename iterator_traits<_InputIter>::value_type, _Tp);
+ _OutputIter __result, const _Tp& __value)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter>::value_type>);
+ glibcpp_function_requires(EqualOpConcept<
+ typename iterator_traits<_InputIter>::value_type, _Tp>);
+
for ( ; __first != __last; ++__first)
if (!(*__first == __value)) {
*__result = *__first;
@@ -609,11 +678,15 @@ _OutputIter remove_copy(_InputIter __first, _InputIter __last,
template <class _InputIter, class _OutputIter, class _Predicate>
_OutputIter remove_copy_if(_InputIter __first, _InputIter __last,
- _OutputIter __result, _Predicate __pred) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
- typename iterator_traits<_InputIter>::value_type);
+ _OutputIter __result, _Predicate __pred)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter>::value_type>);
+ glibcpp_function_requires(UnaryPredicateConcept<_Predicate,
+ typename iterator_traits<_InputIter>::value_type>);
+
for ( ; __first != __last; ++__first)
if (!__pred(*__first)) {
*__result = *__first;
@@ -624,11 +697,15 @@ _OutputIter remove_copy_if(_InputIter __first, _InputIter __last,
template <class _ForwardIter, class _Tp>
_ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
- const _Tp& __value) {
- __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
- __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
- typename iterator_traits<_ForwardIter>::value_type, _Tp);
- __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
+ const _Tp& __value)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(ConvertibleConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(EqualOpConcept<
+ typename iterator_traits<_ForwardIter>::value_type, _Tp>);
+
__first = find(__first, __last, __value);
_ForwardIter __i = __first;
return __first == __last ? __first
@@ -637,10 +714,13 @@ _ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter, class _Predicate>
_ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
- _Predicate __pred) {
- __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
- __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
- typename iterator_traits<_ForwardIter>::value_type);
+ _Predicate __pred)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(UnaryPredicateConcept<_Predicate,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
__first = find_if(__first, __last, __pred);
_ForwardIter __i = __first;
return __first == __last ? __first
@@ -651,7 +731,9 @@ _ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
template <class _InputIter, class _OutputIter, class _Tp>
_OutputIter __unique_copy(_InputIter __first, _InputIter __last,
- _OutputIter __result, _Tp*) {
+ _OutputIter __result, _Tp*)
+{
+ // concept requirements -- taken care of in dispatching function
_Tp __value = *__first;
*__result = __value;
while (++__first != __last)
@@ -665,13 +747,17 @@ _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
template <class _InputIter, class _OutputIter>
inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
_OutputIter __result,
- output_iterator_tag) {
- return __unique_copy(__first, __last, __result, __VALUE_TYPE(__first));
+ output_iterator_tag)
+{
+ // concept requirements -- taken care of in dispatching function
+ return __unique_copy(__first, __last, __result, __value_type(__first));
}
template <class _InputIter, class _ForwardIter>
_ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
- _ForwardIter __result, forward_iterator_tag) {
+ _ForwardIter __result, forward_iterator_tag)
+{
+ // concept requirements -- taken care of in dispatching function
*__result = *__first;
while (++__first != __last)
if (!(*__result == *__first))
@@ -681,22 +767,29 @@ _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
template <class _InputIter, class _OutputIter>
inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
- _OutputIter __result) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
- _EqualityComparable);
+ _OutputIter __result)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter>::value_type>);
+ glibcpp_function_requires(EqualityComparableConcept<
+ typename iterator_traits<_InputIter>::value_type>);
+
if (__first == __last) return __result;
return __unique_copy(__first, __last, __result,
- __ITERATOR_CATEGORY(__result));
+ __iterator_category(__result));
}
template <class _InputIter, class _OutputIter, class _BinaryPredicate,
class _Tp>
_OutputIter __unique_copy(_InputIter __first, _InputIter __last,
_OutputIter __result,
- _BinaryPredicate __binary_pred, _Tp*) {
- __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, _Tp, _Tp);
+ _BinaryPredicate __binary_pred, _Tp*)
+{
+ // concept requirements -- iterators already checked
+ glibcpp_function_requires(BinaryPredicateConcept<_BinaryPredicate, _Tp, _Tp>);
+
_Tp __value = *__first;
*__result = __value;
while (++__first != __last)
@@ -711,19 +804,24 @@ template <class _InputIter, class _OutputIter, class _BinaryPredicate>
inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
_OutputIter __result,
_BinaryPredicate __binary_pred,
- output_iterator_tag) {
+ output_iterator_tag)
+{
+ // concept requirements -- taken care of in dispatching function
return __unique_copy(__first, __last, __result, __binary_pred,
- __VALUE_TYPE(__first));
+ __value_type(__first));
}
template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
_ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
_ForwardIter __result,
_BinaryPredicate __binary_pred,
- forward_iterator_tag) {
- __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
- typename iterator_traits<_ForwardIter>::value_type,
- typename iterator_traits<_InputIter>::value_type);
+ forward_iterator_tag)
+{
+ // concept requirements -- iterators already checked
+ glibcpp_function_requires(BinaryPredicateConcept<_BinaryPredicate,
+ typename iterator_traits<_ForwardIter>::value_type,
+ typename iterator_traits<_InputIter>::value_type>);
+
*__result = *__first;
while (++__first != __last)
if (!__binary_pred(*__result, *__first)) *++__result = *__first;
@@ -733,30 +831,40 @@ _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
template <class _InputIter, class _OutputIter, class _BinaryPredicate>
inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
_OutputIter __result,
- _BinaryPredicate __binary_pred) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
+ _BinaryPredicate __binary_pred)
+{
+ // concept requirements -- predicates checked later
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter>::value_type>);
+
if (__first == __last) return __result;
return __unique_copy(__first, __last, __result, __binary_pred,
- __ITERATOR_CATEGORY(__result));
+ __iterator_category(__result));
}
template <class _ForwardIter>
-_ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
- __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
- __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
- _EqualityComparable);
+_ForwardIter unique(_ForwardIter __first, _ForwardIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(EqualityComparableConcept<
+ typename iterator_traits<_ForwardIter>::value_type>);
+
__first = adjacent_find(__first, __last);
return unique_copy(__first, __last, __first);
}
template <class _ForwardIter, class _BinaryPredicate>
_ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
- _BinaryPredicate __binary_pred) {
- __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
- __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
- typename iterator_traits<_ForwardIter>::value_type,
- typename iterator_traits<_ForwardIter>::value_type);
+ _BinaryPredicate __binary_pred)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_BinaryPredicate,
+ typename iterator_traits<_ForwardIter>::value_type,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
__first = adjacent_find(__first, __last, __binary_pred);
return unique_copy(__first, __last, __first, __binary_pred);
}
@@ -781,17 +889,24 @@ void __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
}
template <class _BidirectionalIter>
-inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
- __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
- __reverse(__first, __last, __ITERATOR_CATEGORY(__first));
+inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_BidirectionalIteratorConcept<
+ _BidirectionalIter>);
+ __reverse(__first, __last, __iterator_category(__first));
}
template <class _BidirectionalIter, class _OutputIter>
_OutputIter reverse_copy(_BidirectionalIter __first,
_BidirectionalIter __last,
- _OutputIter __result) {
- __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
+ _OutputIter __result)
+{
+ // concept requirements
+ glibcpp_function_requires(BidirectionalIteratorConcept<_BidirectionalIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_BidirectionalIter>::value_type>);
+
while (__first != __last) {
--__last;
*__result = *__last;
@@ -819,7 +934,8 @@ _ForwardIter __rotate(_ForwardIter __first,
_ForwardIter __middle,
_ForwardIter __last,
_Distance*,
- forward_iterator_tag) {
+ forward_iterator_tag)
+{
if (__first == __middle)
return __last;
if (__last == __middle)
@@ -853,8 +969,12 @@ _BidirectionalIter __rotate(_BidirectionalIter __first,
_BidirectionalIter __middle,
_BidirectionalIter __last,
_Distance*,
- bidirectional_iterator_tag) {
- __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
+ bidirectional_iterator_tag)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_BidirectionalIteratorConcept<
+ _BidirectionalIter>);
+
if (__first == __middle)
return __last;
if (__last == __middle)
@@ -880,8 +1000,12 @@ template <class _RandomAccessIter, class _Distance, class _Tp>
_RandomAccessIter __rotate(_RandomAccessIter __first,
_RandomAccessIter __middle,
_RandomAccessIter __last,
- _Distance *, _Tp *) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
+ _Distance *, _Tp *)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+
_Distance __n = __last - __first;
_Distance __k = __middle - __first;
_Distance __l = __n - __k;
@@ -934,18 +1058,25 @@ _RandomAccessIter __rotate(_RandomAccessIter __first,
template <class _ForwardIter>
inline _ForwardIter rotate(_ForwardIter __first, _ForwardIter __middle,
- _ForwardIter __last) {
- __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
+ _ForwardIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>);
+
return __rotate(__first, __middle, __last,
- __DISTANCE_TYPE(__first),
- __ITERATOR_CATEGORY(__first));
+ __distance_type(__first),
+ __iterator_category(__first));
}
template <class _ForwardIter, class _OutputIter>
_OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle,
- _ForwardIter __last, _OutputIter __result) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
+ _ForwardIter __last, _OutputIter __result)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
return copy(__first, __middle, copy(__middle, __last, __result));
}
@@ -966,8 +1097,12 @@ inline _Distance __random_number(_Distance __n) {
template <class _RandomAccessIter>
inline void random_shuffle(_RandomAccessIter __first,
- _RandomAccessIter __last) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
+ _RandomAccessIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+
if (__first == __last) return;
for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
iter_swap(__i, __first + __random_number((__i - __first) + 1));
@@ -975,8 +1110,12 @@ inline void random_shuffle(_RandomAccessIter __first,
template <class _RandomAccessIter, class _RandomNumberGenerator>
void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
- _RandomNumberGenerator& __rand) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
+ _RandomNumberGenerator& __rand)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+
if (__first == __last) return;
for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
iter_swap(__i, __first + __rand((__i - __first) + 1));
@@ -988,8 +1127,11 @@ template <class _ForwardIter, class _OutputIter, class _Distance>
_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
_OutputIter __out, const _Distance __n)
{
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
_Distance __remaining = 0;
distance(__first, __last, __remaining);
_Distance __m = min(__n, __remaining);
@@ -1013,9 +1155,13 @@ _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
_OutputIter __out, const _Distance __n,
_RandomNumberGenerator& __rand)
{
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance);
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(UnaryFunctionConcept<
+ _RandomNumberGenerator, _Distance, _Distance>);
+
_Distance __remaining = 0;
distance(__first, __last, __remaining);
_Distance __m = min(__n, __remaining);
@@ -1061,7 +1207,10 @@ _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
_RandomNumberGenerator& __rand,
const _Distance __n)
{
- __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance);
+ // concept requirements
+ glibcpp_function_requires(UnaryFunctionConcept<
+ _RandomNumberGenerator, _Distance, _Distance>);
+
_Distance __m = 0;
_Distance __t = __n;
for ( ; __first != __last && __m < __n; ++__m, ++__first)
@@ -1083,8 +1232,11 @@ inline _RandomAccessIter
random_sample(_InputIter __first, _InputIter __last,
_RandomAccessIter __out_first, _RandomAccessIter __out_last)
{
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+
return __random_sample(__first, __last,
__out_first, __out_last - __out_first);
}
@@ -1097,8 +1249,11 @@ random_sample(_InputIter __first, _InputIter __last,
_RandomAccessIter __out_first, _RandomAccessIter __out_last,
_RandomNumberGenerator& __rand)
{
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+
return __random_sample(__first, __last,
__out_first, __rand,
__out_last - __out_first);
@@ -1110,7 +1265,8 @@ template <class _ForwardIter, class _Predicate>
_ForwardIter __partition(_ForwardIter __first,
_ForwardIter __last,
_Predicate __pred,
- forward_iterator_tag) {
+ forward_iterator_tag)
+{
if (__first == __last) return __first;
while (__pred(*__first))
@@ -1131,7 +1287,8 @@ template <class _BidirectionalIter, class _Predicate>
_BidirectionalIter __partition(_BidirectionalIter __first,
_BidirectionalIter __last,
_Predicate __pred,
- bidirectional_iterator_tag) {
+ bidirectional_iterator_tag)
+{
while (true) {
while (true)
if (__first == __last)
@@ -1156,18 +1313,22 @@ _BidirectionalIter __partition(_BidirectionalIter __first,
template <class _ForwardIter, class _Predicate>
inline _ForwardIter partition(_ForwardIter __first,
_ForwardIter __last,
- _Predicate __pred) {
- __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
- __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
- typename iterator_traits<_ForwardIter>::value_type);
- return __partition(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
+ _Predicate __pred)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(UnaryPredicateConcept<_Predicate,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
+ return __partition(__first, __last, __pred, __iterator_category(__first));
}
template <class _ForwardIter, class _Predicate, class _Distance>
_ForwardIter __inplace_stable_partition(_ForwardIter __first,
_ForwardIter __last,
- _Predicate __pred, _Distance __len) {
+ _Predicate __pred, _Distance __len)
+{
if (__len == 1)
return __pred(*__first) ? __last : __first;
_ForwardIter __middle = __first;
@@ -1233,16 +1394,19 @@ __stable_partition_aux(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter, class _Predicate>
inline _ForwardIter stable_partition(_ForwardIter __first,
_ForwardIter __last,
- _Predicate __pred) {
- __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
- __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
- typename iterator_traits<_ForwardIter>::value_type);
+ _Predicate __pred)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(UnaryPredicateConcept<_Predicate,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
if (__first == __last)
return __first;
else
return __stable_partition_aux(__first, __last, __pred,
- __VALUE_TYPE(__first),
- __DISTANCE_TYPE(__first));
+ __value_type(__first),
+ __distance_type(__first));
}
template <class _RandomAccessIter, class _Tp>
@@ -1286,7 +1450,8 @@ const int __stl_threshold = 16;
// sort() and its auxiliary functions.
template <class _RandomAccessIter, class _Tp>
-void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val) {
+void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val)
+{
_RandomAccessIter __next = __last;
--__next;
while (__val < *__next) {
@@ -1299,7 +1464,8 @@ void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val) {
template <class _RandomAccessIter, class _Tp, class _Compare>
void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val,
- _Compare __comp) {
+ _Compare __comp)
+{
_RandomAccessIter __next = __last;
--__next;
while (__comp(__val, *__next)) {
@@ -1312,7 +1478,8 @@ void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val,
template <class _RandomAccessIter, class _Tp>
inline void __linear_insert(_RandomAccessIter __first,
- _RandomAccessIter __last, _Tp*) {
+ _RandomAccessIter __last, _Tp*)
+{
_Tp __val = *__last;
if (__val < *__first) {
copy_backward(__first, __last, __last + 1);
@@ -1324,7 +1491,8 @@ inline void __linear_insert(_RandomAccessIter __first,
template <class _RandomAccessIter, class _Tp, class _Compare>
inline void __linear_insert(_RandomAccessIter __first,
- _RandomAccessIter __last, _Tp*, _Compare __comp) {
+ _RandomAccessIter __last, _Tp*, _Compare __comp)
+{
_Tp __val = *__last;
if (__comp(__val, *__first)) {
copy_backward(__first, __last, __last + 1);
@@ -1335,23 +1503,26 @@ inline void __linear_insert(_RandomAccessIter __first,
}
template <class _RandomAccessIter>
-void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last) {
+void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last)
+{
if (__first == __last) return;
for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
- __linear_insert(__first, __i, __VALUE_TYPE(__first));
+ __linear_insert(__first, __i, __value_type(__first));
}
template <class _RandomAccessIter, class _Compare>
void __insertion_sort(_RandomAccessIter __first,
- _RandomAccessIter __last, _Compare __comp) {
+ _RandomAccessIter __last, _Compare __comp)
+{
if (__first == __last) return;
for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
- __linear_insert(__first, __i, __VALUE_TYPE(__first), __comp);
+ __linear_insert(__first, __i, __value_type(__first), __comp);
}
template <class _RandomAccessIter, class _Tp>
void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
- _RandomAccessIter __last, _Tp*) {
+ _RandomAccessIter __last, _Tp*)
+{
for (_RandomAccessIter __i = __first; __i != __last; ++__i)
__unguarded_linear_insert(__i, _Tp(*__i));
}
@@ -1359,13 +1530,14 @@ void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
template <class _RandomAccessIter>
inline void __unguarded_insertion_sort(_RandomAccessIter __first,
_RandomAccessIter __last) {
- __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first));
+ __unguarded_insertion_sort_aux(__first, __last, __value_type(__first));
}
template <class _RandomAccessIter, class _Tp, class _Compare>
void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
_RandomAccessIter __last,
- _Tp*, _Compare __comp) {
+ _Tp*, _Compare __comp)
+{
for (_RandomAccessIter __i = __first; __i != __last; ++__i)
__unguarded_linear_insert(__i, _Tp(*__i), __comp);
}
@@ -1373,14 +1545,16 @@ void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
template <class _RandomAccessIter, class _Compare>
inline void __unguarded_insertion_sort(_RandomAccessIter __first,
_RandomAccessIter __last,
- _Compare __comp) {
- __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first),
+ _Compare __comp)
+{
+ __unguarded_insertion_sort_aux(__first, __last, __value_type(__first),
__comp);
}
template <class _RandomAccessIter>
void __final_insertion_sort(_RandomAccessIter __first,
- _RandomAccessIter __last) {
+ _RandomAccessIter __last)
+{
if (__last - __first > __stl_threshold) {
__insertion_sort(__first, __first + __stl_threshold);
__unguarded_insertion_sort(__first + __stl_threshold, __last);
@@ -1391,7 +1565,8 @@ void __final_insertion_sort(_RandomAccessIter __first,
template <class _RandomAccessIter, class _Compare>
void __final_insertion_sort(_RandomAccessIter __first,
- _RandomAccessIter __last, _Compare __comp) {
+ _RandomAccessIter __last, _Compare __comp)
+{
if (__last - __first > __stl_threshold) {
__insertion_sort(__first, __first + __stl_threshold, __comp);
__unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
@@ -1401,7 +1576,8 @@ void __final_insertion_sort(_RandomAccessIter __first,
}
template <class _Size>
-inline _Size __lg(_Size __n) {
+inline _Size __lg(_Size __n)
+{
_Size __k;
for (__k = 0; __n != 1; __n >>= 1) ++__k;
return __k;
@@ -1451,13 +1627,17 @@ void __introsort_loop(_RandomAccessIter __first,
}
template <class _RandomAccessIter>
-inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
- _LessThanComparable);
+inline void sort(_RandomAccessIter __first, _RandomAccessIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
if (__first != __last) {
__introsort_loop(__first, __last,
- __VALUE_TYPE(__first),
+ __value_type(__first),
__lg(__last - __first) * 2);
__final_insertion_sort(__first, __last);
}
@@ -1465,14 +1645,18 @@ inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
template <class _RandomAccessIter, class _Compare>
inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,
- _Compare __comp) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_RandomAccessIter>::value_type,
- typename iterator_traits<_RandomAccessIter>::value_type);
+ _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_RandomAccessIter>::value_type,
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
if (__first != __last) {
__introsort_loop(__first, __last,
- __VALUE_TYPE(__first),
+ __value_type(__first),
__lg(__last - __first) * 2,
__comp);
__final_insertion_sort(__first, __last, __comp);
@@ -1483,7 +1667,8 @@ inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,
template <class _RandomAccessIter>
void __inplace_stable_sort(_RandomAccessIter __first,
- _RandomAccessIter __last) {
+ _RandomAccessIter __last)
+{
if (__last - __first < 15) {
__insertion_sort(__first, __last);
return;
@@ -1498,7 +1683,8 @@ void __inplace_stable_sort(_RandomAccessIter __first,
template <class _RandomAccessIter, class _Compare>
void __inplace_stable_sort(_RandomAccessIter __first,
- _RandomAccessIter __last, _Compare __comp) {
+ _RandomAccessIter __last, _Compare __comp)
+{
if (__last - __first < 15) {
__insertion_sort(__first, __last, __comp);
return;
@@ -1516,7 +1702,8 @@ template <class _RandomAccessIter1, class _RandomAccessIter2,
class _Distance>
void __merge_sort_loop(_RandomAccessIter1 __first,
_RandomAccessIter1 __last,
- _RandomAccessIter2 __result, _Distance __step_size) {
+ _RandomAccessIter2 __result, _Distance __step_size)
+{
_Distance __two_step = 2 * __step_size;
while (__last - __first >= __two_step) {
@@ -1536,7 +1723,8 @@ template <class _RandomAccessIter1, class _RandomAccessIter2,
void __merge_sort_loop(_RandomAccessIter1 __first,
_RandomAccessIter1 __last,
_RandomAccessIter2 __result, _Distance __step_size,
- _Compare __comp) {
+ _Compare __comp)
+{
_Distance __two_step = 2 * __step_size;
while (__last - __first >= __two_step) {
@@ -1582,7 +1770,8 @@ void __chunk_insertion_sort(_RandomAccessIter __first,
template <class _RandomAccessIter, class _Pointer, class _Distance>
void __merge_sort_with_buffer(_RandomAccessIter __first,
_RandomAccessIter __last,
- _Pointer __buffer, _Distance*) {
+ _Pointer __buffer, _Distance*)
+{
_Distance __len = __last - __first;
_Pointer __buffer_last = __buffer + __len;
@@ -1601,7 +1790,8 @@ template <class _RandomAccessIter, class _Pointer, class _Distance,
class _Compare>
void __merge_sort_with_buffer(_RandomAccessIter __first,
_RandomAccessIter __last, _Pointer __buffer,
- _Distance*, _Compare __comp) {
+ _Distance*, _Compare __comp)
+{
_Distance __len = __last - __first;
_Pointer __buffer_last = __buffer + __len;
@@ -1619,7 +1809,8 @@ void __merge_sort_with_buffer(_RandomAccessIter __first,
template <class _RandomAccessIter, class _Pointer, class _Distance>
void __stable_sort_adaptive(_RandomAccessIter __first,
_RandomAccessIter __last, _Pointer __buffer,
- _Distance __buffer_size) {
+ _Distance __buffer_size)
+{
_Distance __len = (__last - __first + 1) / 2;
_RandomAccessIter __middle = __first + __len;
if (__len > __buffer_size) {
@@ -1638,7 +1829,8 @@ template <class _RandomAccessIter, class _Pointer, class _Distance,
class _Compare>
void __stable_sort_adaptive(_RandomAccessIter __first,
_RandomAccessIter __last, _Pointer __buffer,
- _Distance __buffer_size, _Compare __comp) {
+ _Distance __buffer_size, _Compare __comp)
+{
_Distance __len = (__last - __first + 1) / 2;
_RandomAccessIter __middle = __first + __len;
if (__len > __buffer_size) {
@@ -1660,7 +1852,8 @@ void __stable_sort_adaptive(_RandomAccessIter __first,
template <class _RandomAccessIter, class _Tp, class _Distance>
inline void __stable_sort_aux(_RandomAccessIter __first,
- _RandomAccessIter __last, _Tp*, _Distance*) {
+ _RandomAccessIter __last, _Tp*, _Distance*)
+{
_Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
if (buf.begin() == 0)
__inplace_stable_sort(__first, __last);
@@ -1672,7 +1865,8 @@ inline void __stable_sort_aux(_RandomAccessIter __first,
template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>
inline void __stable_sort_aux(_RandomAccessIter __first,
_RandomAccessIter __last, _Tp*, _Distance*,
- _Compare __comp) {
+ _Compare __comp)
+{
_Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
if (buf.begin() == 0)
__inplace_stable_sort(__first, __last, __comp);
@@ -1684,25 +1878,33 @@ inline void __stable_sort_aux(_RandomAccessIter __first,
template <class _RandomAccessIter>
inline void stable_sort(_RandomAccessIter __first,
- _RandomAccessIter __last) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
- _LessThanComparable);
+ _RandomAccessIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
__stable_sort_aux(__first, __last,
- __VALUE_TYPE(__first),
- __DISTANCE_TYPE(__first));
+ __value_type(__first),
+ __distance_type(__first));
}
template <class _RandomAccessIter, class _Compare>
inline void stable_sort(_RandomAccessIter __first,
- _RandomAccessIter __last, _Compare __comp) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_RandomAccessIter>::value_type,
- typename iterator_traits<_RandomAccessIter>::value_type);
+ _RandomAccessIter __last, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_RandomAccessIter>::value_type,
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
__stable_sort_aux(__first, __last,
- __VALUE_TYPE(__first),
- __DISTANCE_TYPE(__first),
+ __value_type(__first),
+ __distance_type(__first),
__comp);
}
@@ -1710,45 +1912,55 @@ inline void stable_sort(_RandomAccessIter __first,
template <class _RandomAccessIter, class _Tp>
void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
- _RandomAccessIter __last, _Tp*) {
+ _RandomAccessIter __last, _Tp*)
+{
make_heap(__first, __middle);
for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
if (*__i < *__first)
__pop_heap(__first, __middle, __i, _Tp(*__i),
- __DISTANCE_TYPE(__first));
+ __distance_type(__first));
sort_heap(__first, __middle);
}
template <class _RandomAccessIter>
inline void partial_sort(_RandomAccessIter __first,
_RandomAccessIter __middle,
- _RandomAccessIter __last) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
- _LessThanComparable);
- __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first));
+ _RandomAccessIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
+ __partial_sort(__first, __middle, __last, __value_type(__first));
}
template <class _RandomAccessIter, class _Tp, class _Compare>
void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
- _RandomAccessIter __last, _Tp*, _Compare __comp) {
+ _RandomAccessIter __last, _Tp*, _Compare __comp)
+{
make_heap(__first, __middle, __comp);
for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
if (__comp(*__i, *__first))
__pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
- __DISTANCE_TYPE(__first));
+ __distance_type(__first));
sort_heap(__first, __middle, __comp);
}
template <class _RandomAccessIter, class _Compare>
inline void partial_sort(_RandomAccessIter __first,
_RandomAccessIter __middle,
- _RandomAccessIter __last, _Compare __comp) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_RandomAccessIter>::value_type,
- typename iterator_traits<_RandomAccessIter>::value_type);
- __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first), __comp);
+ _RandomAccessIter __last, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_RandomAccessIter>::value_type,
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
+ __partial_sort(__first, __middle, __last, __value_type(__first), __comp);
}
template <class _InputIter, class _RandomAccessIter, class _Distance,
@@ -1757,7 +1969,8 @@ _RandomAccessIter __partial_sort_copy(_InputIter __first,
_InputIter __last,
_RandomAccessIter __result_first,
_RandomAccessIter __result_last,
- _Distance*, _Tp*) {
+ _Distance*, _Tp*)
+{
if (__result_first == __result_last) return __result_last;
_RandomAccessIter __result_real_last = __result_first;
while(__first != __last && __result_real_last != __result_last) {
@@ -1781,18 +1994,21 @@ template <class _InputIter, class _RandomAccessIter>
inline _RandomAccessIter
partial_sort_copy(_InputIter __first, _InputIter __last,
_RandomAccessIter __result_first,
- _RandomAccessIter __result_last) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type,
- typename iterator_traits<_RandomAccessIter>::value_type);
- __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
- _LessThanComparable);
- __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
- _LessThanComparable);
+ _RandomAccessIter __result_last)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(ConvertibleConcept<
+ typename iterator_traits<_InputIter>::value_type,
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_InputIter>::value_type>);
+
return __partial_sort_copy(__first, __last, __result_first, __result_last,
- __DISTANCE_TYPE(__result_first),
- __VALUE_TYPE(__first));
+ __distance_type(__result_first),
+ __value_type(__first));
}
template <class _InputIter, class _RandomAccessIter, class _Compare,
@@ -1801,7 +2017,8 @@ _RandomAccessIter __partial_sort_copy(_InputIter __first,
_InputIter __last,
_RandomAccessIter __result_first,
_RandomAccessIter __result_last,
- _Compare __comp, _Distance*, _Tp*) {
+ _Compare __comp, _Distance*, _Tp*)
+{
if (__result_first == __result_last) return __result_last;
_RandomAccessIter __result_real_last = __result_first;
while(__first != __last && __result_real_last != __result_last) {
@@ -1826,25 +2043,31 @@ template <class _InputIter, class _RandomAccessIter, class _Compare>
inline _RandomAccessIter
partial_sort_copy(_InputIter __first, _InputIter __last,
_RandomAccessIter __result_first,
- _RandomAccessIter __result_last, _Compare __comp) {
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type,
- typename iterator_traits<_RandomAccessIter>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_RandomAccessIter>::value_type,
- typename iterator_traits<_RandomAccessIter>::value_type);
+ _RandomAccessIter __result_last, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+ glibcpp_function_requires(ConvertibleConcept<
+ typename iterator_traits<_InputIter>::value_type,
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_RandomAccessIter>::value_type,
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
return __partial_sort_copy(__first, __last, __result_first, __result_last,
__comp,
- __DISTANCE_TYPE(__result_first),
- __VALUE_TYPE(__first));
+ __distance_type(__result_first),
+ __value_type(__first));
}
// nth_element() and its auxiliary functions.
template <class _RandomAccessIter, class _Tp>
void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
- _RandomAccessIter __last, _Tp*) {
+ _RandomAccessIter __last, _Tp*)
+{
while (__last - __first > 3) {
_RandomAccessIter __cut =
__unguarded_partition(__first, __last,
@@ -1861,16 +2084,21 @@ void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
template <class _RandomAccessIter>
inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
- _RandomAccessIter __last) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
- _LessThanComparable);
- __nth_element(__first, __nth, __last, __VALUE_TYPE(__first));
+ _RandomAccessIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
+ __nth_element(__first, __nth, __last, __value_type(__first));
}
template <class _RandomAccessIter, class _Tp, class _Compare>
void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
- _RandomAccessIter __last, _Tp*, _Compare __comp) {
+ _RandomAccessIter __last, _Tp*, _Compare __comp)
+{
while (__last - __first > 3) {
_RandomAccessIter __cut =
__unguarded_partition(__first, __last,
@@ -1889,12 +2117,16 @@ void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
template <class _RandomAccessIter, class _Compare>
inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
- _RandomAccessIter __last, _Compare __comp) {
- __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_RandomAccessIter>::value_type,
- typename iterator_traits<_RandomAccessIter>::value_type);
- __nth_element(__first, __nth, __last, __VALUE_TYPE(__first), __comp);
+ _RandomAccessIter __last, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_RandomAccessIteratorConcept<
+ _RandomAccessIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_RandomAccessIter>::value_type,
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
+ __nth_element(__first, __nth, __last, __value_type(__first), __comp);
}
@@ -1926,13 +2158,16 @@ _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter, class _Tp>
inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
- const _Tp& __val) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES_SAME_TYPE(_Tp,
- typename iterator_traits<_ForwardIter>::value_type);
- __STL_REQUIRES(_Tp, _LessThanComparable);
+ const _Tp& __val)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(SameTypeConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<_Tp>);
+
return __lower_bound(__first, __last, __val,
- __DISTANCE_TYPE(__first));
+ __distance_type(__first));
}
template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
@@ -1961,13 +2196,16 @@ _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter, class _Tp, class _Compare>
inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
- const _Tp& __val, _Compare __comp) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES_SAME_TYPE(_Tp,
- typename iterator_traits<_ForwardIter>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
+ const _Tp& __val, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(SameTypeConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare, _Tp, _Tp>);
+
return __lower_bound(__first, __last, __val, __comp,
- __DISTANCE_TYPE(__first));
+ __distance_type(__first));
}
template <class _ForwardIter, class _Tp, class _Distance>
@@ -1996,13 +2234,16 @@ _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter, class _Tp>
inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
- const _Tp& __val) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES_SAME_TYPE(_Tp,
- typename iterator_traits<_ForwardIter>::value_type);
- __STL_REQUIRES(_Tp, _LessThanComparable);
+ const _Tp& __val)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(SameTypeConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<_Tp>);
+
return __upper_bound(__first, __last, __val,
- __DISTANCE_TYPE(__first));
+ __distance_type(__first));
}
template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
@@ -2031,13 +2272,16 @@ _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter, class _Tp, class _Compare>
inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
- const _Tp& __val, _Compare __comp) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES_SAME_TYPE(_Tp,
- typename iterator_traits<_ForwardIter>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
+ const _Tp& __val, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(SameTypeConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare, _Tp, _Tp>);
+
return __upper_bound(__first, __last, __val, __comp,
- __DISTANCE_TYPE(__first));
+ __distance_type(__first));
}
template <class _ForwardIter, class _Tp, class _Distance>
@@ -2073,13 +2317,16 @@ __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
template <class _ForwardIter, class _Tp>
inline pair<_ForwardIter, _ForwardIter>
-equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES_SAME_TYPE(_Tp,
- typename iterator_traits<_ForwardIter>::value_type);
- __STL_REQUIRES(_Tp, _LessThanComparable);
+equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(SameTypeConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<_Tp>);
+
return __equal_range(__first, __last, __val,
- __DISTANCE_TYPE(__first));
+ __distance_type(__first));
}
template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
@@ -2116,22 +2363,28 @@ __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
template <class _ForwardIter, class _Tp, class _Compare>
inline pair<_ForwardIter, _ForwardIter>
equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
- _Compare __comp) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES_SAME_TYPE(_Tp,
- typename iterator_traits<_ForwardIter>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
+ _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(SameTypeConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare, _Tp, _Tp>);
+
return __equal_range(__first, __last, __val, __comp,
- __DISTANCE_TYPE(__first));
+ __distance_type(__first));
}
template <class _ForwardIter, class _Tp>
bool binary_search(_ForwardIter __first, _ForwardIter __last,
- const _Tp& __val) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES_SAME_TYPE(_Tp,
- typename iterator_traits<_ForwardIter>::value_type);
- __STL_REQUIRES(_Tp, _LessThanComparable);
+ const _Tp& __val)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(SameTypeConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<_Tp>);
+
_ForwardIter __i = lower_bound(__first, __last, __val);
return __i != __last && !(__val < *__i);
}
@@ -2139,11 +2392,14 @@ bool binary_search(_ForwardIter __first, _ForwardIter __last,
template <class _ForwardIter, class _Tp, class _Compare>
bool binary_search(_ForwardIter __first, _ForwardIter __last,
const _Tp& __val,
- _Compare __comp) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES_SAME_TYPE(_Tp,
- typename iterator_traits<_ForwardIter>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
+ _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(SameTypeConcept<_Tp,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare, _Tp, _Tp>);
+
_ForwardIter __i = lower_bound(__first, __last, __val, __comp);
return __i != __last && !__comp(__val, *__i);
}
@@ -2153,15 +2409,19 @@ bool binary_search(_ForwardIter __first, _ForwardIter __last,
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
- _OutputIter __result) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
- _LessThanComparable);
+ _OutputIter __result)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_InputIter1>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2) {
if (*__first2 < *__first1) {
*__result = *__first2;
@@ -2180,16 +2440,20 @@ template <class _InputIter1, class _InputIter2, class _OutputIter,
class _Compare>
_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
- _OutputIter __result, _Compare __comp) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter1>::value_type);
+ _OutputIter __result, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2) {
if (__comp(*__first2, *__first1)) {
*__result = *__first2;
@@ -2210,7 +2474,8 @@ template <class _BidirectionalIter, class _Distance>
void __merge_without_buffer(_BidirectionalIter __first,
_BidirectionalIter __middle,
_BidirectionalIter __last,
- _Distance __len1, _Distance __len2) {
+ _Distance __len1, _Distance __len2)
+{
if (__len1 == 0 || __len2 == 0)
return;
if (__len1 + __len2 == 2) {
@@ -2247,7 +2512,8 @@ void __merge_without_buffer(_BidirectionalIter __first,
_BidirectionalIter __middle,
_BidirectionalIter __last,
_Distance __len1, _Distance __len2,
- _Compare __comp) {
+ _Compare __comp)
+{
if (__len1 == 0 || __len2 == 0)
return;
if (__len1 + __len2 == 2) {
@@ -2286,7 +2552,8 @@ _BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,
_BidirectionalIter1 __last,
_Distance __len1, _Distance __len2,
_BidirectionalIter2 __buffer,
- _Distance __buffer_size) {
+ _Distance __buffer_size)
+{
_BidirectionalIter2 __buffer_end;
if (__len1 > __len2 && __len2 <= __buffer_size) {
__buffer_end = copy(__middle, __last, __buffer);
@@ -2308,7 +2575,8 @@ _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
_BidirectionalIter1 __last1,
_BidirectionalIter2 __first2,
_BidirectionalIter2 __last2,
- _BidirectionalIter3 __result) {
+ _BidirectionalIter3 __result)
+{
if (__first1 == __last1)
return copy_backward(__first2, __last2, __result);
if (__first2 == __last2)
@@ -2338,7 +2606,8 @@ _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
_BidirectionalIter2 __first2,
_BidirectionalIter2 __last2,
_BidirectionalIter3 __result,
- _Compare __comp) {
+ _Compare __comp)
+{
if (__first1 == __last1)
return copy_backward(__first2, __last2, __result);
if (__first2 == __last2)
@@ -2366,7 +2635,8 @@ void __merge_adaptive(_BidirectionalIter __first,
_BidirectionalIter __middle,
_BidirectionalIter __last,
_Distance __len1, _Distance __len2,
- _Pointer __buffer, _Distance __buffer_size) {
+ _Pointer __buffer, _Distance __buffer_size)
+{
if (__len1 <= __len2 && __len1 <= __buffer_size) {
_Pointer __buffer_end = copy(__first, __middle, __buffer);
merge(__buffer, __buffer_end, __middle, __last, __first);
@@ -2409,7 +2679,8 @@ void __merge_adaptive(_BidirectionalIter __first,
_BidirectionalIter __last,
_Distance __len1, _Distance __len2,
_Pointer __buffer, _Distance __buffer_size,
- _Compare __comp) {
+ _Compare __comp)
+{
if (__len1 <= __len2 && __len1 <= __buffer_size) {
_Pointer __buffer_end = copy(__first, __middle, __buffer);
merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
@@ -2449,7 +2720,8 @@ void __merge_adaptive(_BidirectionalIter __first,
template <class _BidirectionalIter, class _Tp, class _Distance>
inline void __inplace_merge_aux(_BidirectionalIter __first,
_BidirectionalIter __middle,
- _BidirectionalIter __last, _Tp*, _Distance*) {
+ _BidirectionalIter __last, _Tp*, _Distance*)
+{
_Distance __len1 = 0;
distance(__first, __middle, __len1);
_Distance __len2 = 0;
@@ -2468,7 +2740,8 @@ template <class _BidirectionalIter, class _Tp,
inline void __inplace_merge_aux(_BidirectionalIter __first,
_BidirectionalIter __middle,
_BidirectionalIter __last, _Tp*, _Distance*,
- _Compare __comp) {
+ _Compare __comp)
+{
_Distance __len1 = 0;
distance(__first, __middle, __len1);
_Distance __len2 = 0;
@@ -2486,28 +2759,36 @@ inline void __inplace_merge_aux(_BidirectionalIter __first,
template <class _BidirectionalIter>
inline void inplace_merge(_BidirectionalIter __first,
_BidirectionalIter __middle,
- _BidirectionalIter __last) {
- __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
- __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
- _LessThanComparable);
+ _BidirectionalIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_BidirectionalIteratorConcept<
+ _BidirectionalIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_BidirectionalIter>::value_type>);
+
if (__first == __middle || __middle == __last)
return;
__inplace_merge_aux(__first, __middle, __last,
- __VALUE_TYPE(__first), __DISTANCE_TYPE(__first));
+ __value_type(__first), __distance_type(__first));
}
template <class _BidirectionalIter, class _Compare>
inline void inplace_merge(_BidirectionalIter __first,
_BidirectionalIter __middle,
- _BidirectionalIter __last, _Compare __comp) {
- __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_BidirectionalIter>::value_type,
- typename iterator_traits<_BidirectionalIter>::value_type);
+ _BidirectionalIter __last, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(Mutable_BidirectionalIteratorConcept<
+ _BidirectionalIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_BidirectionalIter>::value_type,
+ typename iterator_traits<_BidirectionalIter>::value_type>);
+
if (__first == __middle || __middle == __last)
return;
__inplace_merge_aux(__first, __middle, __last,
- __VALUE_TYPE(__first), __DISTANCE_TYPE(__first),
+ __value_type(__first), __distance_type(__first),
__comp);
}
@@ -2518,14 +2799,17 @@ inline void inplace_merge(_BidirectionalIter __first,
template <class _InputIter1, class _InputIter2>
bool includes(_InputIter1 __first1, _InputIter1 __last1,
- _InputIter2 __first2, _InputIter2 __last2) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
- _LessThanComparable);
+ _InputIter2 __first2, _InputIter2 __last2)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_InputIter1>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2)
if (*__first2 < *__first1)
return false;
@@ -2539,15 +2823,18 @@ bool includes(_InputIter1 __first1, _InputIter1 __last1,
template <class _InputIter1, class _InputIter2, class _Compare>
bool includes(_InputIter1 __first1, _InputIter1 __last1,
- _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
+ _InputIter2 __first2, _InputIter2 __last2, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2)
if (__comp(*__first2, *__first1))
return false;
@@ -2562,15 +2849,19 @@ bool includes(_InputIter1 __first1, _InputIter1 __last1,
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
- _OutputIter __result) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
- _LessThanComparable);
+ _OutputIter __result)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_InputIter1>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2) {
if (*__first1 < *__first2) {
*__result = *__first1;
@@ -2594,16 +2885,20 @@ template <class _InputIter1, class _InputIter2, class _OutputIter,
class _Compare>
_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
- _OutputIter __result, _Compare __comp) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
+ _OutputIter __result, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2) {
if (__comp(*__first1, *__first2)) {
*__result = *__first1;
@@ -2626,15 +2921,19 @@ _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
- _OutputIter __result) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
- _LessThanComparable);
+ _OutputIter __result)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_InputIter1>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2)
if (*__first1 < *__first2)
++__first1;
@@ -2653,16 +2952,19 @@ template <class _InputIter1, class _InputIter2, class _OutputIter,
class _Compare>
_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
- _OutputIter __result, _Compare __comp) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
+ _OutputIter __result, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
while (__first1 != __last1 && __first2 != __last2)
if (__comp(*__first1, *__first2))
@@ -2681,15 +2983,19 @@ _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
- _OutputIter __result) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
- _LessThanComparable);
+ _OutputIter __result)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_InputIter1>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2)
if (*__first1 < *__first2) {
*__result = *__first1;
@@ -2709,16 +3015,19 @@ template <class _InputIter1, class _InputIter2, class _OutputIter,
class _Compare>
_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
- _OutputIter __result, _Compare __comp) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
+ _OutputIter __result, _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
while (__first1 != __last1 && __first2 != __last2)
if (__comp(*__first1, *__first2)) {
@@ -2739,15 +3048,19 @@ template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter
set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
- _OutputIter __result) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
- _LessThanComparable);
+ _OutputIter __result)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_InputIter1>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2)
if (*__first1 < *__first2) {
*__result = *__first1;
@@ -2772,16 +3085,20 @@ _OutputIter
set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result,
- _Compare __comp) {
- __STL_REQUIRES(_InputIter1, _InputIterator);
- __STL_REQUIRES(_InputIter2, _InputIterator);
- __STL_REQUIRES(_OutputIter, _OutputIterator);
- __STL_REQUIRES_SAME_TYPE(
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_InputIter1>::value_type,
- typename iterator_traits<_InputIter2>::value_type);
+ _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter1>);
+ glibcpp_function_requires(InputIteratorConcept<_InputIter2>);
+ glibcpp_function_requires(SameTypeConcept<
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+ glibcpp_function_requires(OutputIteratorConcept<_OutputIter,
+ typename iterator_traits<_InputIter1>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_InputIter1>::value_type,
+ typename iterator_traits<_InputIter2>::value_type>);
+
while (__first1 != __last1 && __first2 != __last2)
if (__comp(*__first1, *__first2)) {
*__result = *__first1;
@@ -2804,10 +3121,13 @@ set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
// comparison function.
template <class _ForwardIter>
-_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
- _LessThanComparable);
+_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_ForwardIter>::value_type>);
+
if (__first == __last) return __first;
_ForwardIter __result = __first;
while (++__first != __last)
@@ -2818,11 +3138,14 @@ _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last) {
template <class _ForwardIter, class _Compare>
_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
- _Compare __comp) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_ForwardIter>::value_type,
- typename iterator_traits<_ForwardIter>::value_type);
+ _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_ForwardIter>::value_type,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
if (__first == __last) return __first;
_ForwardIter __result = __first;
while (++__first != __last)
@@ -2831,10 +3154,13 @@ _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
}
template <class _ForwardIter>
-_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
- _LessThanComparable);
+_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_ForwardIter>::value_type>);
+
if (__first == __last) return __first;
_ForwardIter __result = __first;
while (++__first != __last)
@@ -2845,11 +3171,14 @@ _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) {
template <class _ForwardIter, class _Compare>
_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
- _Compare __comp) {
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_ForwardIter>::value_type,
- typename iterator_traits<_ForwardIter>::value_type);
+ _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_ForwardIter>::value_type,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
if (__first == __last) return __first;
_ForwardIter __result = __first;
while (++__first != __last)
@@ -2862,10 +3191,13 @@ _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
// supplied comparison function.
template <class _BidirectionalIter>
-bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
- __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
- __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
- _LessThanComparable);
+bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(BidirectionalIteratorConcept<_BidirectionalIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_BidirectionalIter>::value_type>);
+
if (__first == __last)
return false;
_BidirectionalIter __i = __first;
@@ -2895,11 +3227,14 @@ bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
template <class _BidirectionalIter, class _Compare>
bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
- _Compare __comp) {
- __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_BidirectionalIter>::value_type,
- typename iterator_traits<_BidirectionalIter>::value_type);
+ _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(BidirectionalIteratorConcept<_BidirectionalIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_BidirectionalIter>::value_type,
+ typename iterator_traits<_BidirectionalIter>::value_type>);
+
if (__first == __last)
return false;
_BidirectionalIter __i = __first;
@@ -2928,10 +3263,13 @@ bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
}
template <class _BidirectionalIter>
-bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
- __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
- __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
- _LessThanComparable);
+bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last)
+{
+ // concept requirements
+ glibcpp_function_requires(BidirectionalIteratorConcept<_BidirectionalIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_BidirectionalIter>::value_type>);
+
if (__first == __last)
return false;
_BidirectionalIter __i = __first;
@@ -2961,11 +3299,14 @@ bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
template <class _BidirectionalIter, class _Compare>
bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
- _Compare __comp) {
- __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
- __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
- typename iterator_traits<_BidirectionalIter>::value_type,
- typename iterator_traits<_BidirectionalIter>::value_type);
+ _Compare __comp)
+{
+ // concept requirements
+ glibcpp_function_requires(BidirectionalIteratorConcept<_BidirectionalIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_Compare,
+ typename iterator_traits<_BidirectionalIter>::value_type,
+ typename iterator_traits<_BidirectionalIter>::value_type>);
+
if (__first == __last)
return false;
_BidirectionalIter __i = __first;
@@ -2999,11 +3340,12 @@ template <class _InputIter, class _ForwardIter>
_InputIter find_first_of(_InputIter __first1, _InputIter __last1,
_ForwardIter __first2, _ForwardIter __last2)
{
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
- typename iterator_traits<_InputIter>::value_type,
- typename iterator_traits<_ForwardIter>::value_type);
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(EqualOpConcept<
+ typename iterator_traits<_InputIter>::value_type,
+ typename iterator_traits<_ForwardIter>::value_type>);
for ( ; __first1 != __last1; ++__first1)
for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
@@ -3017,11 +3359,15 @@ _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
_ForwardIter __first2, _ForwardIter __last2,
_BinaryPredicate __comp)
{
- __STL_REQUIRES(_InputIter, _InputIterator);
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
- typename iterator_traits<_InputIter>::value_type,
- typename iterator_traits<_ForwardIter>::value_type);
+ // concept requirements
+ glibcpp_function_requires(InputIteratorConcept<_InputIter>);
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(EqualOpConcept<
+ typename iterator_traits<_InputIter>::value_type,
+ typename iterator_traits<_ForwardIter>::value_type>);
+ glibcpp_function_requires(BinaryPredicateConcept<_BinaryPredicate,
+ typename iterator_traits<_InputIter>::value_type,
+ typename iterator_traits<_ForwardIter>::value_type>);
for ( ; __first1 != __last1; ++__first1)
for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
@@ -3092,8 +3438,10 @@ __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
_BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
bidirectional_iterator_tag, bidirectional_iterator_tag)
{
- __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
- __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
+ // concept requirements
+ glibcpp_function_requires(BidirectionalIteratorConcept<_BidirectionalIter1>);
+ glibcpp_function_requires(BidirectionalIteratorConcept<_BidirectionalIter2>);
+
typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
@@ -3119,8 +3467,10 @@ __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
bidirectional_iterator_tag, bidirectional_iterator_tag,
_BinaryPredicate __comp)
{
- __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
- __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
+ // concept requirements
+ glibcpp_function_requires(BidirectionalIteratorConcept<_BidirectionalIter1>);
+ glibcpp_function_requires(BidirectionalIteratorConcept<_BidirectionalIter2>);
+
typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
@@ -3146,14 +3496,16 @@ inline _ForwardIter1
find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
_ForwardIter2 __first2, _ForwardIter2 __last2)
{
- __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
- __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
- __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
- typename iterator_traits<_ForwardIter1>::value_type,
- typename iterator_traits<_ForwardIter2>::value_type);
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter1>);
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter2>);
+ glibcpp_function_requires(EqualOpConcept<
+ typename iterator_traits<_ForwardIter1>::value_type,
+ typename iterator_traits<_ForwardIter2>::value_type>);
+
return __find_end(__first1, __last1, __first2, __last2,
- __ITERATOR_CATEGORY(__first1),
- __ITERATOR_CATEGORY(__first2));
+ __iterator_category(__first1),
+ __iterator_category(__first2));
}
template <class _ForwardIter1, class _ForwardIter2,
@@ -3163,15 +3515,16 @@ find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
_ForwardIter2 __first2, _ForwardIter2 __last2,
_BinaryPredicate __comp)
{
- __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
- __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
- __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
- typename iterator_traits<_ForwardIter1>::value_type,
- typename iterator_traits<_ForwardIter2>::value_type);
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter1>);
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter2>);
+ glibcpp_function_requires(BinaryPredicateConcept<_BinaryPredicate,
+ typename iterator_traits<_ForwardIter1>::value_type,
+ typename iterator_traits<_ForwardIter2>::value_type>);
return __find_end(__first1, __last1, __first2, __last2,
- __ITERATOR_CATEGORY(__first1),
- __ITERATOR_CATEGORY(__first2),
+ __iterator_category(__first1),
+ __iterator_category(__first2),
__comp);
}
@@ -3209,9 +3562,11 @@ bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
template <class _RandomAccessIter>
inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
{
- __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator);
- __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
- _LessThanComparable);
+ // concept requirements
+ glibcpp_function_requires(RandomAccessIteratorConcept<_RandomAccessIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
return __is_heap(__first, __last - __first);
}
@@ -3220,10 +3575,12 @@ template <class _RandomAccessIter, class _StrictWeakOrdering>
inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
_StrictWeakOrdering __comp)
{
- __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator);
- __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool,
- typename iterator_traits<_RandomAccessIter>::value_type,
- typename iterator_traits<_RandomAccessIter>::value_type);
+ // concept requirements
+ glibcpp_function_requires(RandomAccessIteratorConcept<_RandomAccessIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_StrictWeakOrdering,
+ typename iterator_traits<_RandomAccessIter>::value_type,
+ typename iterator_traits<_RandomAccessIter>::value_type>);
+
return __is_heap(__first, __comp, __last - __first);
}
@@ -3234,9 +3591,11 @@ inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
template <class _ForwardIter>
bool is_sorted(_ForwardIter __first, _ForwardIter __last)
{
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
- _LessThanComparable);
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(LessThanComparableConcept<
+ typename iterator_traits<_ForwardIter>::value_type>);
+
if (__first == __last)
return true;
@@ -3253,10 +3612,12 @@ template <class _ForwardIter, class _StrictWeakOrdering>
bool is_sorted(_ForwardIter __first, _ForwardIter __last,
_StrictWeakOrdering __comp)
{
- __STL_REQUIRES(_ForwardIter, _ForwardIterator);
- __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool,
- typename iterator_traits<_ForwardIter>::value_type,
- typename iterator_traits<_ForwardIter>::value_type);
+ // concept requirements
+ glibcpp_function_requires(ForwardIteratorConcept<_ForwardIter>);
+ glibcpp_function_requires(BinaryPredicateConcept<_StrictWeakOrdering,
+ typename iterator_traits<_ForwardIter>::value_type,
+ typename iterator_traits<_ForwardIter>::value_type>);
+
if (__first == __last)
return true;
OpenPOWER on IntegriCloud