diff options
Diffstat (limited to 'libstdc++-v3/include/parallel/merge.h')
-rw-r--r-- | libstdc++-v3/include/parallel/merge.h | 102 |
1 files changed, 46 insertions, 56 deletions
diff --git a/libstdc++-v3/include/parallel/merge.h b/libstdc++-v3/include/parallel/merge.h index c323c629893..a19e996a055 100644 --- a/libstdc++-v3/include/parallel/merge.h +++ b/libstdc++-v3/include/parallel/merge.h @@ -37,11 +37,11 @@ namespace __gnu_parallel { - /** @brief Merge routine being able to merge only the @__c __max_length + /** @brief Merge routine being able to merge only the @c __max_length * smallest elements. * - * The @__c __begin iterators are advanced accordingly, they might not - * reach @__c __end, in contrast to the usual variant. + * The @c __begin iterators are advanced accordingly, they might not + * reach @c __end, in contrast to the usual variant. * @param __begin1 Begin iterator of first sequence. * @param __end1 End iterator of first sequence. * @param __begin2 Begin iterator of second sequence. @@ -54,11 +54,10 @@ namespace __gnu_parallel typename _OutputIterator, typename _DifferenceTp, typename _Compare> _OutputIterator - __merge_advance_usual(_RAIter1& __begin1, - _RAIter1 __end1, - _RAIter2& __begin2, - _RAIter2 __end2, _OutputIterator __target, - _DifferenceTp __max_length, _Compare __comp) + __merge_advance_usual(_RAIter1& __begin1, _RAIter1 __end1, + _RAIter2& __begin2, _RAIter2 __end2, + _OutputIterator __target, + _DifferenceTp __max_length, _Compare __comp) { typedef _DifferenceTp _DifferenceType; while (__begin1 != __end1 && __begin2 != __end2 && __max_length > 0) @@ -84,11 +83,11 @@ namespace __gnu_parallel return __target; } - /** @brief Merge routine being able to merge only the @__c __max_length + /** @brief Merge routine being able to merge only the @c __max_length * smallest elements. * - * The @__c __begin iterators are advanced accordingly, they might not - * reach @__c __end, in contrast to the usual variant. + * The @c __begin iterators are advanced accordingly, they might not + * reach @c __end, in contrast to the usual variant. * Specially designed code should allow the compiler to generate * conditional moves instead of branches. * @param __begin1 Begin iterator of first sequence. @@ -103,12 +102,10 @@ namespace __gnu_parallel typename _OutputIterator, typename _DifferenceTp, typename _Compare> _OutputIterator - __merge_advance_movc(_RAIter1& __begin1, - _RAIter1 __end1, - _RAIter2& __begin2, - _RAIter2 __end2, - _OutputIterator __target, - _DifferenceTp __max_length, _Compare __comp) + __merge_advance_movc(_RAIter1& __begin1, _RAIter1 __end1, + _RAIter2& __begin2, _RAIter2 __end2, + _OutputIterator __target, + _DifferenceTp __max_length, _Compare __comp) { typedef _DifferenceTp _DifferenceType; typedef typename std::iterator_traits<_RAIter1>::value_type @@ -153,11 +150,11 @@ namespace __gnu_parallel return __target; } - /** @brief Merge routine being able to merge only the @__c __max_length + /** @brief Merge routine being able to merge only the @c __max_length * smallest elements. * - * The @__c __begin iterators are advanced accordingly, they might not - * reach @__c __end, in contrast to the usual variant. + * The @c __begin iterators are advanced accordingly, they might not + * reach @c __end, in contrast to the usual variant. * Static switch on whether to use the conditional-move variant. * @param __begin1 Begin iterator of first sequence. * @param __end1 End iterator of first sequence. @@ -172,14 +169,14 @@ namespace __gnu_parallel typename _Compare> inline _OutputIterator __merge_advance(_RAIter1& __begin1, _RAIter1 __end1, - _RAIter2& __begin2, _RAIter2 __end2, - _OutputIterator __target, _DifferenceTp __max_length, - _Compare __comp) + _RAIter2& __begin2, _RAIter2 __end2, + _OutputIterator __target, _DifferenceTp __max_length, + _Compare __comp) { _GLIBCXX_CALL(__max_length) - return __merge_advance_movc(__begin1, __end1, __begin2, __end2, __target, - __max_length, __comp); + return __merge_advance_movc(__begin1, __end1, __begin2, __end2, + __target, __max_length, __comp); } /** @brief Merge routine fallback to sequential in case the @@ -195,23 +192,21 @@ namespace __gnu_parallel template<typename _RAIter1, typename _RAIter2, typename _RAIter3, typename _Compare> inline _RAIter3 - __parallel_merge_advance(_RAIter1& __begin1, - _RAIter1 __end1, - _RAIter2& __begin2, - // different iterators, parallel implementation - // not available - _RAIter2 __end2, - _RAIter3 __target, typename - std::iterator_traits<_RAIter1>:: - difference_type __max_length, _Compare __comp) + __parallel_merge_advance(_RAIter1& __begin1, _RAIter1 __end1, + _RAIter2& __begin2, + // different iterators, parallel implementation + // not available + _RAIter2 __end2, _RAIter3 __target, typename + std::iterator_traits<_RAIter1>:: + difference_type __max_length, _Compare __comp) { return __merge_advance(__begin1, __end1, __begin2, __end2, __target, - __max_length, __comp); } + __max_length, __comp); } - /** @brief Parallel merge routine being able to merge only the @__c + /** @brief Parallel merge routine being able to merge only the @c * __max_length smallest elements. * - * The @__c __begin iterators are advanced accordingly, they might not - * reach @__c __end, in contrast to the usual variant. + * The @c __begin iterators are advanced accordingly, they might not + * reach @c __end, in contrast to the usual variant. * The functionality is projected onto parallel_multiway_merge. * @param __begin1 Begin iterator of first sequence. * @param __end1 End iterator of first sequence. @@ -225,13 +220,11 @@ namespace __gnu_parallel template<typename _RAIter1, typename _RAIter3, typename _Compare> inline _RAIter3 - __parallel_merge_advance(_RAIter1& __begin1, - _RAIter1 __end1, - _RAIter1& __begin2, - _RAIter1 __end2, - _RAIter3 __target, typename - std::iterator_traits<_RAIter1>:: - difference_type __max_length, _Compare __comp) + __parallel_merge_advance(_RAIter1& __begin1, _RAIter1 __end1, + _RAIter1& __begin2, _RAIter1 __end2, + _RAIter3 __target, typename + std::iterator_traits<_RAIter1>:: + difference_type __max_length, _Compare __comp) { typedef typename std::iterator_traits<_RAIter1>::value_type _ValueType; @@ -242,17 +235,14 @@ namespace __gnu_parallel typedef typename std::pair<_RAIter1, _RAIter1> _IteratorPair; - _IteratorPair - seqs[2] = { std::make_pair(__begin1, __end1), - std::make_pair(__begin2, __end2) }; - _RAIter3 - __target_end = parallel_multiway_merge - < /* __stable = */ true, /* __sentinels = */ false>( - seqs, seqs + 2, __target, - multiway_merge_exact_splitting - < /* __stable = */ true, _IteratorPair*, - _Compare, _DifferenceType1>, - __max_length, __comp, omp_get_max_threads()); + _IteratorPair __seqs[2] = { std::make_pair(__begin1, __end1), + std::make_pair(__begin2, __end2) }; + _RAIter3 __target_end = parallel_multiway_merge + < /* __stable = */ true, /* __sentinels = */ false> + (__seqs, __seqs + 2, __target, multiway_merge_exact_splitting + < /* __stable = */ true, _IteratorPair*, + _Compare, _DifferenceType1>, __max_length, __comp, + omp_get_max_threads()); return __target_end; } |