Make some parallel mode algorithms usable in constexpr contexts
This makes the __parallel::equal and __parallel:lexicographical_compare algorithms usable in constant expressions, by dispatching to the sequential algorithm when calling during constant evaluation. * include/parallel/algobase.h (equal, lexicographical_compare): Add _GLIBCXX20_CONSTEXPR and dispatch to sequential algorithm when being constant evaluated. * include/parallel/algorithmfwd.h (equal, lexicographical_compare): Add _GLIBCXX20_CONSTEXPR. From-SVN: r276431
This commit is contained in:
parent
61e619b4fd
commit
e12097eda0
|
@ -1,5 +1,11 @@
|
|||
2019-10-01 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
* include/parallel/algobase.h (equal, lexicographical_compare): Add
|
||||
_GLIBCXX20_CONSTEXPR and dispatch to sequential algorithm when being
|
||||
constant evaluated.
|
||||
* include/parallel/algorithmfwd.h (equal, lexicographical_compare):
|
||||
Add _GLIBCXX20_CONSTEXPR.
|
||||
|
||||
* testsuite/17_intro/using_namespace_std_tr1_neg.cc: Skip test for
|
||||
parallel mode.
|
||||
* testsuite/20_util/hash/84998.cc: Likewise.
|
||||
|
|
|
@ -214,19 +214,31 @@ namespace __parallel
|
|||
|
||||
// Public interface
|
||||
template<typename _IIter1, typename _IIter2>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
inline bool
|
||||
equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2)
|
||||
{
|
||||
#if __cplusplus > 201703L
|
||||
if (std::is_constant_evaluated())
|
||||
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2);
|
||||
#endif
|
||||
|
||||
return __gnu_parallel::mismatch(__begin1, __end1, __begin2).first
|
||||
== __end1;
|
||||
}
|
||||
|
||||
// Public interface
|
||||
template<typename _IIter1, typename _IIter2, typename _Predicate>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
inline bool
|
||||
equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
|
||||
_Predicate __pred)
|
||||
{
|
||||
#if __cplusplus > 201703L
|
||||
if (std::is_constant_evaluated())
|
||||
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __pred);
|
||||
#endif
|
||||
|
||||
return __gnu_parallel::mismatch(__begin1, __end1, __begin2, __pred).first
|
||||
== __end1;
|
||||
}
|
||||
|
@ -286,9 +298,15 @@ namespace __parallel
|
|||
}
|
||||
|
||||
template<typename _IIter1, typename _IIter2>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
inline bool
|
||||
equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2)
|
||||
{
|
||||
#if __cplusplus > 201703L
|
||||
if (std::is_constant_evaluated())
|
||||
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2);
|
||||
#endif
|
||||
|
||||
typedef __gnu_parallel::_EqualTo<
|
||||
typename std::iterator_traits<_IIter1>::value_type,
|
||||
typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
|
||||
|
@ -299,15 +317,22 @@ namespace __parallel
|
|||
}
|
||||
|
||||
template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
inline bool
|
||||
equal(_IIter1 __begin1, _IIter1 __end1,
|
||||
_IIter2 __begin2, _IIter2 __end2, _BinaryPredicate __binary_pred)
|
||||
{
|
||||
#if __cplusplus > 201703L
|
||||
if (std::is_constant_evaluated())
|
||||
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2,
|
||||
__binary_pred);
|
||||
#endif
|
||||
|
||||
return __equal_switch(__begin1, __end1, __begin2, __end2, __binary_pred,
|
||||
std::__iterator_category(__begin1),
|
||||
std::__iterator_category(__begin2));
|
||||
}
|
||||
#endif
|
||||
#endif // C++14
|
||||
|
||||
// Sequential fallback
|
||||
template<typename _IIter1, typename _IIter2>
|
||||
|
@ -391,10 +416,17 @@ namespace __parallel
|
|||
|
||||
// Public interface
|
||||
template<typename _IIter1, typename _IIter2>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
inline bool
|
||||
lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
|
||||
_IIter2 __begin2, _IIter2 __end2)
|
||||
{
|
||||
#if __cplusplus > 201703L
|
||||
if (std::is_constant_evaluated())
|
||||
return _GLIBCXX_STD_A::lexicographical_compare(__begin1, __end1,
|
||||
__begin2, __end2);
|
||||
#endif
|
||||
|
||||
typedef iterator_traits<_IIter1> _TraitsType1;
|
||||
typedef typename _TraitsType1::value_type _ValueType1;
|
||||
typedef typename _TraitsType1::iterator_category _IteratorCategory1;
|
||||
|
@ -411,11 +443,19 @@ namespace __parallel
|
|||
|
||||
// Public interface
|
||||
template<typename _IIter1, typename _IIter2, typename _Predicate>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
inline bool
|
||||
lexicographical_compare(_IIter1 __begin1, _IIter1 __end1,
|
||||
_IIter2 __begin2, _IIter2 __end2,
|
||||
_Predicate __pred)
|
||||
{
|
||||
#if __cplusplus > 201703L
|
||||
if (std::is_constant_evaluated())
|
||||
return _GLIBCXX_STD_A::lexicographical_compare(__begin1, __end1,
|
||||
__begin2, __end2,
|
||||
__pred);
|
||||
#endif
|
||||
|
||||
typedef iterator_traits<_IIter1> _TraitsType1;
|
||||
typedef typename _TraitsType1::iterator_category _IteratorCategory1;
|
||||
|
||||
|
|
|
@ -130,10 +130,12 @@ namespace __parallel
|
|||
__gnu_parallel::sequential_tag);
|
||||
|
||||
template<typename _IIter1, typename _IIter2>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
bool
|
||||
equal(_IIter1, _IIter1, _IIter2);
|
||||
|
||||
template<typename _IIter1, typename _IIter2, typename _Predicate>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
bool
|
||||
equal(_IIter1, _IIter1, _IIter2, _Predicate);
|
||||
|
||||
|
@ -285,10 +287,12 @@ namespace __parallel
|
|||
__gnu_parallel::sequential_tag);
|
||||
|
||||
template<typename _IIter1, typename _IIter2>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
bool
|
||||
lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2);
|
||||
|
||||
template<typename _IIter1, typename _IIter2, typename _Predicate>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
bool
|
||||
lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Predicate);
|
||||
|
||||
|
|
Loading…
Reference in New Issue