CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
result_task.h
1
2#pragma once
3
4#include <functional>
5#include <system/object.h>
6#include <system/func.h>
7#include <system/threading/tasks/task.h>
8
9namespace System { namespace Runtime { namespace CompilerServices {
10template<typename T>
11class ResultTaskAwaiter;
12template<typename T>
13class ConfiguredResultTaskAwaitable;
14}}
15
16namespace Threading { namespace Tasks {
17
22template<typename T>
23class ResultTask final : public Task
24{
25 using ThisType = ResultTask<T>;
26 using BaseType = Task;
27
28public:
31 ResultTask(const Func<T>& function) : Task(MakeFunction(function))
32 {
33 }
34
40 T get_Result() const
41 {
42 Wait();
43 return m_result;
44 }
45
51 {
52 return {MakeSharedPtr(this), continueOnCapturedContext};
53 }
54
59 TaskPtr ContinueWith(const Action<RTaskPtr<T>>& continuationAction)
60 {
61 auto result = MakeObject<Task>(
62 std::function<void()>([continuationAction, task = MakeSharedPtr(this)] { continuationAction(task); }));
63 ContinueWithCore(result);
64 return result;
65 }
66
71 {
72 return {MakeSharedPtr(this)};
73 }
74
76
79 {
80 }
81
83 ResultTask(const T& result) : m_result(result)
84 {
86 }
87
89 void set_Result(const T& result)
90 {
91 m_result = result;
92 }
93
94private:
96 FunctionT MakeFunction(const Func<T>& func)
97 {
98 return [func, this]
99 {
100 set_Result(func());
101 };
102 }
103
105 T m_result;
106};
107
108}} // namespace Threading::Tasks
109
110namespace Runtime { namespace CompilerServices {
111
112template <typename T>
114{
115public:
116 ResultTaskAwaiter(const RTaskPtr<T>& task) : m_task(task)
117 {}
118
119 bool get_IsCompleted() const
120 {
121 return m_task->get_IsCompleted();
122 }
123
124 void OnCompleted(const Action<>& continuation)
125 {
126 m_task->AddContinuation(continuation);
127 }
128
129 T GetResult() const
130 {
131 return m_task->get_Result();
132 }
133
135
136private:
137 RTaskPtr<T> m_task;
138};
139
140template <typename T>
142{
143public:
144 ConfiguredResultTaskAwaitable(const RTaskPtr<T>& task, bool continueOnCapturedContext)
145 : m_task(task), m_continueOnCapturedContext(continueOnCapturedContext)
146 {}
147
149 {
150 auto result = m_task->GetAwaiter();
151 result.continueOnCapturedContext = m_continueOnCapturedContext;
152 return result;
153 }
154
155private:
156 RTaskPtr<T> m_task;
157 bool m_continueOnCapturedContext;
158};
159
160}} // namespace Runtime::CompilerServices
161
162} // namespace System
Function delegate. This type should be allocated on stack and passed to functions by value or by refe...
Definition: func.h:82
Runtime::CompilerServices::ResultTaskAwaiter< T > GetAwaiter() const
Definition: result_task.h:148
ConfiguredResultTaskAwaitable(const RTaskPtr< T > &task, bool continueOnCapturedContext)
Definition: result_task.h:144
T GetResult() const
Definition: result_task.h:129
ResultTaskAwaiter(const RTaskPtr< T > &task)
Definition: result_task.h:116
void OnCompleted(const Action<> &continuation)
Definition: result_task.h:124
bool continueOnCapturedContext
Definition: result_task.h:134
bool get_IsCompleted() const
Definition: result_task.h:119
A Task specialization that returns a result value upon completion.
Definition: result_task.h:24
Runtime::CompilerServices::ConfiguredResultTaskAwaitable< T > ConfigureAwait(bool continueOnCapturedContext) const
Configures how awaits on this result task should behave regarding context capture.
Definition: result_task.h:50
T get_Result() const
Gets the result of the asynchronous operation.
Definition: result_task.h:40
TaskPtr ContinueWith(const Action< RTaskPtr< T > > &continuationAction)
Creates a continuation that executes when the result task completes.
Definition: result_task.h:59
ResultTask(const Func< T > &function)
Constructs a ResultTask with a function that returns a value.
Definition: result_task.h:31
ResultTask(const T &result)
Internal constructor for creating result tasks with specified result.
Definition: result_task.h:83
ResultTask()
Internal implementation. Not for user code.
Definition: result_task.h:78
void set_Result(const T &result)
Sets the result value for the task.
Definition: result_task.h:89
Runtime::CompilerServices::ResultTaskAwaiter< T > GetAwaiter() const
Gets an awaiter for this result task for use with Await.
Definition: result_task.h:70
Represents an asynchronous operation that can be awaited and composed with other tasks.
Definition: task.h:29
Task()
Internal constructor for creating uninitialized tasks.
void Wait() const
Waits for the task to complete.
void ContinueWithCore(const TaskPtr &continuationTask)
Internal implementation for adding continuations.
std::function< void()> FunctionT
Internal implementation. Not for user code.
Definition: task.h:120
void set_Status(TaskStatus status)
Sets the task status.
Definition: db_command.h:9
MulticastDelegate< void(Args...)> Action
Delegate type that references methods that have no return value.
Definition: action.h:40
SmartPtr< X > MakeSharedPtr(X *p)
Converts raw pointer to smart pointer.
Definition: smart_ptr.h:1650