Loading libcxx/include/CMakeLists.txt +1 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ set(files __algorithm/pop_heap.h __algorithm/prev_permutation.h __algorithm/pstl_any_all_none_of.h __algorithm/pstl_find.h __algorithm/pstl_for_each.h __algorithm/push_heap.h __algorithm/ranges_adjacent_find.h Loading libcxx/include/__algorithm/pstl_find.h 0 → 100644 +102 −0 Original line number Diff line number Diff line //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef _LIBCPP___ALGORITHM_PSTL_FIND_H #define _LIBCPP___ALGORITHM_PSTL_FIND_H #include <__algorithm/comp.h> #include <__algorithm/find.h> #include <__config> #include <__functional/not_fn.h> #include <__pstl/internal/parallel_impl.h> #include <__pstl/internal/unseq_backend_simd.h> #include <__type_traits/is_execution_policy.h> #include <__utility/terminate_on_exception.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif _LIBCPP_BEGIN_NAMESPACE_STD template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, enable_if_t<is_execution_policy_v<__remove_cvref_t<_ExecutionPolicy>>, int> = 0> _LIBCPP_HIDE_FROM_ABI _ForwardIterator find(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) { if constexpr (__is_parallel_execution_policy_v<_ExecutionPolicy> && __is_cpp17_random_access_iterator<_ForwardIterator>::value) { return std::__terminate_on_exception([&] { return __pstl::__internal::__parallel_find( __pstl::__internal::__par_backend_tag{}, __policy, __first, __last, [&__policy, &__value](_ForwardIterator __brick_first, _ForwardIterator __brick_last) { return std::find(std::__remove_parallel_policy(__policy), __brick_first, __brick_last, __value); }, less<>{}, true); }); } else if constexpr (__is_unsequenced_execution_policy_v<_ExecutionPolicy> && __is_cpp17_random_access_iterator<_ForwardIterator>::value) { using __diff_t = __iter_diff_t<_ForwardIterator>; return __pstl::__unseq_backend::__simd_first( __first, __diff_t(0), __last - __first, [&__value](_ForwardIterator __iter, __diff_t __i) { return __iter[__i] == __value; }); } else { return std::find(__first, __last, __value); } } template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, enable_if_t<is_execution_policy_v<__remove_cvref_t<_ExecutionPolicy>>, int> = 0> _LIBCPP_HIDE_FROM_ABI _ForwardIterator find_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) { if constexpr (__is_parallel_execution_policy_v<_ExecutionPolicy> && __is_cpp17_random_access_iterator<_ForwardIterator>::value) { return std::__terminate_on_exception([&] { return __pstl::__internal::__parallel_find( __pstl::__internal::__par_backend_tag{}, __policy, __first, __last, [&__policy, &__pred](_ForwardIterator __brick_first, _ForwardIterator __brick_last) { return std::find_if(std::__remove_parallel_policy(__policy), __brick_first, __brick_last, __pred); }, less<>{}, true); }); } else if constexpr (__is_unsequenced_execution_policy_v<_ExecutionPolicy> && __is_cpp17_random_access_iterator<_ForwardIterator>::value) { using __diff_t = __iter_diff_t<_ForwardIterator>; return __pstl::__unseq_backend::__simd_first( __first, __diff_t(0), __last - __first, [&__pred](_ForwardIterator __iter, __diff_t __i) { return __pred(__iter[__i]); }); } else { return std::find_if(__first, __last, __pred); } } template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, enable_if_t<is_execution_policy_v<__remove_cvref_t<_ExecutionPolicy>>, int> = 0> _LIBCPP_HIDE_FROM_ABI _ForwardIterator find_if_not(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) { return std::find_if(__policy, __first, __last, std::not_fn(std::move(__pred))); } _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___ALGORITHM_PSTL_FIND_H libcxx/include/__pstl/internal/algorithm_fwd.h +0 −25 Original line number Diff line number Diff line Loading @@ -322,31 +322,6 @@ bool __pattern_equal( _RandomAccessIterator2, _BinaryPredicate); //------------------------------------------------------------------------ // find_if //------------------------------------------------------------------------ template <class _ForwardIterator, class _Predicate> _ForwardIterator __brick_find_if( _ForwardIterator, _ForwardIterator, _Predicate, /*is_vector=*/std::false_type) noexcept; template <class _RandomAccessIterator, class _Predicate> _RandomAccessIterator __brick_find_if( _RandomAccessIterator, _RandomAccessIterator, _Predicate, /*is_vector=*/std::true_type) noexcept; template <class _Tag, class _ExecutionPolicy, class _ForwardIterator, class _Predicate> _ForwardIterator __pattern_find_if(_Tag, _ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate) noexcept; template <class _IsVector, class _ExecutionPolicy, class _RandomAccessIterator, class _Predicate> _RandomAccessIterator __pattern_find_if( __parallel_tag<_IsVector>, _ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Predicate); //------------------------------------------------------------------------ // find_end //------------------------------------------------------------------------ Loading libcxx/include/__pstl/internal/algorithm_impl.h +0 −54 Original line number Diff line number Diff line Loading @@ -579,60 +579,6 @@ bool __pattern_equal( }); } //------------------------------------------------------------------------ // find_if //------------------------------------------------------------------------ template <class _ForwardIterator, class _Predicate> _ForwardIterator __brick_find_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, /*is_vector=*/std::false_type) noexcept { return std::find_if(__first, __last, __pred); } template <class _RandomAccessIterator, class _Predicate> _RandomAccessIterator __brick_find_if(_RandomAccessIterator __first, _RandomAccessIterator __last, _Predicate __pred, /*is_vector=*/std::true_type) noexcept { typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type _SizeType; return __unseq_backend::__simd_first( __first, _SizeType(0), __last - __first, [&__pred](_RandomAccessIterator __it, _SizeType __i) { return __pred(__it[__i]); }); } template <class _Tag, class _ExecutionPolicy, class _ForwardIterator, class _Predicate> _ForwardIterator __pattern_find_if( _Tag, _ExecutionPolicy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) noexcept { return __internal::__brick_find_if(__first, __last, __pred, typename _Tag::__is_vector{}); } template <class _IsVector, class _ExecutionPolicy, class _RandomAccessIterator, class _Predicate> _RandomAccessIterator __pattern_find_if( __parallel_tag<_IsVector> __tag, _ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last, _Predicate __pred) { using __backend_tag = typename decltype(__tag)::__backend_tag; return __internal::__except_handler([&]() { return __internal::__parallel_find( __backend_tag{}, std::forward<_ExecutionPolicy>(__exec), __first, __last, [__pred](_RandomAccessIterator __i, _RandomAccessIterator __j) { return __internal::__brick_find_if(__i, __j, __pred, _IsVector{}); }, std::less<typename std::iterator_traits<_RandomAccessIterator>::difference_type>(), /*is_first=*/true); }); } //------------------------------------------------------------------------ // find_end //------------------------------------------------------------------------ Loading libcxx/include/__pstl/internal/glue_algorithm_defs.h +0 −14 Original line number Diff line number Diff line Loading @@ -20,20 +20,6 @@ _PSTL_HIDE_FROM_ABI_PUSH namespace std { // [alg.find] template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator> find_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred); template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator> find_if_not(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred); template <class _ExecutionPolicy, class _ForwardIterator, class _Tp> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator> find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value); // [alg.find.end] template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> Loading Loading
libcxx/include/CMakeLists.txt +1 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ set(files __algorithm/pop_heap.h __algorithm/prev_permutation.h __algorithm/pstl_any_all_none_of.h __algorithm/pstl_find.h __algorithm/pstl_for_each.h __algorithm/push_heap.h __algorithm/ranges_adjacent_find.h Loading
libcxx/include/__algorithm/pstl_find.h 0 → 100644 +102 −0 Original line number Diff line number Diff line //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef _LIBCPP___ALGORITHM_PSTL_FIND_H #define _LIBCPP___ALGORITHM_PSTL_FIND_H #include <__algorithm/comp.h> #include <__algorithm/find.h> #include <__config> #include <__functional/not_fn.h> #include <__pstl/internal/parallel_impl.h> #include <__pstl/internal/unseq_backend_simd.h> #include <__type_traits/is_execution_policy.h> #include <__utility/terminate_on_exception.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif _LIBCPP_BEGIN_NAMESPACE_STD template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, enable_if_t<is_execution_policy_v<__remove_cvref_t<_ExecutionPolicy>>, int> = 0> _LIBCPP_HIDE_FROM_ABI _ForwardIterator find(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) { if constexpr (__is_parallel_execution_policy_v<_ExecutionPolicy> && __is_cpp17_random_access_iterator<_ForwardIterator>::value) { return std::__terminate_on_exception([&] { return __pstl::__internal::__parallel_find( __pstl::__internal::__par_backend_tag{}, __policy, __first, __last, [&__policy, &__value](_ForwardIterator __brick_first, _ForwardIterator __brick_last) { return std::find(std::__remove_parallel_policy(__policy), __brick_first, __brick_last, __value); }, less<>{}, true); }); } else if constexpr (__is_unsequenced_execution_policy_v<_ExecutionPolicy> && __is_cpp17_random_access_iterator<_ForwardIterator>::value) { using __diff_t = __iter_diff_t<_ForwardIterator>; return __pstl::__unseq_backend::__simd_first( __first, __diff_t(0), __last - __first, [&__value](_ForwardIterator __iter, __diff_t __i) { return __iter[__i] == __value; }); } else { return std::find(__first, __last, __value); } } template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, enable_if_t<is_execution_policy_v<__remove_cvref_t<_ExecutionPolicy>>, int> = 0> _LIBCPP_HIDE_FROM_ABI _ForwardIterator find_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) { if constexpr (__is_parallel_execution_policy_v<_ExecutionPolicy> && __is_cpp17_random_access_iterator<_ForwardIterator>::value) { return std::__terminate_on_exception([&] { return __pstl::__internal::__parallel_find( __pstl::__internal::__par_backend_tag{}, __policy, __first, __last, [&__policy, &__pred](_ForwardIterator __brick_first, _ForwardIterator __brick_last) { return std::find_if(std::__remove_parallel_policy(__policy), __brick_first, __brick_last, __pred); }, less<>{}, true); }); } else if constexpr (__is_unsequenced_execution_policy_v<_ExecutionPolicy> && __is_cpp17_random_access_iterator<_ForwardIterator>::value) { using __diff_t = __iter_diff_t<_ForwardIterator>; return __pstl::__unseq_backend::__simd_first( __first, __diff_t(0), __last - __first, [&__pred](_ForwardIterator __iter, __diff_t __i) { return __pred(__iter[__i]); }); } else { return std::find_if(__first, __last, __pred); } } template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate, enable_if_t<is_execution_policy_v<__remove_cvref_t<_ExecutionPolicy>>, int> = 0> _LIBCPP_HIDE_FROM_ABI _ForwardIterator find_if_not(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) { return std::find_if(__policy, __first, __last, std::not_fn(std::move(__pred))); } _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___ALGORITHM_PSTL_FIND_H
libcxx/include/__pstl/internal/algorithm_fwd.h +0 −25 Original line number Diff line number Diff line Loading @@ -322,31 +322,6 @@ bool __pattern_equal( _RandomAccessIterator2, _BinaryPredicate); //------------------------------------------------------------------------ // find_if //------------------------------------------------------------------------ template <class _ForwardIterator, class _Predicate> _ForwardIterator __brick_find_if( _ForwardIterator, _ForwardIterator, _Predicate, /*is_vector=*/std::false_type) noexcept; template <class _RandomAccessIterator, class _Predicate> _RandomAccessIterator __brick_find_if( _RandomAccessIterator, _RandomAccessIterator, _Predicate, /*is_vector=*/std::true_type) noexcept; template <class _Tag, class _ExecutionPolicy, class _ForwardIterator, class _Predicate> _ForwardIterator __pattern_find_if(_Tag, _ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Predicate) noexcept; template <class _IsVector, class _ExecutionPolicy, class _RandomAccessIterator, class _Predicate> _RandomAccessIterator __pattern_find_if( __parallel_tag<_IsVector>, _ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _Predicate); //------------------------------------------------------------------------ // find_end //------------------------------------------------------------------------ Loading
libcxx/include/__pstl/internal/algorithm_impl.h +0 −54 Original line number Diff line number Diff line Loading @@ -579,60 +579,6 @@ bool __pattern_equal( }); } //------------------------------------------------------------------------ // find_if //------------------------------------------------------------------------ template <class _ForwardIterator, class _Predicate> _ForwardIterator __brick_find_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, /*is_vector=*/std::false_type) noexcept { return std::find_if(__first, __last, __pred); } template <class _RandomAccessIterator, class _Predicate> _RandomAccessIterator __brick_find_if(_RandomAccessIterator __first, _RandomAccessIterator __last, _Predicate __pred, /*is_vector=*/std::true_type) noexcept { typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type _SizeType; return __unseq_backend::__simd_first( __first, _SizeType(0), __last - __first, [&__pred](_RandomAccessIterator __it, _SizeType __i) { return __pred(__it[__i]); }); } template <class _Tag, class _ExecutionPolicy, class _ForwardIterator, class _Predicate> _ForwardIterator __pattern_find_if( _Tag, _ExecutionPolicy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) noexcept { return __internal::__brick_find_if(__first, __last, __pred, typename _Tag::__is_vector{}); } template <class _IsVector, class _ExecutionPolicy, class _RandomAccessIterator, class _Predicate> _RandomAccessIterator __pattern_find_if( __parallel_tag<_IsVector> __tag, _ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last, _Predicate __pred) { using __backend_tag = typename decltype(__tag)::__backend_tag; return __internal::__except_handler([&]() { return __internal::__parallel_find( __backend_tag{}, std::forward<_ExecutionPolicy>(__exec), __first, __last, [__pred](_RandomAccessIterator __i, _RandomAccessIterator __j) { return __internal::__brick_find_if(__i, __j, __pred, _IsVector{}); }, std::less<typename std::iterator_traits<_RandomAccessIterator>::difference_type>(), /*is_first=*/true); }); } //------------------------------------------------------------------------ // find_end //------------------------------------------------------------------------ Loading
libcxx/include/__pstl/internal/glue_algorithm_defs.h +0 −14 Original line number Diff line number Diff line Loading @@ -20,20 +20,6 @@ _PSTL_HIDE_FROM_ABI_PUSH namespace std { // [alg.find] template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator> find_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred); template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator> find_if_not(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred); template <class _ExecutionPolicy, class _ForwardIterator, class _Tp> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator> find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value); // [alg.find.end] template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> Loading