// Copyright 2009-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 #pragma once #include <functional> #include "parallel_reduce.h" namespace embree { template<typename Index, class UnaryPredicate> __forceinline bool parallel_any_of (Index first, Index last, UnaryPredicate pred) { bool ret = false; #if defined(TASKING_TBB) #if TBB_INTERFACE_VERSION >= 12002 tbb::task_group_context context; tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred,&context](const tbb::blocked_range<size_t>& r) { if (context.is_group_execution_cancelled()) return; for (size_t i = r.begin(); i != r.end(); ++i) { if (pred(i)) { ret = true; context.cancel_group_execution(); } } }); #else tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred](const tbb::blocked_range<size_t>& r) { if (tbb::task::self().is_cancelled()) return; for (size_t i = r.begin(); i != r.end(); ++i) { if (pred(i)) { ret = true; tbb::task::self().cancel_group_execution(); } } }); #endif #else ret = parallel_reduce (first, last, false, [pred](const range<size_t>& r)->bool { bool localret = false; for (auto i=r.begin(); i<r.end(); ++i) { localret |= pred(i); } return localret; }, std::bit_or<bool>() ); #endif return ret; } } // end namespace