6#if !defined(__XTD_CORE_INTERNAL__)
7#error "Do not include this file: Internal use only"
15template<
class result_t =
void>
16[[nodiscard]]
inline auto __xtd_delegate_any_cast(
const xtd::any_object& value) -> result_t {
21inline auto __xtd_delegate_any_cast<void>(
const xtd::any_object& value) ->
void {
25template<
class result_t>
26inline auto __xtd_delegate_invoker(std::function<result_t()> invoke) ->
xtd::any_object {
27 if constexpr(!std::is_void_v<result_t>)
return xtd::any_object(invoke());
34template<
typename function_t,
typename... arguments_t>
35inline auto __xtd_delegate_invoker(function_t&& invoke, arguments_t&&... arguments) ->
xtd::any_object {
36 if constexpr(!std::is_void_v<std::invoke_result_t<function_t, arguments_t...>>)
37 return xtd::any_object(std::invoke(std::forward<function_t>(invoke), std::forward<arguments_t>(arguments)...));
39 std::invoke(std::forward<function_t>(invoke), std::forward<arguments_t>(arguments)...);
44template<
class result_t>
45struct xtd::delegate<result_t()>::async_result_invoke::data {
47 xtd::threading::manual_reset_event async_event;
48 xtd::any_object async_state;
49 bool is_completed =
false;
50 xtd::any_object result;
53template<
class result_t>
56 data_->async_state = async_state;
59template<
class result_t>
60auto xtd::delegate<result_t()>::async_result_invoke::async_state() const noexcept ->
xtd::any_object {
61 return data_->async_state;
64template<
class result_t>
65auto xtd::delegate<result_t()>::async_result_invoke::async_wait_handle() noexcept ->
xtd::threading::wait_handle& {
66 return data_->async_event;
69template<
class result_t>
70auto xtd::delegate<result_t()>::async_result_invoke::completed_synchronously() const noexcept ->
bool {
74template<
class result_t>
75auto xtd::delegate<result_t()>::async_result_invoke::is_completed() const noexcept ->
bool {
76 return data_->is_completed;
79template<
class result_t>
84template<
class result_t>
89template<
class result_t>
92 threading::thread_pool::queue_user_work_item([&, async = async] {
93 async->data_->result = __xtd_delegate_invoker(function_t {std::bind(&xtd::delegate<result_t()>::invoke,
this)});
94 async->data_->is_completed =
true;
95 async->data_->async_event.set();
96 async->data_->async_callback(async);
101template<
class result_t>
102auto xtd::delegate<result_t()>::end_invoke(async_result async) -> result_t {
105 return __xtd_delegate_any_cast<result_t>(
async_result->data_->result);
108template<
class result_t,
class ...arguments_t>
109struct xtd::delegate<result_t(arguments_t...)>::async_result_invoke::data {
111 xtd::threading::manual_reset_event async_event;
112 xtd::any_object async_state;
113 bool is_completed =
false;
114 xtd::any_object result;
117template<
class result_t,
class ...arguments_t>
120 data_->async_state = async_state;
123template<
class result_t,
class ...arguments_t>
124auto xtd::delegate<result_t(arguments_t...)>::async_result_invoke::async_state() const noexcept ->
xtd::any_object {
125 return data_->async_state;
128template<
class result_t,
class ...arguments_t>
129auto xtd::delegate<result_t(arguments_t...)>::async_result_invoke::async_wait_handle() noexcept ->
xtd::threading::wait_handle& {
130 return data_->async_event;
133template<
class result_t,
class ...arguments_t>
134auto xtd::delegate<result_t(arguments_t...)>::async_result_invoke::completed_synchronously() const noexcept ->
bool {
138template<
class result_t,
class ...arguments_t>
139auto xtd::delegate<result_t(arguments_t...)>::async_result_invoke::is_completed() const noexcept ->
bool {
140 return data_->is_completed;
143template<
class result_t,
class ...arguments_t>
144auto xtd::delegate<result_t(arguments_t...)>::begin_invoke(arguments_t&&... arguments) ->
xtd::async_result {
148template<
class result_t,
class ...arguments_t>
150 return begin_invoke(async_callback,
xtd::any_object(*
this), std::forward<arguments_t>(arguments)...);
153template<
typename result_t,
typename... arguments_t>
154struct xtd::delegate<result_t(arguments_t...)>::delegate_async_state {
155 std::shared_ptr<async_result_invoke> async;
156 std::tuple<std::decay_t<arguments_t>...> arguments;
157 std::function<result_t(arguments_t...)> invoker;
159 std::function<xtd::any_object(std::shared_ptr<delegate_async_state>)>
start = [](std::shared_ptr<delegate_async_state> state) {
160 return std::apply([state](
auto&&... unpacked_args)->xtd::any_object {
161 return __xtd_delegate_invoker(state->invoker, std::forward<
decltype(unpacked_args)>(unpacked_args)...);
162 }, state->arguments);
166template<
class result_t,
class ...arguments_t>
168 auto state = std::make_shared<delegate_async_state>();
171 state->arguments = std::make_tuple(std::forward<arguments_t>(arguments)...);
172 state->invoker = [state](arguments_t... args) {
return state->self->invoke(std::forward<arguments_t>(args)...);};
175 threading::thread_pool::queue_user_work_item([state] {
176 state->async->data_->result = state->start(state);
177 state->async->data_->is_completed =
true;
178 state->async->data_->async_event.set();
179 state->async->data_->async_callback(state->async);
184template<
class result_t,
class ...arguments_t>
185auto xtd::delegate<result_t(arguments_t...)>::end_invoke(async_result async) -> result_t {
188 return __xtd_delegate_any_cast<result_t>(
async_result->data_->result);
Represent a polymorphic wrapper capable of holding any type.
Definition any_object.hpp:29
Contains xtd::delegate <result_t(arguments_t...)> delegate.
xtd::delegate< void(async_result ar)> async_callback
References a method to be called when a corresponding asynchronous operation completes.
Definition delegate.hpp:39
xtd::sptr< xtd::iasync_result > async_result
Represents the status of an asynchronous operation.
Definition async_result.hpp:19
auto as(any_object &o) -> type_t
Casts a type into another type.
Definition __as_any_object.hpp:59
sptr< type_t > new_sptr(args_t &&... args)
xtd::new_sptr operator creates a xtd::sptr object.
Definition new_sptr.hpp:24
@ start
Starting of a logical operation.
Definition trace_event_type.hpp:37
Contains xtd::threading::manual_reset_event exception.
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition abstract_object.hpp:8
constexpr const_pointer data() const noexcept
Gets direct access to the underlying contiguous storage.
Definition read_only_span.hpp:201