Skip to content

Commit 9e52541

Browse files
committed
fix returned value of in_out results
1 parent 3916299 commit 9e52541

File tree

2 files changed

+57
-42
lines changed

2 files changed

+57
-42
lines changed

libs/core/algorithms/include/hpx/parallel/algorithms/uninitialized_relocate.hpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -329,11 +329,13 @@ namespace hpx::parallel {
329329
InIter part_source = get<0>(iters);
330330
FwdIter part_dest = get<1>(iters);
331331

332-
// returns (dest begin, dest end)
333-
return std::make_pair(part_dest,
332+
auto [part_source_advanced, part_dest_advanced] =
334333
hpx::experimental::util::
335334
uninitialized_relocate_n_primitive(
336-
part_source, part_size, part_dest));
335+
part_source, part_size, part_dest);
336+
337+
// returns (dest begin, dest end)
338+
return std::make_pair(part_dest, part_dest_advanced);
337339
},
338340
// finalize, called once if no error occurred
339341
[first, dest, count](auto&& data) mutable
@@ -382,9 +384,12 @@ namespace hpx::parallel {
382384
experimental::util::detail::relocation_traits<InIter,
383385
FwdIter>::is_noexcept_relocatable_v)
384386
{
385-
return util::in_out_result<InIter, FwdIter>{first,
387+
auto [first_advanced, dest_advanced] =
386388
hpx::experimental::util::uninitialized_relocate_n_primitive(
387-
first, count, dest)};
389+
first, count, dest);
390+
391+
return util::in_out_result<InIter, FwdIter>{
392+
first_advanced, dest_advanced};
388393
}
389394

390395
// clang-format off
@@ -437,9 +442,11 @@ namespace hpx::parallel {
437442
FwdIter dest) noexcept(hpx::experimental::util::detail::relocation_traits<
438443
InIter1, FwdIter>::is_noexcept_relocatable_v)
439444
{
440-
return util::in_out_result<InIter1, FwdIter>{first,
445+
auto [first_advanced, dest_advanced] =
441446
hpx::experimental::util::uninitialized_relocate_primitive(
442-
first, last, dest)};
447+
first, last, dest);
448+
449+
return util::in_out_result<InIter1, FwdIter>{first_advanced, dest_advanced};
443450
}
444451

445452
template <typename ExPolicy, typename InIter1, typename InIter2,
@@ -485,8 +492,8 @@ namespace hpx::parallel {
485492
template <typename ExPolicy, typename BiIter1, typename BiIter2,
486493
// clang-format off
487494
HPX_CONCEPT_REQUIRES_(
488-
hpx::is_sequenced_execution_policy_v<ExPolicy>&&
489-
hpx::traits::is_bidirectional_iterator_v<BiIter1>&&
495+
hpx::is_sequenced_execution_policy_v<ExPolicy> &&
496+
hpx::traits::is_bidirectional_iterator_v<BiIter1> &&
490497
hpx::traits::is_bidirectional_iterator_v<BiIter2>
491498
)>
492499
// clang-format on
@@ -495,9 +502,12 @@ namespace hpx::parallel {
495502
BiIter2 dest_last) noexcept(hpx::experimental::util::detail::
496503
relocation_traits<BiIter1, BiIter2>::is_noexcept_relocatable_v)
497504
{
498-
return util::in_out_result<BiIter1, BiIter2>{first,
499-
hpx::experimental::util::uninitialized_relocate_backward_primitive(
500-
first, last, dest_last)};
505+
auto [last_advanced, dest_last_advanced] =
506+
hpx::experimental::util::uninitialized_relocate_backward_primitive(
507+
first, last, dest_last);
508+
509+
return util::in_out_result<BiIter1, BiIter2>{last_advanced, dest_last_advanced
510+
};
501511
}
502512

503513
template <typename ExPolicy, typename BiIter1, typename BiIter2,

libs/core/type_support/include/hpx/type_support/uninitialized_relocate_n_primitive.hpp

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
#include <hpx/type_support/is_trivially_relocatable.hpp>
1212
#include <hpx/type_support/relocate_at.hpp>
1313

14-
#include <cstring>
14+
#include <cstring> // for memmove
1515
#include <type_traits>
1616

17-
#if defined(__cpp_lib_trivially_relocatable)
17+
#include <tuple>
18+
19+
#if defined(HPX_HAVE_P1144_RELOCATE_AT)
1820
#include <memory>
1921
#endif
2022

@@ -84,7 +86,7 @@ namespace hpx::experimental::util {
8486
// uninitialized_relocate_n //
8587
//////////////////////////////
8688
template <typename InIter, typename Size, typename FwdIter>
87-
FwdIter uninitialized_relocate_n_primitive_helper(
89+
std::tuple<InIter, FwdIter> uninitialized_relocate_n_primitive_helper(
8890
InIter first, Size n, FwdIter dst, buffer_memcpy_tag) noexcept
8991
{
9092
if (n != 0)
@@ -106,13 +108,13 @@ namespace hpx::experimental::util {
106108
dst += n;
107109
}
108110

109-
return dst;
111+
return {first, dst};
110112
}
111113

112114
template <typename InIter, typename Size, typename FwdIter>
113115
// Either the buffer is not contiguous or the types are no-throw
114116
// move constructible but not trivially relocatable
115-
FwdIter uninitialized_relocate_n_primitive_helper(
117+
std::tuple<InIter, FwdIter> uninitialized_relocate_n_primitive_helper(
116118
InIter first, Size n, FwdIter dst, for_loop_nothrow_tag) noexcept
117119
{
118120
for (Size i = 0; i < n; ++first, ++dst, ++i)
@@ -123,11 +125,11 @@ namespace hpx::experimental::util {
123125
std::addressof(*first), std::addressof(*dst));
124126
}
125127

126-
return dst;
128+
return {first, dst};
127129
}
128130

129131
template <typename InIter, typename Size, typename FwdIter>
130-
FwdIter uninitialized_relocate_n_primitive_helper(
132+
std::tuple<InIter, FwdIter> uninitialized_relocate_n_primitive_helper(
131133
InIter first, Size n, FwdIter dst, for_loop_try_catch_tag)
132134
{
133135
FwdIter original_dst = dst;
@@ -158,14 +160,14 @@ namespace hpx::experimental::util {
158160
}
159161
}
160162

161-
return dst;
163+
return {first, dst};
162164
}
163165

164166
////////////////////////////
165167
// uninitialized_relocate //
166168
////////////////////////////
167169
template <typename InIter, typename Sent, typename FwdIter>
168-
FwdIter uninitialized_relocate_primitive_helper(
170+
std::tuple<InIter, FwdIter> uninitialized_relocate_primitive_helper(
169171
InIter first, Sent last, FwdIter dst, buffer_memcpy_tag) noexcept
170172
{
171173
return uninitialized_relocate_n_primitive_helper(
@@ -175,7 +177,7 @@ namespace hpx::experimental::util {
175177
template <typename InIter, typename Sent, typename FwdIter>
176178
// Either the buffer is not contiguous or the types are no-throw
177179
// move constructible but not trivially relocatable
178-
FwdIter uninitialized_relocate_primitive_helper(
180+
std::tuple<InIter, FwdIter> uninitialized_relocate_primitive_helper(
179181
InIter first, Sent last, FwdIter dst, for_loop_nothrow_tag) noexcept
180182
{
181183
for (; first != last; ++first, ++dst)
@@ -186,11 +188,11 @@ namespace hpx::experimental::util {
186188
std::addressof(*first), std::addressof(*dst));
187189
}
188190

189-
return dst;
191+
return {first, dst};
190192
}
191193

192194
template <typename InIter, typename Sent, typename FwdIter>
193-
FwdIter uninitialized_relocate_primitive_helper(
195+
std::tuple<InIter, FwdIter> uninitialized_relocate_primitive_helper(
194196
InIter first, Sent last, FwdIter dst, for_loop_try_catch_tag)
195197
{
196198
FwdIter original_dst = dst;
@@ -218,14 +220,15 @@ namespace hpx::experimental::util {
218220
}
219221
}
220222

221-
return dst;
223+
return {first, dst};
222224
}
223225

224226
/////////////////////////////////////
225227
// uninitialized_relocate_backward //
226228
/////////////////////////////////////
227229
template <typename BiIter1, typename BiIter2>
228-
BiIter2 uninitialized_relocate_backward_primitive_helper(BiIter1 first,
230+
std::tuple<BiIter1, BiIter2>
231+
uninitialized_relocate_backward_primitive_helper(BiIter1 first,
229232
BiIter1 last, BiIter2 dst_last, buffer_memcpy_tag) noexcept
230233
{
231234
// Here we know the iterators are contiguous
@@ -242,7 +245,8 @@ namespace hpx::experimental::util {
242245
// Either the buffer is not contiguous or the types are no-throw
243246
// move constructible but not trivially relocatable
244247
// dst_last is one past the last element of the destination
245-
BiIter2 uninitialized_relocate_backward_primitive_helper(BiIter1 first,
248+
std::tuple<BiIter1, BiIter2>
249+
uninitialized_relocate_backward_primitive_helper(BiIter1 first,
246250
BiIter1 last, BiIter2 dst_last, for_loop_nothrow_tag) noexcept
247251
{
248252
while (first != last)
@@ -255,14 +259,15 @@ namespace hpx::experimental::util {
255259
std::addressof(*last), std::addressof(*dst_last));
256260
}
257261

258-
return dst_last;
262+
return {last, dst_last};
259263
}
260264

261-
template <typename InIter, typename Sent, typename FwdIter>
262-
FwdIter uninitialized_relocate_backward_primitive_helper(
263-
InIter first, Sent last, FwdIter dst_last, for_loop_try_catch_tag)
265+
template <typename BiIter1, typename BiIter2>
266+
std::tuple<BiIter1, BiIter2>
267+
uninitialized_relocate_backward_primitive_helper(BiIter1 first,
268+
BiIter1 last, BiIter2 dst_last, for_loop_try_catch_tag)
264269
{
265-
FwdIter original_dst_last = dst_last;
270+
BiIter2 original_dst_last = dst_last;
266271

267272
while (first != last)
268273
{
@@ -289,7 +294,7 @@ namespace hpx::experimental::util {
289294
}
290295
}
291296

292-
return dst_last;
297+
return {last, dst_last};
293298
}
294299

295300
} // namespace detail
@@ -300,7 +305,7 @@ namespace hpx::experimental::util {
300305
template <typename InIter, typename FwdIter, typename Size,
301306
typename iterators_are_contiguous_t>
302307
// clang-format off
303-
FwdIter uninitialized_relocate_n_primitive(InIter first, Size n,
308+
std::tuple<InIter, FwdIter> uninitialized_relocate_n_primitive(InIter first, Size n,
304309
FwdIter dst, iterators_are_contiguous_t) noexcept(
305310
detail::relocation_traits<InIter, FwdIter>::is_noexcept_relocatable_v)
306311
// clang-format on
@@ -317,8 +322,8 @@ namespace hpx::experimental::util {
317322
}
318323

319324
template <typename InIter, typename Size, typename FwdIter>
320-
FwdIter uninitialized_relocate_n_primitive(InIter first, Size n,
321-
FwdIter dst) noexcept(detail::relocation_traits<InIter,
325+
std::tuple<InIter, FwdIter> uninitialized_relocate_n_primitive(InIter first,
326+
Size n, FwdIter dst) noexcept(detail::relocation_traits<InIter,
322327
FwdIter>::is_noexcept_relocatable_v)
323328
{
324329
using iterators_are_contiguous_default_t =
@@ -335,7 +340,7 @@ namespace hpx::experimental::util {
335340
template <typename InIter, typename Sent, typename FwdIter,
336341
typename iterators_are_contiguous_t>
337342
// clang-format off
338-
FwdIter uninitialized_relocate_primitive(InIter first, Sent last,
343+
std::tuple<InIter, FwdIter> uninitialized_relocate_primitive(InIter first, Sent last,
339344
FwdIter dst, iterators_are_contiguous_t) noexcept(
340345
detail::relocation_traits<InIter, FwdIter>::is_noexcept_relocatable_v)
341346
// clang-format on
@@ -353,8 +358,8 @@ namespace hpx::experimental::util {
353358
}
354359

355360
template <typename InIter, typename Sent, typename FwdIter>
356-
FwdIter uninitialized_relocate_primitive(InIter first, Sent last,
357-
FwdIter dst) noexcept(detail::relocation_traits<InIter,
361+
std::tuple<InIter, FwdIter> uninitialized_relocate_primitive(InIter first,
362+
Sent last, FwdIter dst) noexcept(detail::relocation_traits<InIter,
358363
FwdIter>::is_noexcept_relocatable_v)
359364
{
360365
using iterators_are_contiguous_default_t =
@@ -371,7 +376,7 @@ namespace hpx::experimental::util {
371376
template <typename BiIter1, typename BiIter2,
372377
typename iterators_are_contiguous_t>
373378
// clang-format off
374-
BiIter2 uninitialized_relocate_backward_primitive(BiIter1 first, BiIter1 last,
379+
std::tuple<BiIter1, BiIter2> uninitialized_relocate_backward_primitive(BiIter1 first, BiIter1 last,
375380
BiIter2 dst_last, iterators_are_contiguous_t) noexcept(
376381
detail::relocation_traits<BiIter1, BiIter2>::is_noexcept_relocatable_v)
377382
// clang-format on
@@ -389,8 +394,8 @@ namespace hpx::experimental::util {
389394
}
390395

391396
template <typename BiIter1, typename BiIter2>
392-
BiIter2 uninitialized_relocate_backward_primitive(BiIter1 first,
393-
BiIter1 last,
397+
std::tuple<BiIter1, BiIter2> uninitialized_relocate_backward_primitive(
398+
BiIter1 first, BiIter1 last,
394399
BiIter2 dst_last) noexcept(detail::relocation_traits<BiIter1,
395400
BiIter2>::is_noexcept_relocatable_v)
396401
{

0 commit comments

Comments
 (0)