Skip to content

Commit

Permalink
define exclusive_scan_result, simplify concept expressions for overlo…
Browse files Browse the repository at this point in the history
…ads and constexpr sequential functions
  • Loading branch information
Jedi18 committed Jul 23, 2021
1 parent 288961b commit 99de280
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,7 @@ namespace hpx { namespace traits {
typedef typename util::detail::iterator<R>::type iterator_type;
typedef typename util::detail::sentinel<R>::type sentinel_type;
};

template <typename T>
using range_iterator_t = typename range_iterator<T>::type;
}} // namespace hpx::traits
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Copyright (c) 2016 Minh-Khanh Do
// Copyright (c) 2020 Hartmut Kaiser
// Copyright (c) 2021 Akhil J Nair
//
// SPDX-License-Identifier: BSL-1.0
// Distributed under the Boost Software License, Version 1.0. (See accompanying
Expand Down Expand Up @@ -74,8 +75,8 @@ namespace hpx { namespace parallel { inline namespace v1 {
static vector_type sequential(
ExPolicy&& policy, InIter first, InIter last, Op&& op)
{
typedef typename std::iterator_traits<InIter>::value_type
value_type;
using value_type =
typename std::iterator_traits<InIter>::value_type;

vector_type result(std::distance(first, last));

Expand All @@ -97,11 +98,10 @@ namespace hpx { namespace parallel { inline namespace v1 {
parallel(
ExPolicy&& /* policy */, FwdIter first, FwdIter last, Op&& op)
{
typedef typename std::iterator_traits<FwdIter>::value_type
value_type;

typedef util::detail::algorithm_result<ExPolicy, vector_type>
result;
using value_type =
typename std::iterator_traits<FwdIter>::value_type;
using result =
util::detail::algorithm_result<ExPolicy, vector_type>;

vector_type res(std::distance(first, last));

Expand Down Expand Up @@ -130,7 +130,7 @@ namespace hpx { namespace parallel { inline namespace v1 {
SegIter last, OutIter dest, T const& init, Op&& op, std::true_type,
Conv&& conv)
{
typedef hpx::traits::segmented_iterator_traits<OutIter> traits_out;
using traits_out = hpx::traits::segmented_iterator_traits<OutIter>;
return segmented_scan_seq<transform_exclusive_scan<
typename traits_out::local_raw_iterator>>(
std::forward<ExPolicy>(policy), first, last, dest,
Expand All @@ -146,8 +146,7 @@ namespace hpx { namespace parallel { inline namespace v1 {
SegIter last, OutIter dest, T const& init, Op&& op, std::false_type,
Conv&& /* conv */)
{
typedef std::vector<T> vector_type;

using vector_type = std::vector<T>;
return segmented_scan_seq_non<
segmented_exclusive_scan_vector<vector_type>>(
std::forward<ExPolicy>(policy), first, last, dest, init,
Expand All @@ -168,7 +167,7 @@ namespace hpx { namespace parallel { inline namespace v1 {
SegIter last, OutIter dest, T const& init, Op&& op, std::true_type,
Conv&& conv)
{
typedef hpx::traits::segmented_iterator_traits<OutIter> traits_out;
using traits_out = hpx::traits::segmented_iterator_traits<OutIter>;
return segmented_scan_par<transform_exclusive_scan<
typename traits_out::local_raw_iterator>>(
std::forward<ExPolicy>(policy), first, last, dest,
Expand All @@ -184,7 +183,7 @@ namespace hpx { namespace parallel { inline namespace v1 {
SegIter last, OutIter dest, T const& init, Op&& op, std::false_type,
Conv&& /* conv */)
{
typedef std::vector<T> vector_type;
using vector_type = std::vector<T>;
return segmented_scan_par_non<
segmented_exclusive_scan_vector<vector_type>>(
std::forward<ExPolicy>(policy), first, last, dest, init,
Expand All @@ -202,8 +201,8 @@ namespace hpx { namespace parallel { inline namespace v1 {
segmented_exclusive_scan(ExPolicy&& policy, SegIter first, SegIter last,
OutIter dest, T const& init, Op&& op, std::true_type, Conv&& conv)
{
typedef typename hpx::traits::segmented_iterator_traits<
OutIter>::is_segmented_iterator is_out_seg;
using is_out_seg = typename hpx::traits::segmented_iterator_traits<
OutIter>::is_segmented_iterator;

// check if OutIter is segmented in the same way as SegIter
// NOLINTNEXTLINE(bugprone-branch-clone)
Expand Down Expand Up @@ -231,8 +230,8 @@ namespace hpx { namespace parallel { inline namespace v1 {
segmented_exclusive_scan(ExPolicy&& policy, SegIter first, SegIter last,
OutIter dest, T const& init, Op&& op, std::false_type, Conv&& conv)
{
typedef typename hpx::traits::segmented_iterator_traits<
OutIter>::is_segmented_iterator is_out_seg;
using is_out_seg = typename hpx::traits::segmented_iterator_traits<
OutIter>::is_segmented_iterator;

// NOLINTNEXTLINE(bugprone-branch-clone)
if (is_segmented_the_same(first, last, dest, is_out_seg()))
Expand Down Expand Up @@ -261,19 +260,23 @@ namespace hpx { namespace segmented {
template <typename InIter, typename OutIter,
typename T, typename Op = std::plus<T>,
HPX_CONCEPT_REQUIRES_(
hpx::traits::is_iterator<InIter>::value &&
hpx::traits::is_segmented_iterator<InIter>::value &&
hpx::traits::is_iterator<OutIter>::value &&
hpx::traits::is_segmented_iterator<OutIter>::value
hpx::traits::is_iterator_v<InIter> &&
hpx::traits::is_segmented_iterator_v<InIter> &&
hpx::traits::is_iterator_v<OutIter> &&
hpx::traits::is_segmented_iterator_v<OutIter> &&
hpx::is_invocable_v<Op,
typename std::iterator_traits<InIter>::value_type,
typename std::iterator_traits<InIter>::value_type
>
)>
// clang-format on
OutIter tag_dispatch(hpx::exclusive_scan_t, InIter first, InIter last,
OutIter dest, T init, Op&& op = Op())
{
static_assert(hpx::traits::is_input_iterator<InIter>::value,
static_assert(hpx::traits::is_input_iterator_v<InIter>,
"Requires at least input iterator.");

static_assert(hpx::traits::is_output_iterator<OutIter>::value,
static_assert(hpx::traits::is_output_iterator_v<OutIter>,
"Requires at least output iterator.");

if (first == last)
Expand All @@ -290,20 +293,24 @@ namespace hpx { namespace segmented {
typename T, typename Op = std::plus<T>,
HPX_CONCEPT_REQUIRES_(
hpx::is_execution_policy<ExPolicy>::value &&
hpx::traits::is_iterator<FwdIter1>::value &&
hpx::traits::is_segmented_iterator<FwdIter1>::value &&
hpx::traits::is_iterator<FwdIter2>::value &&
hpx::traits::is_segmented_iterator<FwdIter2>::value
hpx::traits::is_iterator_v<FwdIter1> &&
hpx::traits::is_segmented_iterator_v<FwdIter1> &&
hpx::traits::is_iterator_v<FwdIter2> &&
hpx::traits::is_segmented_iterator_v<FwdIter2> &&
hpx::is_invocable_v<Op,
typename std::iterator_traits<FwdIter1>::value_type,
typename std::iterator_traits<FwdIter1>::value_type
>
)>
// clang-format on
typename parallel::util::detail::algorithm_result<ExPolicy, FwdIter2>::type
tag_dispatch(hpx::exclusive_scan_t, ExPolicy&& policy, FwdIter1 first,
FwdIter1 last, FwdIter2 dest, T init, Op&& op = Op())
{
static_assert(hpx::traits::is_forward_iterator<FwdIter1>::value,
static_assert(hpx::traits::is_forward_iterator_v<FwdIter1>,
"Requires at least forward iterator.");

static_assert(hpx::traits::is_forward_iterator<FwdIter2>::value,
static_assert(hpx::traits::is_forward_iterator_v<FwdIter2>,
"Requires at least forward iterator.");

if (first == last)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,8 @@ namespace hpx { namespace parallel { inline namespace v1 {
// Our own version of the sequential exclusive_scan.
template <typename InIter, typename Sent, typename OutIter, typename T,
typename Op>
util::in_out_result<InIter, OutIter> sequential_exclusive_scan(
static constexpr util::in_out_result<InIter, OutIter>
sequential_exclusive_scan(
InIter first, Sent last, OutIter dest, T init, Op&& op)
{
T temp = init;
Expand All @@ -339,7 +340,7 @@ namespace hpx { namespace parallel { inline namespace v1 {
}

template <typename InIter, typename OutIter, typename T, typename Op>
T sequential_exclusive_scan_n(
static constexpr T sequential_exclusive_scan_n(
InIter first, std::size_t count, OutIter dest, T init, Op&& op)
{
T temp = init;
Expand All @@ -364,8 +365,9 @@ namespace hpx { namespace parallel { inline namespace v1 {

template <typename ExPolicy, typename InIter, typename Sent,
typename OutIter, typename T, typename Op>
static util::in_out_result<InIter, OutIter> sequential(ExPolicy,
InIter first, Sent last, OutIter dest, T const& init, Op&& op)
static constexpr util::in_out_result<InIter, OutIter> sequential(
ExPolicy, InIter first, Sent last, OutIter dest, T const& init,
Op&& op)
{
return sequential_exclusive_scan(
first, last, dest, init, std::forward<Op>(op));
Expand Down Expand Up @@ -462,7 +464,11 @@ namespace hpx { namespace parallel { inline namespace v1 {
HPX_CONCEPT_REQUIRES_(
hpx::is_execution_policy<ExPolicy>::value &&
hpx::traits::is_iterator_v<FwdIter1> &&
hpx::traits::is_iterator_v<FwdIter2>
hpx::traits::is_iterator_v<FwdIter2> &&
hpx::is_invocable_v<Op,
typename std::iterator_traits<FwdIter1>::value_type,
typename std::iterator_traits<FwdIter1>::value_type
>
)>
// clang-format on
HPX_DEPRECATED_V(1, 8,
Expand Down Expand Up @@ -563,8 +569,8 @@ namespace hpx {
typename T,
HPX_CONCEPT_REQUIRES_(
hpx::is_execution_policy<ExPolicy>::value &&
hpx::traits::is_forward_iterator_v<FwdIter1> &&
hpx::traits::is_forward_iterator_v<FwdIter2>
hpx::traits::is_iterator_v<FwdIter1> &&
hpx::traits::is_iterator_v<FwdIter2>
)>
// clang-format on
friend typename parallel::util::detail::algorithm_result<ExPolicy,
Expand All @@ -591,7 +597,11 @@ namespace hpx {
typename Op,
HPX_CONCEPT_REQUIRES_(
hpx::traits::is_iterator_v<InIter> &&
hpx::traits::is_iterator_v<OutIter>
hpx::traits::is_iterator_v<OutIter> &&
hpx::is_invocable_v<Op,
typename std::iterator_traits<InIter>::value_type,
typename std::iterator_traits<InIter>::value_type
>
)>
// clang-format on
friend OutIter tag_fallback_dispatch(hpx::exclusive_scan_t,
Expand All @@ -615,8 +625,12 @@ namespace hpx {
typename T, typename Op,
HPX_CONCEPT_REQUIRES_(
hpx::is_execution_policy<ExPolicy>::value &&
hpx::traits::is_forward_iterator_v<FwdIter1> &&
hpx::traits::is_forward_iterator_v<FwdIter2>
hpx::traits::is_iterator_v<FwdIter1> &&
hpx::traits::is_iterator_v<FwdIter2> &&
hpx::is_invocable_v<Op,
typename std::iterator_traits<FwdIter1>::value_type,
typename std::iterator_traits<FwdIter1>::value_type
>
)>
// clang-format on
friend typename parallel::util::detail::algorithm_result<ExPolicy,
Expand Down
Loading

0 comments on commit 99de280

Please sign in to comment.