Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 24 additions & 12 deletions include/oneapi/dpl/pstl/glue_algorithm_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _Predicate>
oneapi::dpl::__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>
template <class _ExecutionPolicy, class _ForwardIterator,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);

Expand Down Expand Up @@ -104,7 +105,8 @@ adjacent_find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardItera

// [alg.count]

template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<
_ExecutionPolicy, typename ::std::iterator_traits<_ForwardIterator>::difference_type>
count(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);
Expand All @@ -126,12 +128,14 @@ oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Forward
search(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __s_first,
_ForwardIterator2 __s_last);

template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
template <class _ExecutionPolicy, class _ForwardIterator, class _Size,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type, class _BinaryPredicate>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
search_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Size __count,
const _Tp& __value, _BinaryPredicate __pred);

template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator, class _Size,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
search_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Size __count,
const _Tp& __value);
Expand Down Expand Up @@ -189,33 +193,39 @@ transform_if(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIter

// [alg.replace]

template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy>
replace_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _UnaryPredicate __pred,
const _Tp& __new_value);

template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy>
replace(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value,
const _Tp& __new_value);

template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _UnaryPredicate, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _UnaryPredicate,
class _Tp = typename std::iterator_traits<_ForwardIterator2>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
replace_copy_if(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
_ForwardIterator2 __result, _UnaryPredicate __pred, const _Tp& __new_value);

template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2,
class _Tp = typename std::iterator_traits<_ForwardIterator2>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
replace_copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result,
const _Tp& __old_value, const _Tp& __new_value);

// [alg.fill]

template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy>
fill(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);

template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator, class _Size,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
fill_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __count, const _Tp& __value);

Expand All @@ -235,7 +245,8 @@ oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Forward
remove_copy_if(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
_ForwardIterator2 __result, _Predicate __pred);

template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2,
class _Tp = typename std::iterator_traits<_ForwardIterator1>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
remove_copy(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __result,
const _Tp& __value);
Expand All @@ -244,7 +255,8 @@ template <class _ExecutionPolicy, class _ForwardIterator, class _UnaryPredicate>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
remove_if(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _UnaryPredicate __pred);

template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
remove(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);

Expand Down
6 changes: 4 additions & 2 deletions include/oneapi/dpl/pstl/glue_memory_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,13 @@ uninitialized_move_n(_ExecutionPolicy&& __exec, _InputIterator __first, _Size __

// [uninitialized.fill]

template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy>
uninitialized_fill(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);

template <class _ExecutionPolicy, class _ForwardIterator, class _Size, class _Tp>
template <class _ExecutionPolicy, class _ForwardIterator, class _Size,
class _Tp = typename std::iterator_traits<_ForwardIterator>::value_type>
oneapi::dpl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator>
uninitialized_fill_n(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Size __n, const _Tp& __value);

Expand Down
82 changes: 82 additions & 0 deletions test/parallel_api/algorithm/alg.modifying.operations/fill.pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,85 @@ test_fill_by_type(::std::size_t n)
#endif
}

void test_empty_list_initialization_for_fill()
{
{
std::vector<int> v{3,6,5,4,3,7,8,0,2,4};
oneapi::dpl::fill(oneapi::dpl::execution::seq, v.begin(), v.end(), {});
EXPECT_TRUE(std::count(v.begin(), v.end(), 0) == v.size(), "a sequence is not filled properly by oneapi::dpl::fill with `seq` policy");
}
{
std::vector<int> v{3,6,5,4,3,7,8,0,2,4};
oneapi::dpl::fill(oneapi::dpl::execution::unseq, v.begin(), v.end(), {});
EXPECT_TRUE(std::count(v.begin(), v.end(), 0) == v.size(), "a sequence is not filled properly by oneapi::dpl::fill with `unseq` policy");
}

{
{
std::vector<TestUtils::DefaultInitializedToOne> v_custom{{3},{6},{5},{4},{3},{7},{8},{2},{1},{4}};
oneapi::dpl::fill(oneapi::dpl::execution::par, v_custom.begin(), v_custom.end(), {});
EXPECT_TRUE(std::count(v_custom.begin(), v_custom.end(), TestUtils::DefaultInitializedToOne{}) == v_custom.size(),
"a sequence is not filled properly by oneapi::dpl::fill with `par` policy");
}
{
std::vector<TestUtils::DefaultInitializedToOne> v_custom{{3},{6},{5},{4},{3},{7},{8},{2},{1},{4}};
oneapi::dpl::fill(oneapi::dpl::execution::par_unseq, v_custom.begin(), v_custom.end(), {});
EXPECT_TRUE(std::count(v_custom.begin(), v_custom.end(), TestUtils::DefaultInitializedToOne{}) == v_custom.size(),
"a sequence is not filled properly by oneapi::dpl::fill with `par_unseq` policy");
}
}
#if TEST_DPCPP_BACKEND_PRESENT
std::vector<int> v{3,6,5,4,3,7,8,0,2,4};
sycl::buffer<int> buf(v);
auto it = oneapi::dpl::fill(oneapi::dpl::execution::dpcpp_default, oneapi::dpl::begin(buf), oneapi::dpl::end(buf), {});
EXPECT_TRUE(std::count(v.begin(), v.end(), 0) == v.size(), "a sequence is not filled properly by oneapi::dpl::fill with `device_policy` policy");
#endif
}

void test_empty_list_initialization_for_fill_n()
{
constexpr std::size_t fill_number = 6;
{
std::vector<int> v{3,6,5,4,3,7,8,0,2,4};
auto it = oneapi::dpl::fill_n(oneapi::dpl::execution::seq, v.begin(), fill_number, {});
auto count = std::count(v.begin(), v.begin() + fill_number, 0);
EXPECT_TRUE(it == (v.begin() + fill_number), "an incorrect iterator returned from oneapi::dpl::fill_n with `seq` policy");
EXPECT_TRUE(count == fill_number, "a sequence is not filled properly by oneapi::dpl::fill_n with `seq` policy");
}
{
std::vector<int> v{3,6,5,4,3,7,8,0,2,4};
auto it = oneapi::dpl::fill_n(oneapi::dpl::execution::unseq, v.begin(), fill_number, {});
auto count = std::count(v.begin(), v.begin() + fill_number, 0);
EXPECT_TRUE(it == (v.begin() + fill_number), "an incorrect iterator returned from oneapi::dpl::fill_n with `unseq` policy");
EXPECT_TRUE(count == fill_number, "a sequence is not filled properly by oneapi::dpl::fill_n with `unseq` policy");
}

{
{
std::vector<TestUtils::DefaultInitializedToOne> v_custom{{3},{6},{5},{4},{3},{7},{8},{2},{1},{4}};
auto it = oneapi::dpl::fill_n(oneapi::dpl::execution::par, v_custom.begin(), fill_number, {});
auto count = std::count(v_custom.begin(), v_custom.begin() + fill_number, TestUtils::DefaultInitializedToOne{1});
EXPECT_TRUE(it == (v_custom.begin() + fill_number), "an incorrect iterator returned from oneapi::dpl::fill_n with `par` policy");
EXPECT_TRUE(count == fill_number, "a sequence is not filled properly by oneapi::dpl::fill_n with `par` policy");
}
{
std::vector<TestUtils::DefaultInitializedToOne> v_custom{{3},{6},{5},{4},{3},{7},{8},{2},{1},{4}};
auto it = oneapi::dpl::fill_n(oneapi::dpl::execution::par_unseq, v_custom.begin(), fill_number, {});
auto count = std::count(v_custom.begin(), v_custom.begin() + fill_number, TestUtils::DefaultInitializedToOne{1});
EXPECT_TRUE(it == (v_custom.begin() + fill_number), "an incorrect iterator returned from oneapi::dpl::fill_n with `par_unseq` policy");
EXPECT_TRUE(count == fill_number, "a sequence is not filled properly by oneapi::dpl::fill_n with `par_unseq` policy");
}
}
#if TEST_DPCPP_BACKEND_PRESENT
std::vector<int> v{3,6,5,4,3,7,8,0,2,4};
sycl::buffer<int> buf(v);
auto it = oneapi::dpl::fill_n(oneapi::dpl::execution::dpcpp_default, oneapi::dpl::begin(buf), fill_number, {});
auto count = std::count(v.begin(), v.begin() + fill_number, 0);
EXPECT_TRUE(it.get_idx() == fill_number, "an incorrect iterator returned from oneapi::dpl::fill_n with `device_policy` policy");
EXPECT_TRUE(count == fill_number, "a sequence is not filled properly by oneapi::dpl::fill_n with `device_policy` policy");
#endif
}

int
main()
{
Expand All @@ -108,5 +187,8 @@ main()
test_fill_by_type<float64_t>(n);
}

test_empty_list_initialization_for_fill();
test_empty_list_initialization_for_fill_n();

return done();
}
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,54 @@ struct test_non_const
}
};

void test_empty_list_initialization()
{
{
std::vector<int> v{3,6,0,4,0,7,8,0,3,4};
std::vector<int> expected{3,6,4,7,8,3,4};
auto it = oneapi::dpl::remove(oneapi::dpl::execution::seq, v.begin(), v.end(), {});
EXPECT_TRUE(it == v.begin() + 7, "not all empty list-initialized values are properly removed by oneapi::dpl::remove with `seq` policy");
v.erase(it, v.end());
EXPECT_TRUE(v == expected, "wrong effect from calling oneapi::dpl::remove with empty list-initialized value and with `seq` policy");
}
{
std::vector<int> v{3,6,0,4,0,7,8,0,3,4};
std::vector<int> expected{3,6,4,7,8,3,4};
auto it = oneapi::dpl::remove(oneapi::dpl::execution::unseq, v.begin(), v.end(), {});
EXPECT_TRUE(it == v.begin() + 7, "not all empty list-initialized values are properly removed by oneapi::dpl::remove with `unseq` policy");
v.erase(it, v.end());
EXPECT_TRUE(v == expected, "wrong effect from calling oneapi::dpl::remove with empty list-initialized value and with `unseq` policy");
}

{
{
std::vector<TestUtils::DefaultInitializedToOne> v_custom{{3},{1},{5},{1},{3},{1},{8},{2},{0},{1}};
std::vector<TestUtils::DefaultInitializedToOne> expected_custom{{3},{5},{3},{8},{2},{0}};
auto it = oneapi::dpl::remove(oneapi::dpl::execution::par, v_custom.begin(), v_custom.end(), {});
EXPECT_TRUE(it == v_custom.begin() + 6, "not all empty list-initialized values are properly removed by oneapi::dpl::remove with `par` policy");
v_custom.erase(it, v_custom.end());
EXPECT_TRUE(v_custom == expected_custom, "wrong effect from calling oneapi::dpl::remove with empty list-initialized value and with `par` policy");
}
{
std::vector<TestUtils::DefaultInitializedToOne> v_custom{{3},{1},{5},{1},{3},{1},{8},{2},{0},{1}};
std::vector<TestUtils::DefaultInitializedToOne> expected_custom{{3},{5},{3},{8},{2},{0}};
auto it = oneapi::dpl::remove(oneapi::dpl::execution::par_unseq, v_custom.begin(), v_custom.end(), {});
EXPECT_TRUE(it == v_custom.begin() + 6, "not all empty list-initialized values are properly removed by oneapi::dpl::remove with `par_unseq` policy");
v_custom.erase(it, v_custom.end());
EXPECT_TRUE(v_custom == expected_custom, "wrong effect from calling oneapi::dpl::remove with empty list-initialized value and with `par_unseq` policy");
}
}
#if TEST_DPCPP_BACKEND_PRESENT
std::vector<int> v{3,6,0,4,0,7,8,0,3,4};
std::vector<int> expected{3,6,4,7,8,3,4};
sycl::buffer<int> buf(v);
auto it = oneapi::dpl::remove(oneapi::dpl::execution::dpcpp_default, oneapi::dpl::begin(buf), oneapi::dpl::end(buf), {});
EXPECT_TRUE(it.get_idx() == 7, "not all empty list-initialized values are properly removed by oneapi::dpl::remove with `device_policy` policy");
v.erase(v.begin() + it.get_idx(), v.end());
EXPECT_TRUE(v == expected, "wrong effect from calling oneapi::dpl::remove with empty list-initialized value and with `device_policy` policy");
#endif
}

int
main()
{
Expand Down Expand Up @@ -133,5 +181,7 @@ main()
EXPECT_TRUE(MemoryChecker::alive_objects() == 0, "wrong effect from remove,remove_if: number of ctor and dtor calls is not equal");
#endif

test_empty_list_initialization();

return done();
}
Loading