MapLibre Native Core
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
message.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <future>
4 #include <utility>
5 
6 namespace mbgl {
7 
8 // A movable type-erasing function wrapper. This allows to store arbitrary invokable
9 // things (like std::function<>, or the result of a movable-only std::bind()) in the queue.
10 // Source: http://stackoverflow.com/a/29642072/331379
11 class Message {
12 public:
13  virtual ~Message() = default;
14  virtual void operator()() = 0;
15 };
16 
17 template <class Object, class MemberFn, class ArgsTuple>
18 class MessageImpl : public Message {
19 public:
20  MessageImpl(Object& object_, MemberFn memberFn_, ArgsTuple argsTuple_)
21  : object(object_),
22  memberFn(memberFn_),
23  argsTuple(std::move(argsTuple_)) {
24  }
25 
26  void operator()() override {
27  invoke(std::make_index_sequence<std::tuple_size_v<ArgsTuple>>());
28  }
29 
30  template <std::size_t... I>
31  void invoke(std::index_sequence<I...>) {
32  (object.*memberFn)(std::move(std::get<I>(argsTuple))...);
33  }
34 
36  MemberFn memberFn;
37  ArgsTuple argsTuple;
38 };
39 
40 template <class ResultType, class Object, class MemberFn, class ArgsTuple>
41 class AskMessageImpl : public Message {
42 public:
43  AskMessageImpl(std::promise<ResultType> promise_, Object& object_, MemberFn memberFn_, ArgsTuple argsTuple_)
44  : object(object_),
45  memberFn(memberFn_),
46  argsTuple(std::move(argsTuple_)),
47  promise(std::move(promise_)) {
48  }
49 
50  void operator()() override {
51  promise.set_value(ask(std::make_index_sequence<std::tuple_size_v<ArgsTuple>>()));
52  }
53 
54  template <std::size_t... I>
55  ResultType ask(std::index_sequence<I...>) {
56  return (object.*memberFn)(std::move(std::get<I>(argsTuple))...);
57  }
58 
60  MemberFn memberFn;
61  ArgsTuple argsTuple;
62  std::promise<ResultType> promise;
63 };
64 
65 template <class Object, class MemberFn, class ArgsTuple>
66 class AskMessageImpl<void, Object, MemberFn, ArgsTuple> : public Message {
67 public:
68  AskMessageImpl(std::promise<void> promise_, Object& object_, MemberFn memberFn_, ArgsTuple argsTuple_)
69  : object(object_),
70  memberFn(memberFn_),
71  argsTuple(std::move(argsTuple_)),
72  promise(std::move(promise_)) {
73  }
74 
75  void operator()() override {
76  ask(std::make_index_sequence<std::tuple_size_v<ArgsTuple>>());
77  promise.set_value();
78  }
79 
80  template <std::size_t... I>
81  void ask(std::index_sequence<I...>) {
82  (object.*memberFn)(std::move(std::get<I>(argsTuple))...);
83  }
84 
86  MemberFn memberFn;
87  ArgsTuple argsTuple;
88  std::promise<void> promise;
89 };
90 
91 namespace actor {
92 
93 template <class Object, class MemberFn, class... Args>
94 std::unique_ptr<Message> makeMessage(Object& object, MemberFn memberFn, Args&&... args) {
95  auto tuple = std::make_tuple(std::forward<Args>(args)...);
96  return std::make_unique<MessageImpl<Object, MemberFn, decltype(tuple)>>(object, memberFn, std::move(tuple));
97 }
98 
99 template <class ResultType, class Object, class MemberFn, class... Args>
100 std::unique_ptr<Message> makeMessage(std::promise<ResultType>&& promise, Object& object, MemberFn memberFn, Args&&... args) {
101  auto tuple = std::make_tuple(std::forward<Args>(args)...);
102  return std::make_unique<AskMessageImpl<ResultType, Object, MemberFn, decltype(tuple)>>(std::move(promise), object, memberFn, std::move(tuple));
103 }
104 
105 } // namespace actor
106 } // namespace mbgl
AskMessageImpl(std::promise< void > promise_, Object &object_, MemberFn memberFn_, ArgsTuple argsTuple_)
Definition: message.hpp:68
ResultType ask(std::index_sequence< I... >)
Definition: message.hpp:55
void operator()() override
Definition: message.hpp:50
std::promise< ResultType > promise
Definition: message.hpp:62
AskMessageImpl(std::promise< ResultType > promise_, Object &object_, MemberFn memberFn_, ArgsTuple argsTuple_)
Definition: message.hpp:43
ArgsTuple argsTuple
Definition: message.hpp:61
ArgsTuple argsTuple
Definition: message.hpp:37
MessageImpl(Object &object_, MemberFn memberFn_, ArgsTuple argsTuple_)
Definition: message.hpp:20
MemberFn memberFn
Definition: message.hpp:36
void operator()() override
Definition: message.hpp:26
void invoke(std::index_sequence< I... >)
Definition: message.hpp:31
Object & object
Definition: message.hpp:35
virtual void operator()()=0
virtual ~Message()=default
std::unique_ptr< Message > makeMessage(Object &object, MemberFn memberFn, Args &&... args)
Definition: message.hpp:94
constexpr ObjectType Object
Definition: type.hpp:89
Definition: actor.hpp:15
Definition: tile_id.hpp:256