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
2 changes: 1 addition & 1 deletion include/exec/detail/basic_sequence.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,6 @@ namespace STDEXEC::__detail
extern decltype(_DescriptorFn()) __desc_of_v<exec::__seqexpr<_DescriptorFn>>;

template <auto _DescriptorFn>
extern __declfn_t<__minvoke<decltype(_DescriptorFn()), __q<exec::__basic_sequence_sender_t>>>
extern __mtype<__minvoke<decltype(_DescriptorFn()), __q<exec::__basic_sequence_sender_t>>>
__demangle_v<exec::__seqexpr<_DescriptorFn>>;
} // namespace STDEXEC::__detail
4 changes: 2 additions & 2 deletions include/exec/repeat_until.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -275,8 +275,8 @@ namespace experimental::execution
using __eptr_completion_t = set_error_t(std::exception_ptr);
constexpr auto __eptr_completion = (__eptr_completion_t *) nullptr;

STDEXEC_COMPLSIGS_LET(
__sigs,
STDEXEC_TRY_LET(
auto __sigs,
exec::transform_completion_signatures(get_completion_signatures<__child_t, _Env...>(),
__transform_values<__child_t>,
__transform_errors))
Expand Down
1 change: 0 additions & 1 deletion include/exec/static_thread_pool.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
#include "sequence/iterate.hpp"
#include "sequence_senders.hpp"

#include <algorithm>
#include <compare>
#include <condition_variable>
#include <cstdint>
Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/nvtx.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <nvexec::_strm::nvtx::kind Kind, class Sender>
extern __declfn_t<nvexec::_strm::nvtx::nvtx_sender<Kind, __demangle_t<Sender>>>
extern __mtype<nvexec::_strm::nvtx::nvtx_sender<Kind, __demangle_t<Sender>>>
__demangle_v<nvexec::_strm::nvtx::nvtx_sender<Kind, Sender>>;
} // namespace STDEXEC::__detail

Expand Down
4 changes: 2 additions & 2 deletions include/nvexec/stream/algorithm_base.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender, class InitT, class Fun, class DerivedSender>
extern __declfn_t<nvexec::_strm::__algo_range_init_fun::
sender<__demangle_t<Sender>, InitT, Fun, __demangle_t<DerivedSender>>>
extern __mtype<nvexec::_strm::__algo_range_init_fun::
sender<__demangle_t<Sender>, InitT, Fun, __demangle_t<DerivedSender>>>
__demangle_v<nvexec::_strm::__algo_range_init_fun::sender<Sender, InitT, Fun, DerivedSender>>;
} // namespace STDEXEC::__detail
5 changes: 2 additions & 3 deletions include/nvexec/stream/bulk.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -440,12 +440,11 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender, class Shape, class Fun>
inline constexpr __declfn_t<nvexec::_strm::bulk_sender<__demangle_t<Sender>, Shape, Fun>>
inline constexpr __mtype<nvexec::_strm::bulk_sender<__demangle_t<Sender>, Shape, Fun>>
__demangle_v<nvexec::_strm::bulk_sender<Sender, Shape, Fun>>{};

template <class Sender, class Shape, class Fun>
inline constexpr __declfn_t<
nvexec::_strm::multi_gpu_bulk_sender<__demangle_t<Sender>, Shape, Fun>>
inline constexpr __mtype<nvexec::_strm::multi_gpu_bulk_sender<__demangle_t<Sender>, Shape, Fun>>
__demangle_v<nvexec::_strm::multi_gpu_bulk_sender<Sender, Shape, Fun>>{};
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/continues_on.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Scheduler, class Sender>
extern __declfn_t<nvexec::_strm::continues_on_sender<Scheduler, __demangle_t<Sender>>>
extern __mtype<nvexec::_strm::continues_on_sender<Scheduler, __demangle_t<Sender>>>
__demangle_v<nvexec::_strm::continues_on_sender<Scheduler, Sender>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/ensure_started.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender>
extern __declfn_t<nvexec::_strm::ensure_started_sender<__demangle_t<Sender>>>
extern __mtype<nvexec::_strm::ensure_started_sender<__demangle_t<Sender>>>
__demangle_v<nvexec::_strm::ensure_started_sender<Sender>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/launch.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender, class Fun>
extern __declfn_t<nvexec::_strm::launch_sender<__demangle_t<Sender>, Fun>>
extern __mtype<nvexec::_strm::launch_sender<__demangle_t<Sender>, Fun>>
__demangle_v<nvexec::_strm::launch_sender<Sender, Fun>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/let_xxx.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender, class Fun, class SetTag>
extern __declfn_t<nvexec::_strm::let_sender<__demangle_t<Sender>, Fun, SetTag>>
extern __mtype<nvexec::_strm::let_sender<__demangle_t<Sender>, Fun, SetTag>>
__demangle_v<nvexec::_strm::let_sender<Sender, Fun, SetTag>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/reduce.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender, class Init, class Fun>
extern __declfn_t<nvexec::_strm::reduce_::sender<__demangle_t<Sender>, Init, Fun>>
extern __mtype<nvexec::_strm::reduce_::sender<__demangle_t<Sender>, Init, Fun>>
__demangle_v<nvexec::_strm::reduce_::sender<Sender, Init, Fun>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/schedule_from.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,6 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender>
extern __declfn_t<nvexec::_strm::schedule_from_sender<__demangle_t<Sender>>>
extern __mtype<nvexec::_strm::schedule_from_sender<__demangle_t<Sender>>>
__demangle_v<nvexec::_strm::schedule_from_sender<Sender>>;
} // namespace STDEXEC::__detail
2 changes: 1 addition & 1 deletion include/nvexec/stream/split.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender>
extern __declfn_t<nvexec::_strm::split_sender<__demangle_t<Sender>>>
extern __mtype<nvexec::_strm::split_sender<__demangle_t<Sender>>>
__demangle_v<nvexec::_strm::split_sender<Sender>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/then.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender, class Fun>
extern __declfn_t<nvexec::_strm::then_sender<__demangle_t<Sender>, Fun>>
extern __mtype<nvexec::_strm::then_sender<__demangle_t<Sender>, Fun>>
__demangle_v<nvexec::_strm::then_sender<Sender, Fun>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/upon_error.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender, class Fun>
extern __declfn_t<nvexec::_strm::upon_error_sender<__demangle_t<Sender>, Fun>>
extern __mtype<nvexec::_strm::upon_error_sender<__demangle_t<Sender>, Fun>>
__demangle_v<nvexec::_strm::upon_error_sender<Sender, Fun>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/upon_stopped.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class Sender, class Fun>
extern __declfn_t<nvexec::_strm::upon_stopped_sender<__demangle_t<Sender>, Fun>>
extern __mtype<nvexec::_strm::upon_stopped_sender<__demangle_t<Sender>, Fun>>
__demangle_v<nvexec::_strm::upon_stopped_sender<Sender, Fun>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/nvexec/stream/when_all.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,7 @@ namespace nvexec = nv::execution;
namespace STDEXEC::__detail
{
template <class WhenAllTag, class Scheduler, class... Senders>
extern __declfn_t<nvexec::_strm::when_all_sender<WhenAllTag, Scheduler, __demangle_t<Senders>...>>
extern __mtype<nvexec::_strm::when_all_sender<WhenAllTag, Scheduler, __demangle_t<Senders>...>>
__demangle_v<nvexec::_strm::when_all_sender<WhenAllTag, Scheduler, Senders...>>;
} // namespace STDEXEC::__detail

Expand Down
2 changes: 1 addition & 1 deletion include/stdexec/__detail/__basic_sender.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@ namespace STDEXEC
using __basic_sender_t = __basic_sender<_Tag, _Data, __demangle_t<_Child>...>::type;

template <auto _Descriptor>
extern __declfn_t<__minvoke<decltype(_Descriptor()), __q<__basic_sender_t>>>
extern __mtype<__minvoke<decltype(_Descriptor()), __q<__basic_sender_t>>>
__demangle_v<__sexpr<_Descriptor>>;
} // namespace __detail
} // namespace STDEXEC
Expand Down
159 changes: 159 additions & 0 deletions include/stdexec/__detail/__completion_info.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
/*
* Copyright (c) 2026 NVIDIA Corporation
*
* Licensed under the Apache License Version 2.0 with LLVM Exceptions
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://llvm.org/LICENSE.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once

#include "__execution_fwd.hpp"

// IWYU pragma: begin_keep
#include "__completion_behavior.hpp"
#include "__completion_signatures.hpp"
#include "__meta.hpp"
#include "__static_vector.hpp"
#include "__typeinfo.hpp"

#include "../functional.hpp"

#include <algorithm>
#include <array>
#include <compare>
#include <span>
#include <vector>
// IWYU pragma: end_keep

namespace STDEXEC
{
template <class _Sig>
constexpr _Sig *__signature = nullptr;

struct __completion_info
{
using __behavior_t = __completion_behavior::__behavior;

STDEXEC::__disposition __disposition = __invalid_disposition;
__type_index __signature = __mtypeid<void>;
__type_index __domain = __mtypeid<void>;
__behavior_t __behavior = __completion_behavior::__unknown;

__completion_info() = default;

template <__completion_tag _Tag, class... _Args>
constexpr __completion_info(_Tag (*)(_Args...),
__type_index __domain = __mtypeid<void>,
__behavior_t __behavior = __completion_behavior::__unknown) noexcept
: __disposition(_Tag::__disposition)
, __signature(__mtypeid<_Tag(_Args...)>)
, __domain(__domain)
, __behavior(__behavior)
{}

template <class _Sender, class... _Env>
constexpr auto __populate() noexcept -> __completion_info &
{
switch (__disposition)
{
case __disposition::__value:
__domain = __mtypeid<__completion_domain_t<set_value_t, env_of_t<_Sender>, _Env...>>;
__behavior = STDEXEC::__get_completion_behavior<set_value_t, _Sender, _Env...>();
break;
case __disposition::__error:
__domain = __mtypeid<__completion_domain_t<set_error_t, env_of_t<_Sender>, _Env...>>;
__behavior = STDEXEC::__get_completion_behavior<set_error_t, _Sender, _Env...>();
break;
case __disposition::__stopped:
__domain = __mtypeid<__completion_domain_t<set_stopped_t, env_of_t<_Sender>, _Env...>>;
__behavior = STDEXEC::__get_completion_behavior<set_stopped_t, _Sender, _Env...>();
break;
}
return *this;
}

[[nodiscard]]
constexpr auto
operator<=>(__completion_info const &) const noexcept -> std::strong_ordering = default;
};

namespace __cmplsigs
{
template <auto _GetComplInfo>
constexpr auto __completion_info_from_v = []() noexcept
{
STDEXEC_TRY_LET(auto __cmpl_info, _GetComplInfo())
{
constexpr auto __size = _GetComplInfo().size();
auto __arr = __static_vector<__completion_info, __size>();
std::ranges::sort(__cmpl_info);
auto const __end = std::ranges::unique_copy(__cmpl_info, __arr.begin()).out;
__arr.resize(__end - __arr.begin());
return __arr;
}
}();

template <class _GetComplInfo>
consteval auto __completion_info_from(_GetComplInfo) noexcept -> auto const &
{
return __completion_info_from_v<(_GetComplInfo())>;
}

template <auto _GetComplInfo>
constexpr auto __completion_sigs_from_v = []() noexcept
{
STDEXEC_TRY_LET(constexpr auto __completions, __completion_info_from_v<_GetComplInfo>)
{
auto __signatures = __static_vector<__type_index, __completions.size()>();
__signatures.resize(__completions.size());
std::ranges::transform(__completions,
__signatures.begin(),
&__completion_info::__signature);
auto const __end = std::ranges::unique(__signatures).begin();
__signatures.resize(__end - __signatures.begin());
return __signatures;
}
}();

template <class _GetComplInfo>
consteval auto __completion_sigs_from(_GetComplInfo) noexcept
{
STDEXEC_TRY_LET(constexpr auto __sigs, __completion_sigs_from_v<(_GetComplInfo())>)
{
constexpr auto __fn = [=]<std::size_t... _Is>(__indices<_Is...>)
{
return completion_signatures<__mtypeof<__sigs[_Is]>...>();
};
return __fn(__make_indices<__sigs.size()>());
}
}

template <class... _Sigs>
[[nodiscard]]
consteval auto __to_array(completion_signatures<_Sigs...>) noexcept
{
using __array_t = __static_vector<__completion_info, sizeof...(_Sigs)>;
auto __compls = __array_t{__completion_info(__signature<_Sigs>)...};
std::ranges::sort(__compls);
return __compls;
}

template <class _Ty>
constexpr auto __append_range(std::vector<_Ty> &__dst, std::span<_Ty const> __src)
{
#if __cpp_lib_containers_ranges >= 202202L
__dst.append_range(__src);
#else
__dst.insert(__dst.end(), __src.begin(), __src.end());
#endif
}
} // namespace __cmplsigs
} // namespace STDEXEC
Loading
Loading