BehaviorTree
Core Library to create and execute Behavior Trees
Loading...
Searching...
No Matches
signal.h
1#ifndef SIMPLE_SIGNAL_H
2#define SIMPLE_SIGNAL_H
3
4#include <functional>
5#include <memory>
6#include <vector>
7
8namespace BT
9{
10/**
11 * Super simple Signal/Slop implementation, AKA "Observable pattern".
12 * The subscriber is active until it goes out of scope or Subscriber::reset() is called.
13 */
14template <typename... CallableArgs>
15class Signal
16{
17public:
18 using CallableFunction = std::function<void(CallableArgs...)>;
19 using Subscriber = std::shared_ptr<CallableFunction>;
20
21 void notify(CallableArgs... args)
22 {
23 for(size_t i = 0; i < subscribers_.size();)
24 {
25 if(auto sub = subscribers_[i].lock())
26 {
27 (*sub)(args...);
28 i++;
29 }
30 else
31 {
32 subscribers_.erase(subscribers_.begin() + i);
33 }
34 }
35 }
36
37 Subscriber subscribe(CallableFunction func)
38 {
39 Subscriber sub = std::make_shared<CallableFunction>(std::move(func));
40 subscribers_.emplace_back(sub);
41 return sub;
42 }
43
44private:
45 std::vector<std::weak_ptr<CallableFunction>> subscribers_;
46};
47} // namespace BT
48
49#endif // SIMPLE_SIGNAL_H
Definition: signal.h:16
Definition: action_node.h:24