File: SenderDataEvent.h

package info (click to toggle)
mummy 1.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 1,628 kB
  • ctags: 1,000
  • sloc: cpp: 10,667; cs: 1,107; makefile: 22; xml: 8; sh: 5
file content (116 lines) | stat: -rw-r--r-- 2,683 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#ifndef _SENDERDATAEVENT_H
#define _SENDERDATAEVENT_H

#ifdef _WIN32
#define SDE_CC __stdcall
#else
#define SDE_CC
#endif

//----------------------------------------------------------------------------
template <typename SenderT, typename DataT>
class EventHandler
{
public:
	virtual void notify(SenderT sender, DataT data) = 0;

	virtual ~EventHandler()
	  {
	  }
};

//----------------------------------------------------------------------------
template <typename ListenerT, typename SenderT, typename DataT>
class InstanceEventHandler : public EventHandler<SenderT, DataT>
{
	typedef void (ListenerT::*PtrMember)(SenderT, DataT);
	ListenerT* m_object;
	PtrMember m_member;

public:
	InstanceEventHandler(ListenerT* object, PtrMember member)
		: m_object(object), m_member(member)
	{
  }

	void notify(SenderT sender, DataT data)
	{
		(m_object->*m_member)(sender, data);
	}
};

//----------------------------------------------------------------------------
template <typename SenderT, typename DataT>
class CallbackEventHandler : public EventHandler<SenderT, DataT>
{
	typedef void (SDE_CC *CallbackT)(SenderT, DataT);
	CallbackT Callback;

public:
	CallbackEventHandler(CallbackT callback)
		: Callback(callback)
	{
  }

	void notify(SenderT sender, DataT data)
	{
		(*Callback)(sender, data);
	}
};

//----------------------------------------------------------------------------
typedef unsigned int EventHandlerId;
#include <map>

class AbstractVehicle;

//----------------------------------------------------------------------------
template <typename SenderT=AbstractVehicle*, typename DataT=unsigned int>
class SenderDataEvent
{
	typedef std::map<EventHandlerId, EventHandler<SenderT, DataT> *> HandlersMap;
	HandlersMap Handlers;
	EventHandlerId NextHandlerId;

public:
	SenderDataEvent()
		: NextHandlerId(1) {}

	template <typename ListenerT>
	EventHandlerId attach(ListenerT* object, void (ListenerT::*member)(SenderT, DataT))
	{
		Handlers[NextHandlerId] = new InstanceEventHandler<ListenerT, SenderT, DataT>(object, member);
		NextHandlerId++;
		return NextHandlerId-1;
	}

	EventHandlerId attach(void (SDE_CC *callback)(SenderT, DataT))
	{
		Handlers[NextHandlerId] = new CallbackEventHandler<SenderT, DataT>(callback);
		NextHandlerId++;
		return NextHandlerId-1;
	}

  bool detach(EventHandlerId id)
	{
		typename HandlersMap::iterator it = Handlers.find(id);

		if (it == Handlers.end())
			return false;

		delete it->second;
		Handlers.erase(it);
		return true;
	}

	void Invoke(SenderT sender, DataT data)
	{
		typename HandlersMap::iterator it = Handlers.begin();
		for(; it != Handlers.end(); it++)
		{
			it->second->notify(sender, data);
		}
	}
};

#endif