summaryrefslogtreecommitdiff
path: root/include/mbgl/actor/actor.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/mbgl/actor/actor.hpp')
-rw-r--r--include/mbgl/actor/actor.hpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/include/mbgl/actor/actor.hpp b/include/mbgl/actor/actor.hpp
index a0df19208e..2d2757459c 100644
--- a/include/mbgl/actor/actor.hpp
+++ b/include/mbgl/actor/actor.hpp
@@ -11,6 +11,11 @@
namespace mbgl {
+namespace util {
+ template <typename O>
+ class Thread;
+}
+
/*
An `Actor<O>` is an owning reference to an asynchronous object of type `O`: an "actor".
Communication with an actor happens via message passing: you send a message to the object
@@ -56,12 +61,23 @@ public:
object(self(), std::forward<Args>(args_)...) {
}
+ template <typename U = Object, class... Args, typename std::enable_if<std::is_constructible<U, ActorRef<U>, Args...>::value>::type * = nullptr>
+ Actor(std::shared_ptr<Mailbox> mailbox_, Args&&... args_)
+ : mailbox(std::move(mailbox_)),
+ object(self(), std::forward<Args>(args_)...) {
+ }
+
// Enabled for plain Objects
template<typename U = Object, class... Args, typename std::enable_if<!std::is_constructible<U, ActorRef<U>, Args...>::value>::type * = nullptr>
Actor(Scheduler& scheduler, Args&& ... args_)
: mailbox(std::make_shared<Mailbox>(scheduler)), object(std::forward<Args>(args_)...) {
}
+ template<typename U = Object, class... Args, typename std::enable_if<!std::is_constructible<U, ActorRef<U>, Args...>::value>::type * = nullptr>
+ Actor(std::shared_ptr<Mailbox> mailbox_, Args&& ... args_)
+ : mailbox(mailbox_), object(std::forward<Args>(args_)...) {
+ }
+
~Actor() {
mailbox->close();
}
@@ -91,6 +107,9 @@ public:
}
private:
+ template <typename O>
+ friend class util::Thread;
+
std::shared_ptr<Mailbox> mailbox;
Object object;
};