31 #ifndef LEDGER_CORE_DEFFERED_HPP 32 #define LEDGER_CORE_DEFFERED_HPP 36 #include "../utils/Option.hpp" 37 #include "../utils/Try.hpp" 39 #include "../utils/Exception.hpp" 41 #include "../api/ExecutionContext.hpp" 43 #include "../utils/LambdaRunnable.hpp" 58 using Callback = std::function<void (const Try<T>&)>;
68 void setResult(
const Try<T>& result) {
70 std::lock_guard<std::mutex> lock(_lock);
77 void setValue(
const T& value) {
78 std::lock_guard<std::mutex> lock(_lock);
84 void setError(
const Exception& exception) {
85 std::lock_guard<std::mutex> lock(_lock);
93 void addCallback(Callback callback, std::shared_ptr<api::ExecutionContext> context) {
95 std::lock_guard<std::mutex> lock(_lock);
96 _callbacks.push(std::make_tuple(callback, context));
105 bool hasValue()
const {
106 std::lock_guard<std::mutex> lock(_lock);
107 return _value.hasValue();
111 std::lock_guard<std::mutex> lock(_lock);
116 inline void ensureNotCompleted() {
117 if (_value.hasValue())
118 throw Exception(api::ErrorCode::ALREADY_COMPLETED,
"This promise is already completed");
121 inline void _trigger() {
122 if (_value.isEmpty() || _callbacks.empty()) {
125 while (!_callbacks.empty()) {
126 std::tuple<Callback, std::shared_ptr<api::ExecutionContext>> callback = _callbacks.front();
127 Callback cb = std::get<0>(callback);
128 auto value = _value.getValue();
129 std::get<1>(callback)->execute(make_runnable([cb, value] () {
137 mutable std::mutex _lock;
139 std::queue<std::tuple<Callback, std::shared_ptr<api::ExecutionContext>>> _callbacks;
148 #endif //LEDGER_CORE_DEFFERED_HPP
Definition: Option.hpp:49
Definition: Deffered.hpp:49
Definition: Deffered.hpp:55
Definition: Deffered.hpp:52
Definition: Account.cpp:8
Definition: Exception.hpp:45