blob: 9f7205eaab60b94d80b98ab259d20c16c5c1f1e1 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_IMPELLER_BASE_PROMISE_H_
#define FLUTTER_IMPELLER_BASE_PROMISE_H_
#include <future>
namespace impeller {
template <class T>
std::future<T> RealizedFuture(T t) {
std::promise<T> promise;
auto future = promise.get_future();
promise.set_value(std::move(t));
return future;
}
// Wraps a std::promise and completes the promise with a value during
// destruction if the promise does not already have a value.
//
// By default the std::promise destructor will complete an empty promise with an
// exception. This will fail because Flutter is built without exception support.
template <typename T>
class NoExceptionPromise {
public:
NoExceptionPromise() = default;
~NoExceptionPromise() {
if (!value_set_) {
promise_.set_value({});
}
}
std::future<T> get_future() { return promise_.get_future(); }
void set_value(const T& value) {
promise_.set_value(value);
value_set_ = true;
}
private:
std::promise<T> promise_;
bool value_set_ = false;
};
} // namespace impeller
#endif // FLUTTER_IMPELLER_BASE_PROMISE_H_