diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-07-21 11:26:40 +0300 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-07-24 19:30:02 +0300 |
commit | 81e9ed7fdd65ca4816ac6a76139d6c18d5182a21 (patch) | |
tree | 17fbcc599c43394afd24c73a83bd0f8a7fc4cce9 /include | |
parent | a9ac314a5d28bec2a26cd6889364f81f811d4cd4 (diff) | |
download | qtlocation-mapboxgl-81e9ed7fdd65ca4816ac6a76139d6c18d5182a21.tar.gz |
[core] add ask pattern to actor ref
Diffstat (limited to 'include')
-rw-r--r-- | include/mbgl/actor/actor_ref.hpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/include/mbgl/actor/actor_ref.hpp b/include/mbgl/actor/actor_ref.hpp index aeb5bb4507..958ee3777c 100644 --- a/include/mbgl/actor/actor_ref.hpp +++ b/include/mbgl/actor/actor_ref.hpp @@ -35,6 +35,27 @@ public: } } + template <typename Fn, class... Args> + auto ask(Fn fn, Args&&... args) { + // Result type is deduced from the function's return type + using ResultType = typename std::result_of<decltype(fn)(Object, Args...)>::type; + + std::promise<ResultType> promise; + auto future = promise.get_future(); + + if (auto mailbox = weakMailbox.lock()) { + mailbox->push( + actor::makeMessage( + std::move(promise), *object, fn, std::forward<Args>(args)... + ) + ); + } else { + promise.set_exception(std::make_exception_ptr(std::runtime_error("Actor has gone away"))); + } + + return future; + } + private: Object* object; std::weak_ptr<Mailbox> weakMailbox; |