Skip to content

Commit 0827385

Browse files
committed
More constexpr
1 parent 0a41d6f commit 0827385

File tree

6 files changed

+33
-24
lines changed

6 files changed

+33
-24
lines changed

include/beman/execution26/detail/forward_like.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,43 +18,43 @@ struct forward_like_helper;
1818
template <typename T>
1919
struct forward_like_helper {
2020
template <typename U>
21-
static auto forward(U&& u) -> ::std::remove_reference_t<U>&& {
21+
static constexpr auto forward(U&& u) -> ::std::remove_reference_t<U>&& {
2222
return ::std::move(u); // NOLINT(bugprone-move-forwarding-reference)
2323
}
2424
};
2525
template <typename T>
2626
struct forward_like_helper<T&&> {
2727
template <typename U>
28-
static auto forward(U&& u) -> ::std::remove_cvref_t<U>&& {
28+
static constexpr auto forward(U&& u) -> ::std::remove_cvref_t<U>&& {
2929
return ::std::move(u); // NOLINT(bugprone-move-forwarding-reference)
3030
}
3131
};
3232
template <typename T>
3333
struct forward_like_helper<T&> {
3434
template <typename U>
35-
static auto forward(U&& u) -> ::std::remove_cvref_t<U>& {
35+
static constexpr auto forward(U&& u) -> ::std::remove_cvref_t<U>& {
3636
return ::std::forward<U&&>(u);
3737
}
3838
};
3939
template <typename T>
4040
struct forward_like_helper<const T&&> {
4141
template <typename U>
42-
static auto forward(U&& u) -> const ::std::remove_cvref_t<U>&& {
42+
static constexpr auto forward(U&& u) -> const ::std::remove_cvref_t<U>&& {
4343
return ::std::move(u); // NOLINT(bugprone-move-forwarding-reference)
4444
}
4545
};
4646
template <typename T>
4747
struct forward_like_helper<const T&> {
4848
template <typename U>
49-
static auto forward(U&& u) -> const ::std::remove_cvref_t<U>& {
49+
static constexpr auto forward(U&& u) -> const ::std::remove_cvref_t<U>& {
5050
return ::std::forward<U&&>(u);
5151
}
5252
};
5353

5454
// The overload own_forward_like is used for testing on systems
5555
// which actually do provide an implementation.
5656
template <typename T, typename U>
57-
auto own_forward_like(U&& u) noexcept -> decltype(auto) {
57+
constexpr auto own_forward_like(U&& u) noexcept -> decltype(auto) {
5858
return ::beman::execution26::detail::forward_like_helper<T>::forward(::std::forward<U>(u));
5959
}
6060

@@ -64,7 +64,7 @@ auto own_forward_like(U&& u) noexcept -> decltype(auto) {
6464
* \internal
6565
*/
6666
template <typename T, typename U>
67-
auto forward_like(U&& u) noexcept -> decltype(auto) {
67+
constexpr auto forward_like(U&& u) noexcept -> decltype(auto) {
6868
#if 202207 <= disabled__cpp_lib_forward_like
6969
return ::std::forward_like<T>(::std::forward<U>(u));
7070
#else

include/beman/execution26/detail/get_completion_behaviour.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ struct get_completion_behaviour_t {
4949
new_sender(::std::forward<Sender>(sender), ::std::forward<Env>(env))
5050
.get_completion_behaviour(std::forward<Env>(env));
5151
}) {
52-
return new_sender(::std::forward<Sender>(sender), ::std::forward<Env>(env))
52+
std::remove_cvref_t<Env> copiedEnv(env);
53+
return new_sender(::std::forward<Sender>(sender), ::std::forward<Env>(copiedEnv))
5354
.get_completion_behaviour(std::forward<Env>(env));
5455
} else if constexpr (::beman::execution26::detail::is_awaitable<
5556
new_sender_type,

include/beman/execution26/detail/just.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222

2323
namespace beman::execution26::detail {
2424
template <typename Completion, typename... T>
25-
concept just_size = (not::std::same_as<Completion, ::beman::execution26::set_error_t> or 1u == sizeof...(T)) &&
26-
(not::std::same_as<Completion, ::beman::execution26::set_stopped_t> or 0u == sizeof...(T));
25+
concept just_size = (not ::std::same_as<Completion, ::beman::execution26::set_error_t> or 1u == sizeof...(T)) &&
26+
(not ::std::same_as<Completion, ::beman::execution26::set_stopped_t> or 0u == sizeof...(T));
2727
template <typename Completion>
2828
struct just_t {
2929
template <typename... T>
3030
requires ::beman::execution26::detail::just_size<Completion, T...> &&
3131
(::std::movable<::std::decay_t<T>> && ...)
32-
auto operator()(T&&... arg) const {
32+
constexpr auto operator()(T&&... arg) const {
3333
return ::beman::execution26::detail::make_sender(
3434
*this, ::beman::execution26::detail::product_type{::std::forward<T>(arg)...});
3535
}

include/beman/execution26/detail/product_type.hpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,34 +29,35 @@ struct product_type_base<::std::index_sequence<I...>, T...>
2929
static constexpr bool is_product_type{true};
3030

3131
template <::std::size_t J, typename S>
32-
static auto element_get(::beman::execution26::detail::product_type_element<J, S>& self) noexcept -> S& {
32+
static constexpr auto element_get(::beman::execution26::detail::product_type_element<J, S>& self) noexcept -> S& {
3333
return self.value;
3434
}
3535
template <::std::size_t J, typename S>
36-
static auto element_get(::beman::execution26::detail::product_type_element<J, S>&& self) noexcept -> S&& {
36+
static constexpr auto
37+
element_get(::beman::execution26::detail::product_type_element<J, S>&& self) noexcept -> S&& {
3738
return ::std::move(self.value);
3839
}
3940
template <::std::size_t J, typename S>
40-
static auto element_get(const ::beman::execution26::detail::product_type_element<J, S>& self) noexcept
41-
-> const S& {
41+
static constexpr auto
42+
element_get(const ::beman::execution26::detail::product_type_element<J, S>& self) noexcept -> const S& {
4243
return self.value;
4344
}
4445

4546
template <::std::size_t J>
46-
auto get() & -> decltype(auto) {
47+
constexpr auto get() & -> decltype(auto) {
4748
return this->element_get<J>(*this);
4849
}
4950
template <::std::size_t J>
50-
auto get() && -> decltype(auto) {
51+
constexpr auto get() && -> decltype(auto) {
5152
return this->element_get<J>(::std::move(*this));
5253
}
5354
template <::std::size_t J>
54-
auto get() const& -> decltype(auto) {
55+
constexpr auto get() const& -> decltype(auto) {
5556
return this->element_get<J>(*this);
5657
}
5758

5859
template <::std::size_t J, typename Allocator, typename Self>
59-
static auto make_element(Allocator&& alloc, Self&& self) -> decltype(auto) {
60+
static constexpr auto make_element(Allocator&& alloc, Self&& self) -> decltype(auto) {
6061
using type = ::std::remove_cvref_t<decltype(product_type_base::element_get<J>(std::forward<Self>(self)))>;
6162
if constexpr (::std::uses_allocator_v<type, Allocator>)
6263
return ::std::make_obj_using_allocator<type>(alloc,
@@ -65,7 +66,7 @@ struct product_type_base<::std::index_sequence<I...>, T...>
6566
return product_type_base::element_get<J>(std::forward<Self>(self));
6667
}
6768

68-
auto operator==(const product_type_base&) const -> bool = default;
69+
constexpr auto operator==(const product_type_base&) const -> bool = default;
6970
};
7071

7172
template <typename T>
@@ -74,12 +75,13 @@ concept is_product_type_c = requires(const T& t) { T::is_product_type; };
7475
template <typename... T>
7576
struct product_type : ::beman::execution26::detail::product_type_base<::std::index_sequence_for<T...>, T...> {
7677
template <typename Allocator, typename Product, std::size_t... I>
77-
static auto make_from(Allocator&& allocator, Product&& product, std::index_sequence<I...>) -> product_type {
78+
static constexpr auto
79+
make_from(Allocator&& allocator, Product&& product, std::index_sequence<I...>) -> product_type {
7880
return {product_type::template make_element<I>(allocator, ::std::forward<Product>(product))...};
7981
}
8082

8183
template <typename Allocator, typename Product>
82-
static auto make_from(Allocator&& allocator, Product&& product) -> product_type {
84+
static constexpr auto make_from(Allocator&& allocator, Product&& product) -> product_type {
8385
return product_type::make_from(
8486
::std::forward<Allocator>(allocator), ::std::forward<Product>(product), ::std::index_sequence_for<T...>{});
8587
}

include/beman/execution26/detail/sender_decompose.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct sender_data {
3535
};
3636

3737
template <typename Sender>
38-
auto get_sender_data(Sender&& sender) {
38+
constexpr auto get_sender_data(Sender&& sender) {
3939
#if 0
4040
//-dk:TODO should use a dynamic/language approach:
4141
auto&& [tag, data, ... children] = sender;
@@ -82,7 +82,7 @@ auto get_sender_data(Sender&& sender) {
8282
}
8383

8484
template <typename Sender>
85-
auto get_sender_meta(Sender&& sender) {
85+
constexpr auto get_sender_meta(Sender&& sender) {
8686
using type = decltype(get_sender_data(sender));
8787
return sender_meta<typename type::tag_type, typename type::data_type, typename type::children_type>{};
8888
}

tests/beman/execution26/exec-get-completion-behaviour.test.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,17 @@ void test_just() {
5151
ASSERT(test_std::completion_behaviour::inline_completion == completion_behaviour);
5252
}
5353

54+
void test_constexpr_just() {
55+
constexpr auto completion_behaviour = test_std::get_completion_behaviour(test_std::just(), test_std::empty_env{});
56+
ASSERT(test_std::completion_behaviour::inline_completion == completion_behaviour);
57+
}
58+
5459
} // namespace
5560

5661
TEST(exec_get_completion_behaviour) {
5762
test_constexpr_awaitable();
5863
test_typedef_sender();
5964
test_constexpr_sender();
6065
test_just();
66+
test_constexpr_just();
6167
}

0 commit comments

Comments
 (0)