File src/emitter_impl.h changed (mode: 100644) (index ae5d6f7..865c00d) |
6 |
6 |
#include <set> |
#include <set> |
7 |
7 |
|
|
8 |
8 |
#include "interface.h" |
#include "interface.h" |
|
9 |
|
#include <lib/dynamo/src/impl/batch.h> |
|
10 |
|
|
9 |
11 |
|
|
10 |
12 |
namespace om636 { |
namespace om636 { |
11 |
13 |
namespace control { |
namespace control { |
|
... |
... |
namespace control { |
13 |
15 |
class EmitterImpl : Emitter<T, U...> { |
class EmitterImpl : Emitter<T, U...> { |
14 |
16 |
public: |
public: |
15 |
17 |
typedef T event_type; |
typedef T event_type; |
16 |
|
typedef std::function<void(U...)> callback_type; |
|
17 |
|
typedef Batch<callback_type> batch_type; |
|
18 |
|
typedef typename batch_type::listener_type listener_type; |
|
|
18 |
|
typedef Emitter<event_type, U...> base_type; |
|
19 |
|
using typename base_type::callback_type; |
|
20 |
|
using typename base_type::listener_type; |
19 |
21 |
|
|
20 |
22 |
listener_type on(event_type, callback_type) override; |
listener_type on(event_type, callback_type) override; |
21 |
23 |
listener_type once(event_type, callback_type) override; |
listener_type once(event_type, callback_type) override; |
22 |
24 |
|
|
23 |
|
void removeListeners(event_type) override; |
|
24 |
|
void removeAllListeners() override; |
|
25 |
|
|
|
26 |
25 |
void interupt(event_type, U...) override; |
void interupt(event_type, U...) override; |
27 |
26 |
|
|
28 |
27 |
private: |
private: |
|
28 |
|
typedef BatchImpl<U...> batch_type; |
29 |
29 |
typedef std::map<event_type, batch_type> map_type; |
typedef std::map<event_type, batch_type> map_type; |
30 |
|
void kill_all(map_type&); |
|
31 |
30 |
|
|
32 |
31 |
map_type m_repeat; |
map_type m_repeat; |
33 |
32 |
map_type m_once; |
map_type m_once; |
File src/emitter_impl.hxx changed (mode: 100644) (index 8b1bc11..dfa9d36) |
... |
... |
namespace control { |
15 |
15 |
return m_once[e].hook(c); |
return m_once[e].hook(c); |
16 |
16 |
} |
} |
17 |
17 |
|
|
18 |
|
///////////////////////////////////////////////////////////////////////////////////// |
|
19 |
|
template <typename T, typename... U> |
|
20 |
|
void EmitterImpl<T, U...>::removeListeners(event_type e) |
|
21 |
|
{ |
|
22 |
|
m_once[e].unhook(); |
|
23 |
|
m_repeat[e].unhook(); |
|
24 |
|
} |
|
25 |
|
|
|
26 |
|
///////////////////////////////////////////////////////////////////////////////////// |
|
27 |
|
template <typename T, typename... U> |
|
28 |
|
void EmitterImpl<T, U...>::removeAllListeners() |
|
29 |
|
{ |
|
30 |
|
kill_all(m_once); |
|
31 |
|
kill_all(m_repeat); |
|
32 |
|
} |
|
33 |
|
|
|
34 |
18 |
///////////////////////////////////////////////////////////////////////////////////// |
///////////////////////////////////////////////////////////////////////////////////// |
35 |
19 |
template <typename T, typename... U> |
template <typename T, typename... U> |
36 |
20 |
void EmitterImpl<T, U...>::interupt(event_type e, U... arg) |
void EmitterImpl<T, U...>::interupt(event_type e, U... arg) |
37 |
21 |
{ |
{ |
38 |
|
m_once[e].merge_added_elements(); |
|
39 |
|
m_repeat[e].merge_added_elements(); |
|
40 |
|
|
|
41 |
|
utils::process_and_kill(m_once[e].elements(), arg...); |
|
42 |
|
utils::process(m_repeat[e].elements(), arg...); |
|
43 |
|
} |
|
44 |
|
|
|
45 |
|
///////////////////////////////////////////////////////////////////////////////////// |
|
46 |
|
template <typename T, typename... U> |
|
47 |
|
void EmitterImpl<T, U...>::kill_all(map_type& map) |
|
48 |
|
{ |
|
49 |
|
for_each(map.begin(), map.end(), [](typename map_type::value_type& p) { |
|
50 |
|
p.second.unhook(); |
|
51 |
|
}); |
|
52 |
|
map.clear(); |
|
|
22 |
|
m_once[e].invoke_once(arg...); |
|
23 |
|
m_repeat[e].invoke(arg...); |
53 |
24 |
} |
} |
54 |
25 |
|
|
55 |
26 |
} // control |
} // control |
File src/interface.h changed (mode: 100644) (index be31d9d..026c834) |
6 |
6 |
#include <memory> |
#include <memory> |
7 |
7 |
#include <set> |
#include <set> |
8 |
8 |
|
|
9 |
|
#include <lib/dynamo/src/batch.h> |
|
10 |
|
|
|
11 |
9 |
namespace om636 { |
namespace om636 { |
12 |
10 |
namespace control { |
namespace control { |
13 |
11 |
|
|
|
... |
... |
namespace control { |
16 |
14 |
public: |
public: |
17 |
15 |
typedef T event_type; |
typedef T event_type; |
18 |
16 |
typedef std::function<void(U...)> callback_type; |
typedef std::function<void(U...)> callback_type; |
19 |
|
typedef Batch<callback_type> batch_type; |
|
20 |
|
typedef typename batch_type::listener_type listener_type; |
|
|
17 |
|
typedef std::shared_ptr<callback_type> listener_type; |
21 |
18 |
|
|
22 |
19 |
virtual ~Emitter() = default; |
virtual ~Emitter() = default; |
23 |
20 |
|
|
24 |
21 |
virtual listener_type on(event_type, callback_type) = 0; |
virtual listener_type on(event_type, callback_type) = 0; |
25 |
22 |
virtual listener_type once(event_type, callback_type) = 0; |
virtual listener_type once(event_type, callback_type) = 0; |
26 |
23 |
|
|
27 |
|
virtual void removeListeners(event_type) = 0; |
|
28 |
|
virtual void removeAllListeners() = 0; |
|
29 |
|
|
|
30 |
24 |
virtual void interupt(event_type, U...) = 0; |
virtual void interupt(event_type, U...) = 0; |
31 |
25 |
}; |
}; |
32 |
26 |
|
|