#include "stdio.h"
#include <vector>
using namespace std;
class CObject
{
};
class EventArg
{
public:
unsigned long EventType;
public:
EventArg(unsigned long EventType)
{
this->EventType = EventType;
}
};
class Handler
{
public:
virtual void Invoke(CObject* sender, EventArg* eventArg) = 0;
};
template<class T>
class EventHandler : public Handler
{
typedef void (T::*funptr)(CObject*, EventArg* eventArg);
private:
T* obj;
funptr fun;
public:
EventHandler(T* obj, funptr fun)
{
this->obj = obj;
this->fun = fun;
}
virtual void Invoke(CObject* sender, EventArg* eventArg)
{
(obj->*fun)(sender, eventArg);
}
};
class Event
{
private:
vector<Handler*> handlerList;
public:
Event()
{
}
void FireEvent(CObject* sender, EventArg* eventArg)
{
for(int i = 0; i < handlerList.size(); i++)
{
handlerList[i]->Invoke(sender, eventArg);
}
}
void AddHandler(Handler* handler)
{
handlerList.push_back(handler);
}
void RemoveHandler(Handler* handler)
{
for(int i = 0; i < handlerList.size(); i++)
{
if(handlerList[i] == handler)
{
}
}
}
};
class CSourceEventArg : public EventArg
{
public:
char* sourceArg1;
public:
CSourceEventArg(unsigned long EventType, char* arg1):EventArg(EventType)
{
sourceArg1 = arg1;
}
};
class CSource : public CObject
{
public:
char* name;
Event* event;
EventArg* eventArg;
public:
CSource(char* name)
{
this->name = name;
this->event = new Event();
this->eventArg = new CSourceEventArg(1, "strArg");
}
void fire()
{
this->event->FireEvent(this, eventArg);
}
};
class CProcessor
{
public:
char* name;
CSource* source;
public:
void OnEvent(CObject* sender, EventArg* eventArg)
{
CSource* source = (CSource*)sender;
CSourceEventArg* sourceEventArg = (CSourceEventArg*)eventArg;
printf("Object %s Event %d with Arg %s Processed By %s/n", source->name, sourceEventArg->EventType, sourceEventArg->sourceArg1, this->name);
}
void OnEvent1(CObject* sender, EventArg* eventArg)
{
CSource* source = (CSource*)sender;
CSourceEventArg* sourceEventArg = (CSourceEventArg*)eventArg;
printf("Object %s Event %d with Arg %s Processed By %s Again/n", source->name, sourceEventArg->EventType, sourceEventArg->sourceArg1, this->name);
}
public:
CProcessor(char* msg)
{
name = msg;
source = new CSource("source1");
source->event->AddHandler(new EventHandler<CProcessor>(this, &CProcessor::OnEvent));
source->event->AddHandler(new EventHandler<CProcessor>(this, &CProcessor::OnEvent1));
}
};
int main()
{
CProcessor* processor = new CProcessor("processor1");
processor->source->fire();
return 0;
}