summaryrefslogtreecommitdiff
path: root/pstl/include/pstl/internal/parallel_backend_utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'pstl/include/pstl/internal/parallel_backend_utils.h')
-rw-r--r--pstl/include/pstl/internal/parallel_backend_utils.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/pstl/include/pstl/internal/parallel_backend_utils.h b/pstl/include/pstl/internal/parallel_backend_utils.h
index 5728b48b1cf7..448f924806dc 100644
--- a/pstl/include/pstl/internal/parallel_backend_utils.h
+++ b/pstl/include/pstl/internal/parallel_backend_utils.h
@@ -138,6 +138,124 @@ struct __serial_move_merge
}
};
+template <typename _ForwardIterator1, typename _ForwardIterator2, typename _OutputIterator, typename _Compare,
+ typename _CopyConstructRange>
+_OutputIterator
+__set_union_construct(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
+ _ForwardIterator2 __last2, _OutputIterator __result, _Compare __comp,
+ _CopyConstructRange __cc_range)
+{
+ using _Tp = typename std::iterator_traits<_OutputIterator>::value_type;
+
+ for (; __first1 != __last1; ++__result)
+ {
+ if (__first2 == __last2)
+ return __cc_range(__first1, __last1, __result);
+ if (__comp(*__first2, *__first1))
+ {
+ ::new (std::addressof(*__result)) _Tp(*__first2);
+ ++__first2;
+ }
+ else
+ {
+ ::new (std::addressof(*__result)) _Tp(*__first1);
+ if (!__comp(*__first1, *__first2))
+ ++__first2;
+ ++__first1;
+ }
+ }
+ return __cc_range(__first2, __last2, __result);
+}
+
+template <typename _ForwardIterator1, typename _ForwardIterator2, typename _OutputIterator, typename _Compare>
+_OutputIterator
+__set_intersection_construct(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
+ _ForwardIterator2 __last2, _OutputIterator __result, _Compare __comp)
+{
+ using _Tp = typename std::iterator_traits<_OutputIterator>::value_type;
+
+ for (; __first1 != __last1 && __first2 != __last2;)
+ {
+ if (__comp(*__first1, *__first2))
+ ++__first1;
+ else
+ {
+ if (!__comp(*__first2, *__first1))
+ {
+ ::new (std::addressof(*__result)) _Tp(*__first1);
+ ++__result;
+ ++__first1;
+ }
+ ++__first2;
+ }
+ }
+ return __result;
+}
+
+template <typename _ForwardIterator1, typename _ForwardIterator2, typename _OutputIterator, typename _Compare,
+ typename _CopyConstructRange>
+_OutputIterator
+__set_difference_construct(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
+ _ForwardIterator2 __last2, _OutputIterator __result, _Compare __comp,
+ _CopyConstructRange __cc_range)
+{
+ using _Tp = typename std::iterator_traits<_OutputIterator>::value_type;
+
+ for (; __first1 != __last1;)
+ {
+ if (__first2 == __last2)
+ return __cc_range(__first1, __last1, __result);
+
+ if (__comp(*__first1, *__first2))
+ {
+ ::new (std::addressof(*__result)) _Tp(*__first1);
+ ++__result;
+ ++__first1;
+ }
+ else
+ {
+ if (!__comp(*__first2, *__first1))
+ ++__first1;
+ ++__first2;
+ }
+ }
+ return __result;
+}
+template <typename _ForwardIterator1, typename _ForwardIterator2, typename _OutputIterator, typename _Compare,
+ typename _CopyConstructRange>
+_OutputIterator
+__set_symmetric_difference_construct(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
+ _ForwardIterator2 __last2, _OutputIterator __result, _Compare __comp,
+ _CopyConstructRange __cc_range)
+{
+ using _Tp = typename std::iterator_traits<_OutputIterator>::value_type;
+
+ for (; __first1 != __last1;)
+ {
+ if (__first2 == __last2)
+ return __cc_range(__first1, __last1, __result);
+
+ if (__comp(*__first1, *__first2))
+ {
+ ::new (std::addressof(*__result)) _Tp(*__first1);
+ ++__result;
+ ++__first1;
+ }
+ else
+ {
+ if (__comp(*__first2, *__first1))
+ {
+ ::new (std::addressof(*__result)) _Tp(*__first2);
+ ++__result;
+ }
+ else
+ ++__first1;
+ ++__first2;
+ }
+ }
+ return __cc_range(__first2, __last2, __result);
+}
+
} // namespace __utils
} // namespace __pstl