mirror of git://gcc.gnu.org/git/gcc.git
algobase.h (mismatch, equal): Provide parallel version for N3671 overloads.
2013-10-01 François Dumont <fdumont@gcc.gnu.org> * include/parallel/algobase.h (mismatch, equal): Provide parallel version for N3671 overloads. From-SVN: r203082
This commit is contained in:
parent
c8e318b042
commit
089ccc04e4
|
|
@ -1,3 +1,8 @@
|
||||||
|
2013-10-01 François Dumont <fdumont@gcc.gnu.org>
|
||||||
|
|
||||||
|
* include/parallel/algobase.h (mismatch, equal): Provide parallel
|
||||||
|
version for N3671 overloads.
|
||||||
|
|
||||||
2013-10-01 Paul Pluzhnikov <ppluzhnikov@google.com>
|
2013-10-01 Paul Pluzhnikov <ppluzhnikov@google.com>
|
||||||
|
|
||||||
* src/c++11/snprintf_lite.cc: Add missing
|
* src/c++11/snprintf_lite.cc: Add missing
|
||||||
|
|
|
||||||
|
|
@ -94,17 +94,13 @@ namespace __parallel
|
||||||
inline pair<_IIter1, _IIter2>
|
inline pair<_IIter1, _IIter2>
|
||||||
mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2)
|
mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2)
|
||||||
{
|
{
|
||||||
typedef std::iterator_traits<_IIter1> _Iterator1Traits;
|
typedef __gnu_parallel::_EqualTo<
|
||||||
typedef std::iterator_traits<_IIter2> _Iterator2Traits;
|
typename std::iterator_traits<_IIter1>::value_type,
|
||||||
typedef typename _Iterator1Traits::value_type _ValueType1;
|
typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
|
||||||
typedef typename _Iterator2Traits::value_type _ValueType2;
|
|
||||||
typedef typename _Iterator1Traits::iterator_category _IteratorCategory1;
|
|
||||||
typedef typename _Iterator2Traits::iterator_category _IteratorCategory2;
|
|
||||||
|
|
||||||
typedef __gnu_parallel::_EqualTo<_ValueType1, _ValueType2> _EqualTo;
|
|
||||||
|
|
||||||
return __mismatch_switch(__begin1, __end1, __begin2, _EqualTo(),
|
return __mismatch_switch(__begin1, __end1, __begin2, _EqualTo(),
|
||||||
_IteratorCategory1(), _IteratorCategory2());
|
std::__iterator_category(__begin1),
|
||||||
|
std::__iterator_category(__begin2));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Public interface
|
// Public interface
|
||||||
|
|
@ -113,32 +109,93 @@ namespace __parallel
|
||||||
mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
|
mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2,
|
||||||
_Predicate __pred)
|
_Predicate __pred)
|
||||||
{
|
{
|
||||||
typedef std::iterator_traits<_IIter1> _Iterator1Traits;
|
|
||||||
typedef std::iterator_traits<_IIter2> _Iterator2Traits;
|
|
||||||
typedef typename _Iterator1Traits::iterator_category _IteratorCategory1;
|
|
||||||
typedef typename _Iterator2Traits::iterator_category _IteratorCategory2;
|
|
||||||
|
|
||||||
return __mismatch_switch(__begin1, __end1, __begin2, __pred,
|
return __mismatch_switch(__begin1, __end1, __begin2, __pred,
|
||||||
_IteratorCategory1(), _IteratorCategory2());
|
std::__iterator_category(__begin1),
|
||||||
|
std::__iterator_category(__begin2));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __cplusplus > 201103L
|
#if __cplusplus > 201103L
|
||||||
|
// Sequential fallback.
|
||||||
template<typename _InputIterator1, typename _InputIterator2>
|
template<typename _InputIterator1, typename _InputIterator2>
|
||||||
inline pair<_InputIterator1, _InputIterator2>
|
inline pair<_InputIterator1, _InputIterator2>
|
||||||
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||||
_InputIterator2 __first2, _InputIterator2 __last2)
|
_InputIterator2 __first2, _InputIterator2 __last2,
|
||||||
|
__gnu_parallel::sequential_tag)
|
||||||
{ return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2); }
|
{ return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2); }
|
||||||
|
|
||||||
|
// Sequential fallback.
|
||||||
template<typename _InputIterator1, typename _InputIterator2,
|
template<typename _InputIterator1, typename _InputIterator2,
|
||||||
typename _BinaryPredicate>
|
typename _BinaryPredicate>
|
||||||
inline pair<_InputIterator1, _InputIterator2>
|
inline pair<_InputIterator1, _InputIterator2>
|
||||||
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||||
_InputIterator2 __first2, _InputIterator2 __last2,
|
_InputIterator2 __first2, _InputIterator2 __last2,
|
||||||
_BinaryPredicate __binary_pred)
|
_BinaryPredicate __binary_pred,
|
||||||
|
__gnu_parallel::sequential_tag)
|
||||||
{
|
{
|
||||||
return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2,
|
return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2,
|
||||||
__binary_pred);
|
__binary_pred);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sequential fallback for input iterator case
|
||||||
|
template<typename _IIter1, typename _IIter2,
|
||||||
|
typename _Predicate, typename _IteratorTag1, typename _IteratorTag2>
|
||||||
|
inline pair<_IIter1, _IIter2>
|
||||||
|
__mismatch_switch(_IIter1 __begin1, _IIter1 __end1,
|
||||||
|
_IIter2 __begin2, _IIter2 __end2, _Predicate __pred,
|
||||||
|
_IteratorTag1, _IteratorTag2)
|
||||||
|
{
|
||||||
|
return _GLIBCXX_STD_A::mismatch(__begin1, __end1,
|
||||||
|
__begin2, __end2, __pred);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parallel mismatch for random access iterators
|
||||||
|
template<typename _RAIter1, typename _RAIter2, typename _Predicate>
|
||||||
|
pair<_RAIter1, _RAIter2>
|
||||||
|
__mismatch_switch(_RAIter1 __begin1, _RAIter1 __end1,
|
||||||
|
_RAIter2 __begin2, _RAIter2 __end2, _Predicate __pred,
|
||||||
|
random_access_iterator_tag, random_access_iterator_tag)
|
||||||
|
{
|
||||||
|
if (_GLIBCXX_PARALLEL_CONDITION(true))
|
||||||
|
{
|
||||||
|
if ((__end2 - __begin2) < (__end1 - __begin1))
|
||||||
|
__end1 = __begin1 + (__end2 - __begin2);
|
||||||
|
|
||||||
|
_RAIter1 __res =
|
||||||
|
__gnu_parallel::__find_template(__begin1, __end1, __begin2, __pred,
|
||||||
|
__gnu_parallel::
|
||||||
|
__mismatch_selector()).first;
|
||||||
|
return make_pair(__res , __begin2 + (__res - __begin1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return _GLIBCXX_STD_A::mismatch(__begin1, __end1,
|
||||||
|
__begin2, __end2, __pred);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename _IIter1, typename _IIter2>
|
||||||
|
inline pair<_IIter1, _IIter2>
|
||||||
|
mismatch(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2)
|
||||||
|
{
|
||||||
|
typedef __gnu_parallel::_EqualTo<
|
||||||
|
typename std::iterator_traits<_IIter1>::value_type,
|
||||||
|
typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
|
||||||
|
|
||||||
|
return __mismatch_switch(__begin1, __end1, __begin2, __end2, _EqualTo(),
|
||||||
|
std::__iterator_category(__begin1),
|
||||||
|
std::__iterator_category(__begin2));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename _InputIterator1, typename _InputIterator2,
|
||||||
|
typename _BinaryPredicate>
|
||||||
|
inline pair<_InputIterator1, _InputIterator2>
|
||||||
|
mismatch(_InputIterator1 __begin1, _InputIterator1 __end1,
|
||||||
|
_InputIterator2 __begin2, _InputIterator2 __end2,
|
||||||
|
_BinaryPredicate __binary_pred)
|
||||||
|
{
|
||||||
|
return __mismatch_switch(__begin1, __end1, __begin2, __end2,
|
||||||
|
__binary_pred,
|
||||||
|
std::__iterator_category(__begin1),
|
||||||
|
std::__iterator_category(__begin2));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Sequential fallback
|
// Sequential fallback
|
||||||
|
|
@ -175,18 +232,80 @@ namespace __parallel
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __cplusplus > 201103L
|
#if __cplusplus > 201103L
|
||||||
template<typename _II1, typename _II2>
|
// Sequential fallback
|
||||||
|
template<typename _IIter1, typename _IIter2>
|
||||||
inline bool
|
inline bool
|
||||||
equal(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
|
equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2,
|
||||||
{ return _GLIBCXX_STD_A::equal(__first1, __last1, __first2, __last2); }
|
__gnu_parallel::sequential_tag)
|
||||||
|
{
|
||||||
|
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sequential fallback
|
||||||
|
template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
|
||||||
|
inline bool
|
||||||
|
equal(_IIter1 __begin1, _IIter1 __end1,
|
||||||
|
_IIter2 __begin2, _IIter2 __end2, _BinaryPredicate __binary_pred,
|
||||||
|
__gnu_parallel::sequential_tag)
|
||||||
|
{
|
||||||
|
return _GLIBCXX_STD_A::equal(__begin1, __end1, __begin2, __end2,
|
||||||
|
__binary_pred);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sequential fallback for input iterator case
|
||||||
|
template<typename _IIter1, typename _IIter2,
|
||||||
|
typename _Predicate, typename _IteratorTag1, typename _IteratorTag2>
|
||||||
|
inline bool
|
||||||
|
__equal_switch(_IIter1 __begin1, _IIter1 __end1,
|
||||||
|
_IIter2 __begin2, _IIter2 __end2, _Predicate __pred,
|
||||||
|
_IteratorTag1, _IteratorTag2)
|
||||||
|
{
|
||||||
|
return _GLIBCXX_STD_A::equal(__begin1, __end1,
|
||||||
|
__begin2, __end2, __pred);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parallel equal for random access iterators
|
||||||
|
template<typename _RAIter1, typename _RAIter2, typename _Predicate>
|
||||||
|
inline bool
|
||||||
|
__equal_switch(_RAIter1 __begin1, _RAIter1 __end1,
|
||||||
|
_RAIter2 __begin2, _RAIter2 __end2, _Predicate __pred,
|
||||||
|
random_access_iterator_tag, random_access_iterator_tag)
|
||||||
|
{
|
||||||
|
if (_GLIBCXX_PARALLEL_CONDITION(true))
|
||||||
|
{
|
||||||
|
if (std::distance(__begin1, __end1)
|
||||||
|
!= std::distance(__begin2, __end2))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return __gnu_parallel::mismatch(__begin1, __end1, __begin2, __end2,
|
||||||
|
__pred).first == __end1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return _GLIBCXX_STD_A::equal(__begin1, __end1,
|
||||||
|
__begin2, __end2, __pred);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename _IIter1, typename _IIter2>
|
||||||
|
inline bool
|
||||||
|
equal(_IIter1 __begin1, _IIter1 __end1, _IIter2 __begin2, _IIter2 __end2)
|
||||||
|
{
|
||||||
|
typedef __gnu_parallel::_EqualTo<
|
||||||
|
typename std::iterator_traits<_IIter1>::value_type,
|
||||||
|
typename std::iterator_traits<_IIter2>::value_type> _EqualTo;
|
||||||
|
|
||||||
|
return __equal_switch(__begin1, __end1, __begin2, __end2, _EqualTo(),
|
||||||
|
std::__iterator_category(__begin1),
|
||||||
|
std::__iterator_category(__begin2));
|
||||||
|
}
|
||||||
|
|
||||||
template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
|
template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
|
||||||
inline bool
|
inline bool
|
||||||
equal(_IIter1 __first1, _IIter1 __last1,
|
equal(_IIter1 __begin1, _IIter1 __end1,
|
||||||
_IIter2 __first2, _IIter2 __last2, _BinaryPredicate __binary_pred)
|
_IIter2 __begin2, _IIter2 __end2, _BinaryPredicate __binary_pred)
|
||||||
{
|
{
|
||||||
return _GLIBCXX_STD_A::equal(__first1, __last1, __first2, __last2,
|
return __equal_switch(__begin1, __end1, __begin2, __end2, __binary_pred,
|
||||||
__binary_pred);
|
std::__iterator_category(__begin1),
|
||||||
|
std::__iterator_category(__begin2));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue