MapLibre Native Core
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
established_actor.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 #include <mbgl/actor/mailbox.hpp>
5 #include <mbgl/actor/message.hpp>
7 
8 #include <memory>
9 #include <future>
10 #include <type_traits>
11 #include <cassert>
12 
13 namespace mbgl {
14 
26 template <class Object>
28 public:
29  // Construct the Object from a parameter pack `args` (i.e. `Object(args...)`)
30  template <typename U = Object, class... Args, typename std::enable_if_t<
31  std::is_constructible_v<U, Args...> ||
32  std::is_constructible_v<U, ActorRef<U>, Args...>
33  > * = nullptr>
34  EstablishedActor(Scheduler& scheduler, AspiringActor<Object>& parent_, Args&& ... args)
35  : parent(parent_) {
36  emplaceObject(std::forward<Args>(args)...);
37  parent.mailbox->open(scheduler);
38  }
39 
40  // Construct the `Object` from a tuple containing the constructor arguments (i.e.
41  // `Object(std::get<0>(args), std::get<1>(args), ...)`)
42  template <class ArgsTuple, std::size_t ArgCount = std::tuple_size<std::decay_t<ArgsTuple>>::value>
43  EstablishedActor(Scheduler& scheduler, AspiringActor<Object>& parent_, ArgsTuple&& args)
44  : parent(parent_) {
45  emplaceObject(std::forward<ArgsTuple>(args), std::make_index_sequence<ArgCount>{});
46  parent.mailbox->open(scheduler);
47  }
48 
50 
52  parent.mailbox->close();
53  parent.object().~Object();
54  }
55 
56 private:
57  // Enabled for Objects with a constructor taking ActorRef<Object> as the first parameter
58  template <typename U = Object, class... Args, typename std::enable_if_t<std::is_constructible_v<U, ActorRef<U>, Args...>> * = nullptr>
59  void emplaceObject(Args&&... args_) {
60  new (&parent.objectStorage) Object(parent.self(), std::forward<Args>(args_)...);
61  }
62 
63  // Enabled for plain Objects
64  template <typename U = Object, class... Args, typename std::enable_if_t<std::is_constructible_v<U, Args...>> * = nullptr>
65  void emplaceObject(Args&&... args_) {
66  new (&parent.objectStorage) Object(std::forward<Args>(args_)...);
67  }
68 
69  // Used to expand a tuple holding the constructor arguments
70  template <class ArgsTuple, std::size_t... I>
71  void emplaceObject(ArgsTuple&& args, std::index_sequence<I...>) {
72  emplaceObject(std::move(std::get<I>(std::forward<ArgsTuple>(args)))...);
73  (void) args; // mark args as used: if it's empty tuple, it's not actually used above.
74  }
75 
76  AspiringActor<Object>& parent;
77 };
78 
79 } // namespace mbgl
EstablishedActor(Scheduler &scheduler, AspiringActor< Object > &parent_, ArgsTuple &&args)
EstablishedActor(const EstablishedActor &)=delete
EstablishedActor(Scheduler &scheduler, AspiringActor< Object > &parent_, Args &&... args)
constexpr ObjectType Object
Definition: type.hpp:89
Definition: actor.hpp:15