Commit bf7edb60 by Phil Edwards

re PR libstdc++/2054 (g++-3 rejects legal code, accepted by g++-2.95.2 (functors))

2002-01-02  Phil Edwards  <pme@gcc.gnu.org>

	* include/bits/stl_algo.h (upper_bound, equal_range, binary_search):
	Change concept checks, as with lower_bound and PR 2054.
	* testsuite/ext/concept_checks.cc:  Expand test to include those.

From-SVN: r48492
parent 0a379b7a
2002-01-02 Phil Edwards <pme@gcc.gnu.org> 2002-01-02 Phil Edwards <pme@gcc.gnu.org>
* include/bits/stl_algo.h (upper_bound, equal_range, binary_search):
Change concept checks, as with lower_bound and PR 2054.
* testsuite/ext/concept_checks.cc: Expand test to include those.
2002-01-02 Phil Edwards <pme@gcc.gnu.org>
* include/bits/boost_concept_check.h: Import some changes from * include/bits/boost_concept_check.h: Import some changes from
upsteam (Boost) version. upsteam (Boost) version.
......
// Algorithm implimentation -*- C++ -*- // Algorithm implimentation -*- C++ -*-
// Copyright (C) 2001 Free Software Foundation, Inc. // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the // software; you can redistribute it and/or modify it under the
...@@ -1949,6 +1949,10 @@ __result, __binary_pred, _IterType()); ...@@ -1949,6 +1949,10 @@ __result, __binary_pred, _IterType());
typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType; typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
// concept requirements // concept requirements
// Note that these are slightly stricter than those of the 4-argument
// version, defined next. The difference is in the strictness of the
// comparison operations... so for looser checking, define your own
// comparison function, as was intended.
__glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>) __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
__glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>) __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
__glibcpp_function_requires(_LessThanComparableConcept<_Tp>) __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
...@@ -2011,6 +2015,7 @@ __result, __binary_pred, _IterType()); ...@@ -2011,6 +2015,7 @@ __result, __binary_pred, _IterType());
typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType; typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
// concept requirements // concept requirements
// See comments on lower_bound.
__glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>) __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
__glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>) __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
__glibcpp_function_requires(_LessThanComparableConcept<_Tp>) __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
...@@ -2044,8 +2049,7 @@ __result, __binary_pred, _IterType()); ...@@ -2044,8 +2049,7 @@ __result, __binary_pred, _IterType());
// concept requirements // concept requirements
__glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>) __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
__glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>) __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _ValueType>)
__glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
_DistanceType __len = distance(__first, __last); _DistanceType __len = distance(__first, __last);
_DistanceType __half; _DistanceType __half;
...@@ -2074,6 +2078,7 @@ __result, __binary_pred, _IterType()); ...@@ -2074,6 +2078,7 @@ __result, __binary_pred, _IterType());
typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType; typedef typename iterator_traits<_ForwardIter>::difference_type _DistanceType;
// concept requirements // concept requirements
// See comments on lower_bound.
__glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>) __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
__glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>) __glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>)
__glibcpp_function_requires(_LessThanComparableConcept<_Tp>) __glibcpp_function_requires(_LessThanComparableConcept<_Tp>)
...@@ -2113,8 +2118,8 @@ __result, __binary_pred, _IterType()); ...@@ -2113,8 +2118,8 @@ __result, __binary_pred, _IterType());
// concept requirements // concept requirements
__glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>) __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
__glibcpp_function_requires(_SameTypeConcept<_Tp, _ValueType>) __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _ValueType, _Tp>)
__glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>) __glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _ValueType>)
_DistanceType __len = distance(__first, __last); _DistanceType __len = distance(__first, __last);
_DistanceType __half; _DistanceType __half;
...@@ -2147,6 +2152,7 @@ __result, __binary_pred, _IterType()); ...@@ -2147,6 +2152,7 @@ __result, __binary_pred, _IterType());
const _Tp& __val) const _Tp& __val)
{ {
// concept requirements // concept requirements
// See comments on lower_bound.
__glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>) __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
__glibcpp_function_requires(_SameTypeConcept<_Tp, __glibcpp_function_requires(_SameTypeConcept<_Tp,
typename iterator_traits<_ForwardIter>::value_type>) typename iterator_traits<_ForwardIter>::value_type>)
...@@ -2163,9 +2169,10 @@ __result, __binary_pred, _IterType()); ...@@ -2163,9 +2169,10 @@ __result, __binary_pred, _IterType());
{ {
// concept requirements // concept requirements
__glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>) __glibcpp_function_requires(_ForwardIteratorConcept<_ForwardIter>)
__glibcpp_function_requires(_SameTypeConcept<_Tp, __glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
typename iterator_traits<_ForwardIter>::value_type, _Tp>)
__glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp,
typename iterator_traits<_ForwardIter>::value_type>) typename iterator_traits<_ForwardIter>::value_type>)
__glibcpp_function_requires(_BinaryPredicateConcept<_Compare, _Tp, _Tp>)
_ForwardIter __i = lower_bound(__first, __last, __val, __comp); _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
return __i != __last && !__comp(__val, *__i); return __i != __last && !__comp(__val, *__i);
......
// 2001-12-28 Phil Edwards <pme@gcc.gnu.org> // 2001-12-28 Phil Edwards <pme@gcc.gnu.org>
// //
// Copyright (C) 2001 Free Software Foundation, Inc. // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the // software; you can redistribute it and/or modify it under the
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
using namespace std; using namespace std;
// PR libstdc++/2054 // PR libstdc++/2054 and follow-up discussion
struct indirectCompare struct indirectCompare
{ {
indirectCompare(const vector<string>& v) : V(v) {} indirectCompare(const vector<string>& v) : V(v) {}
...@@ -45,6 +45,11 @@ struct indirectCompare ...@@ -45,6 +45,11 @@ struct indirectCompare
return V[x] < a; return V[x] < a;
} }
bool operator()( const string& a, int x) const
{
return V[x] < a;
}
const vector<string>& V; const vector<string>& V;
}; };
...@@ -66,6 +71,9 @@ test2054( ) ...@@ -66,6 +71,9 @@ test2054( )
string SearchTerm; string SearchTerm;
lower_bound(Index.begin(), Index.end(), SearchTerm, aComparison); lower_bound(Index.begin(), Index.end(), SearchTerm, aComparison);
upper_bound(Index.begin(), Index.end(), SearchTerm, aComparison);
equal_range(Index.begin(), Index.end(), SearchTerm, aComparison);
binary_search(Index.begin(), Index.end(), SearchTerm, aComparison);
} }
int main() int main()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment