Skip to content

Commit 75d041b

Browse files
authored
[CUDAX] Add in_place_type argument to pass-through constructor of shared resource (#4714)
* Remove direct constructor of shared resource * Fix the moved resource test * Switch to inplace_type solution * Remove leftover pieces of previous solution
1 parent b6a6390 commit 75d041b

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

cudax/include/cuda/experimental/__memory_resource/shared_resource.cuh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <cuda/std/__type_traits/is_swappable.h>
2727
#include <cuda/std/__utility/exchange.h>
2828
#include <cuda/std/__utility/forward.h>
29+
#include <cuda/std/__utility/in_place.h>
2930
#include <cuda/std/__utility/move.h>
3031
#include <cuda/std/atomic>
3132

@@ -56,7 +57,7 @@ struct shared_resource
5657
//! dynamically allocated with \c new.
5758
//! @param __args The arguments to be passed to the \c _Resource constructor.
5859
template <class... _Args>
59-
explicit shared_resource(_Args&&... __args)
60+
explicit shared_resource(_CUDA_VSTD::in_place_type_t<_Resource>, _Args&&... __args)
6061
: __control_block(new _Control_block{_Resource{_CUDA_VSTD::forward<_Args>(__args)...}, 1})
6162
{}
6263

@@ -252,7 +253,7 @@ template <class _Resource, class... _Args>
252253
auto make_shared_resource(_Args&&... __args) -> shared_resource<_Resource>
253254
{
254255
static_assert(_CUDA_VMR::resource<_Resource>, "_Resource does not satisfy the cuda::mr::resource concept");
255-
return shared_resource<_Resource>{_CUDA_VSTD::forward<_Args>(__args)...};
256+
return shared_resource<_Resource>{_CUDA_VSTD::in_place_type<_Resource>, _CUDA_VSTD::forward<_Args>(__args)...};
256257
}
257258

258259
} // namespace cuda::experimental

cudax/test/memory_resource/shared_resource.cu

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ TEMPLATE_TEST_CASE_METHOD(test_fixture, "shared_resource", "[container][resource
2525
Counts expected{};
2626
CHECK(this->counts == expected);
2727
{
28-
cudax::shared_resource<TestResource> mr{42, this};
28+
cudax::shared_resource mr{cuda::std::in_place_type<TestResource>, 42, this};
2929
++expected.object_count;
3030
CHECK(this->counts == expected);
3131
}
@@ -42,7 +42,7 @@ TEMPLATE_TEST_CASE_METHOD(test_fixture, "shared_resource", "[container][resource
4242
Counts expected{};
4343
CHECK(this->counts == expected);
4444
{
45-
cudax::shared_resource<TestResource> mr{42, this};
45+
cudax::shared_resource mr{cuda::std::in_place_type<TestResource>, 42, this};
4646
++expected.object_count;
4747
CHECK(this->counts == expected);
4848

@@ -51,15 +51,20 @@ TEMPLATE_TEST_CASE_METHOD(test_fixture, "shared_resource", "[container][resource
5151
CHECK(mr == mr2); // pointers compare equal, no call to TestResource::operator==
5252
CHECK(this->counts == expected);
5353

54-
auto mr3 = std::move(mr);
54+
cudax::shared_resource mr3{mr};
5555
CHECK(this->counts == expected);
56-
CHECK(mr2 == mr3); // pointers compare equal, no call to TestResource::operator==
56+
CHECK(mr == mr3); // pointers compare equal, no call to TestResource::operator==
5757
CHECK(this->counts == expected);
5858

59-
cudax::shared_resource<TestResource> mr4{TestResource{42, this}};
59+
auto mr4 = std::move(mr);
60+
CHECK(this->counts == expected);
61+
CHECK(mr2 == mr4); // pointers compare equal, no call to TestResource::operator==
62+
CHECK(this->counts == expected);
63+
64+
cudax::shared_resource mr5{cuda::std::in_place_type<TestResource>, TestResource{42, this}};
6065
++expected.object_count;
6166
++expected.move_count;
62-
CHECK(mr3 == mr4); // pointers are not equal, calls TestResource::operator==
67+
CHECK(mr4 == mr5); // pointers are not equal, calls TestResource::operator==
6368
++expected.equal_to_count;
6469
CHECK(this->counts == expected);
6570
}
@@ -76,7 +81,7 @@ TEMPLATE_TEST_CASE_METHOD(test_fixture, "shared_resource", "[container][resource
7681
Counts expected{};
7782
CHECK(this->counts == expected);
7883
{
79-
cudax::shared_resource<TestResource> mr{42, this};
84+
cudax::shared_resource mr{cuda::std::in_place_type<TestResource>, 42, this};
8085
++expected.object_count;
8186
CHECK(this->counts == expected);
8287

@@ -101,7 +106,7 @@ TEMPLATE_TEST_CASE_METHOD(test_fixture, "shared_resource", "[container][resource
101106
{
102107
Counts expected{};
103108
{
104-
cudax::shared_resource<TestResource> mr{42, this};
109+
cudax::shared_resource mr{cuda::std::in_place_type<TestResource>, 42, this};
105110
++expected.object_count;
106111
CHECK(this->counts == expected);
107112

@@ -130,7 +135,7 @@ TEMPLATE_TEST_CASE_METHOD(test_fixture, "shared_resource", "[container][resource
130135
{
131136
bytes(42 * sizeof(int));
132137
cudax::uninitialized_buffer<int, cudax::host_accessible> buffer{
133-
cudax::shared_resource<TestResource>(42, this), 42};
138+
cudax::shared_resource<TestResource>(cuda::std::in_place_type<TestResource>, 42, this), 42};
134139
++expected.object_count;
135140
++expected.allocate_count;
136141
CHECK(this->counts == expected);

0 commit comments

Comments
 (0)