6#if !defined(__XTD_CORE_INTERNAL__)
7#error "Do not include this file: Internal use only"
11#include "../threading/manual_reset_event.hpp"
12#include "../delegate.hpp"
15template<
class result_t =
void>
17 return value.
has_value() ? xtd::as<result_t>(value) : result_t {};
21inline void __xtd_delegate_any_cast<void>(
const xtd::any_object& value) {
25inline xtd::any_object __xtd_delegate_invoker(std::function<
void()> invoke) {
30template<
class ...arguments_t>
31inline xtd::any_object __xtd_delegate_invoker(std::function<
void(arguments_t...)> invoke, arguments_t&&... arguments) {
32 invoke(std::forward<arguments_t>(arguments)...);
36template<
class result_t>
37inline xtd::any_object __xtd_delegate_invoker(std::function<result_t()> invoke) {
41template<
class result_t,
class ...arguments_t>
42inline xtd::any_object __xtd_delegate_invoker(std::function<result_t(arguments_t...)> invoke, arguments_t&&... arguments) {
43 return xtd::any_object(invoke(std::forward<arguments_t>(arguments)...));
46template<
class result_t>
47struct xtd::delegate<result_t()>::async_result_invoke::data {
51 bool is_completed =
false;
55template<
class result_t>
58 data_->async_state = async_state;
61template<
class result_t>
62xtd::any_object xtd::delegate<result_t()>::async_result_invoke::async_state() const noexcept {
63 return data_->async_state;
66template<
class result_t>
68 return data_->async_event;
71template<
class result_t>
72bool xtd::delegate<result_t()>::async_result_invoke::completed_synchronously() const noexcept {
76template<
class result_t>
77bool xtd::delegate<result_t()>::async_result_invoke::is_completed() const noexcept {
78 return data_->is_completed;
81template<
class result_t>
86template<
class result_t>
91template<
class result_t>
93 auto async = xtd::new_sptr<async_result_invoke>(async_callback, async_state);
94 threading::thread_pool::queue_user_work_item([&, async = async] {
95 async->data_->result = __xtd_delegate_invoker(function_t {std::bind(&xtd::delegate<result_t()>::invoke,
this)});
96 async->data_->is_completed =
true;
97 async->data_->async_event.set();
98 async->data_->async_callback(async);
103template<
class result_t>
104result_t xtd::delegate<result_t()>::end_invoke(async_result async) {
107 return __xtd_delegate_any_cast<result_t>(
async_result->data_->result);
110template<
class result_t,
class ...arguments_t>
111struct xtd::delegate<result_t(arguments_t...)>::async_result_invoke::data {
115 bool is_completed =
false;
119template<
class result_t,
class ...arguments_t>
122 data_->async_state = async_state;
125template<
class result_t,
class ...arguments_t>
126xtd::any_object xtd::delegate<result_t(arguments_t...)>::async_result_invoke::async_state() const noexcept {
127 return data_->async_state;
130template<
class result_t,
class ...arguments_t>
132 return data_->async_event;
135template<
class result_t,
class ...arguments_t>
136bool xtd::delegate<result_t(arguments_t...)>::async_result_invoke::completed_synchronously() const noexcept {
140template<
class result_t,
class ...arguments_t>
141bool xtd::delegate<result_t(arguments_t...)>::async_result_invoke::is_completed() const noexcept {
142 return data_->is_completed;
145template<
class result_t,
class ...arguments_t>
146xtd::async_result xtd::delegate<result_t(arguments_t...)>::begin_invoke(arguments_t&&... arguments) {
150template<
class result_t,
class ...arguments_t>
152 return begin_invoke(async_callback,
xtd::any_object(*
this), std::forward<arguments_t>(arguments)...);
155template<
class result_t,
class ...arguments_t>
157 auto async = xtd::new_sptr<async_result_invoke>(async_callback, async_state);
158 threading::thread_pool::queue_user_work_item([&, async = async, ...arguments = arguments] {
159 async->data_->result = __xtd_delegate_invoker(function_t {std::bind(&xtd::delegate<result_t(arguments_t...)>::invoke,
this, arguments...)}, std::forward<arguments_t>(arguments)...);
160 async->data_->is_completed =
true;
161 async->data_->async_event.set();
162 async->data_->async_callback(async);
167template<
class result_t,
class ...arguments_t>
168result_t xtd::delegate<result_t(arguments_t...)>::end_invoke(async_result async) {
171 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
bool has_value() const noexcept
Gets a value indicating whether the current xtd::any_object object has a valid value of its underlyin...
Definition any_object.hpp:62
The xtd::shared_ptr_object is a shared pointer as std::shared_ptr.
Definition shared_ptr_object.hpp:30
Represents a thread synchronization event that, when signaled, must be reset manually....
Definition manual_reset_event.hpp:35
Encapsulates operating system specific objects that wait for exclusive access to shared resources.
Definition wait_handle.hpp:52
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
sptr< type_t > new_sptr(args_t &&... args)
xtd::new_sptr operator creates a xtd::sptr object.
Definition new_sptr.hpp:24
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition xtd_about_box.hpp:10