CodePorting.Translator Cs2Cpp
CodePorting.Translator.Cs2Cpp.Framework
result_value_task.h
1
2#pragma once
3
4#include <system/object.h>
5#include <system/nullable.h>
6#include <system/iequatable.h>
7#include <system/threading/tasks/async.h>
8
9namespace System { namespace Runtime { namespace CompilerServices {
10template<typename T>
11class ResultValueTaskAwaiter;
12template<typename T>
13class ConfiguredResultValueTaskAwaitable;
14}}
15
16namespace Threading { namespace Tasks {
17
23template<typename T>
24class ResultValueTask final : public IEquatable<ResultValueTask<T>>, public System::Details::BoxableObjectBase
25{
27 using BaseType = Object;
28
29public:
34 {}
38 ResultValueTask(const T& result) : m_result(result)
39 {}
43 ResultValueTask(const RTaskPtr<T>& task) : m_task(task)
44 {}
45
49 bool get_IsFaulted() const
50 {
51 return m_task && m_task->get_IsFaulted();
52 }
56 {
57 return (m_task && m_task->get_Status() == TaskStatus::RanToCompletion) || m_result.get_HasValue();
58 }
61 bool get_IsCompleted() const
62 {
63 return (m_task && m_task->get_IsCompleted()) || m_result.get_HasValue();
64 }
68 bool get_IsCanceled() const
69 {
70 return m_task && m_task->get_IsCanceled();
71 }
76 T get_Result() const
77 {
78 if (m_task)
79 {
80 m_result = m_task->get_Result();
81 m_task.reset();
82 }
83
84 return m_result.get_Value();
85 }
86
92 {
93 return m_task ? m_task : MakeObject<ResultTask<T>>(m_result.get_Value());
94 }
100 {
101 return {*this, continueOnCapturedContext};
102 }
106 bool Equals(ResultValueTask other) override
107 {
108 return *this == other;
109 }
114 {
115 return System::ObjectExt::Is<ResultValueTask>(obj) && Equals(System::ExplicitCast<ResultValueTask>(obj));
116 }
121 {
122 return {*this};
123 }
124
131 bool operator==(const ResultValueTask& other) const
132 {
133 if (m_result.get_HasValue() || other.m_result.get_HasValue())
134 {
135 return m_result == other.m_result;
136 }
137
138 return m_task == other.m_task;
139 }
143 bool operator!=(const ResultValueTask& other) const {return !(*this == other);}
144
145private:
148
150 mutable Nullable<T> m_result;
152 mutable RTaskPtr<T> m_task;
153};
154
155}} // namespace Threading::Tasks
156
157namespace Runtime { namespace CompilerServices {
158
159template <typename T>
161{
162public:
164 {}
165
166 bool get_IsCompleted() const
167 {
168 return m_task.get_IsCompleted();
169 }
170
171 void OnCompleted(const Action<>& continuation)
172 {
173 if (m_task.m_task)
174 {
175 m_task.m_task->AddContinuation(continuation);
176 }
177 }
178
179 T GetResult() const
180 {
181 return m_task.get_Result();
182 }
183
185
186private:
188};
189
190template <typename T>
192{
193public:
195 : m_task(task), m_continueOnCapturedContext(continueOnCapturedContext)
196 {}
197
199 {
200 auto result = m_task.GetAwaiter();
201 result.continueOnCapturedContext = m_continueOnCapturedContext;
202 return result;
203 }
204
205private:
207 bool m_continueOnCapturedContext;
208};
209
210}} // namespace Runtime::CompilerServices
211
212template <typename T>
213Threading::Tasks::ResultValueTask<T> MakeValueAsync(const Details::ResultAsyncFunction<T>& fnc)
214{
215 return Threading::Tasks::ResultValueTask<T>(MakeAsync<T>(fnc));
216}
217
218} // namespace System
Defines a method that determines the equality of two objects. Objects of this class should only be al...
Definition: iequatable.h:16
Forward declaration.
Definition: nullable.h:75
Base class that enables using methods available for System.Object class in C#. All non-trivial classe...
Definition: object.h:62
Object()
Creates object. Initializes all internal data structures.
ConfiguredResultValueTaskAwaitable(const Threading::Tasks::ResultValueTask< T > &task, bool continueOnCapturedContext)
Definition: result_value_task.h:194
Runtime::CompilerServices::ResultTaskAwaiter< T > GetAwaiter() const
Definition: result_value_task.h:198
bool continueOnCapturedContext
Definition: result_value_task.h:184
bool get_IsCompleted() const
Definition: result_value_task.h:166
void OnCompleted(const Action<> &continuation)
Definition: result_value_task.h:171
ResultValueTaskAwaiter(Threading::Tasks::ResultValueTask< T > task)
Definition: result_value_task.h:163
T GetResult() const
Definition: result_value_task.h:179
Pointer class to wrap types being allocated on heap. Use it to manage memory for classes inheriting O...
Definition: smart_ptr.h:180
Represents a hybrid task-like type that can wrap either a direct result value or a ResultTask<T>.
Definition: result_value_task.h:25
RTaskPtr< T > AsTask() const
Converts this ResultValueTask to a shared pointer to ResultTask<T>.
Definition: result_value_task.h:91
ResultValueTask()
Constructs an empty, uninitialized ResultValueTask.
Definition: result_value_task.h:33
bool get_IsCompleted() const
Gets a value indicating whether the task has completed.
Definition: result_value_task.h:61
T get_Result() const
Gets the result of the completed task.
Definition: result_value_task.h:76
bool get_IsCanceled() const
Gets a value indicating whether the task completed due to being canceled.
Definition: result_value_task.h:68
Runtime::CompilerServices::ConfiguredResultValueTaskAwaitable< T > ConfigureAwait(bool continueOnCapturedContext) const
Configures an awaiter for this task.
Definition: result_value_task.h:99
ResultValueTask(const T &result)
Constructs a completed ResultValueTask with the specified result.
Definition: result_value_task.h:38
bool Equals(System::SharedPtr< System::Object > obj) override
Determines whether this instance equals another object.
Definition: result_value_task.h:113
bool get_IsCompletedSuccessfully() const
Gets a value indicating whether the task completed successfully.
Definition: result_value_task.h:55
bool operator==(const ResultValueTask &other) const
Equality operator for ResultValueTask.
Definition: result_value_task.h:131
Runtime::CompilerServices::ResultValueTaskAwaiter< T > GetAwaiter() const
Gets an awaiter for this task to support await expressions.
Definition: result_value_task.h:120
bool get_IsFaulted() const
Gets a value indicating whether the task completed due to an unhandled exception.
Definition: result_value_task.h:49
bool operator!=(const ResultValueTask &other) const
Inequality operator for ResultValueTask.
Definition: result_value_task.h:143
bool Equals(ResultValueTask other) override
Determines whether this instance equals another ResultValueTask instance.
Definition: result_value_task.h:106
ResultValueTask(const RTaskPtr< T > &task)
Constructs a ResultValueTask from a shared pointer to a ResultTask<T>.
Definition: result_value_task.h:43
Definition: db_command.h:9
MulticastDelegate< void(Args...)> Action
Delegate type that references methods that have no return value.
Definition: action.h:40
Threading::Tasks::ResultValueTask< T > MakeValueAsync(const Details::ResultAsyncFunction< T > &fnc)
Definition: result_value_task.h:213