Working event system!

This commit is contained in:
2014-04-28 09:28:18 +02:00
parent 22138a36aa
commit 5870a4d7bf
6 changed files with 150 additions and 45 deletions
+26
View File
@@ -0,0 +1,26 @@
#include "PrecompiledHeader.h"
#include "EventBroker.h"
BaseEventRelay::~BaseEventRelay()
{
m_Broker->Unsubscribe(*this);
}
void EventBroker::Unsubscribe(BaseEventRelay &relay) // ?
{
auto itpair = m_Subscribers.equal_range(relay.m_TypeName);
for (auto it = itpair.first; it != itpair.second; ++it)
{
if (it->second == &relay)
{
m_Subscribers.erase(it);
break;
}
}
}
void EventBroker::Subscribe(BaseEventRelay &relay)
{
relay.m_Broker = this;
m_Subscribers.insert(std::make_pair(relay.m_TypeName, &relay));
}
+92
View File
@@ -0,0 +1,92 @@
#ifndef MessageRelay_h__
#define MessageRelay_h__
#include <typeinfo>
#include <functional>
#include <unordered_map>
#include <list>
struct Event
{
protected:
Event() { }
};
class EventBroker;
class BaseEventRelay
{
friend class EventBroker;
protected:
BaseEventRelay(std::string typeName)
: m_TypeName(typeName) { }
~BaseEventRelay();
public:
virtual bool Receive(const Event &event) = 0;
protected:
std::string m_TypeName;
EventBroker* m_Broker;
};
template <typename EventType>
class EventRelay : public BaseEventRelay
{
public:
typedef std::function<bool(const EventType&)> CallbackType;
EventRelay()
: m_Callback(nullptr)
, BaseEventRelay(typeid(EventType).name()) { }
EventRelay(CallbackType callback)
: m_Callback(callback)
, BaseEventRelay(typeid(EventType).name()) { }
protected:
bool Receive(const Event &event) override;
private:
CallbackType m_Callback;
};
template <typename EventType>
bool EventRelay<EventType>::Receive(const Event &event)
{
if (m_Callback != nullptr)
{
return m_Callback(static_cast<const EventType&>(event));
}
else
{
return false;
}
}
class EventBroker
{
template <typename EventType> friend class EventRelay;
public:
template <typename EventType>
void Publish(const EventType &event);
void Subscribe(BaseEventRelay &relay);
void Unsubscribe(BaseEventRelay &relay);
private:
std::unordered_multimap<std::string, BaseEventRelay*> m_Subscribers;
};
template <typename EventType>
void EventBroker::Publish(const EventType &event)
{
auto itpair = m_Subscribers.equal_range(typeid(EventType).name());
for (auto it = itpair.first; it != itpair.second; ++it)
{
it->second->Receive(event);
}
}
#endif // MessageRelay_h__
-43
View File
@@ -1,43 +0,0 @@
#ifndef MessageRelay_h__
#define MessageRelay_h__
#include <functional>
#include <unordered_map>
#include <list>
struct Event
{
protected:
Event() { }
};
class EventRelay
{
private:
typedef std::string MessageType_t;
typedef std::function<bool(Event)> MessageCallback_t;
public:
void Subscribe(std::string messageType, MessageCallback_t callback)
{
m_Callbacks[messageType].push_back(callback);
}
void Raise(std::string messageType, Event message)
{
auto callbackIt = m_Callbacks.find(messageType);
if (callbackIt == m_Callbacks.end())
return;
for (auto &callback : callbackIt->second)
{
callback(message);
}
}
private:
std::unordered_map<MessageType_t, std::list<MessageCallback_t>> m_Callbacks;
};
#endif // MessageRelay_h__
+28
View File
@@ -1,8 +1,36 @@
#include "PrecompiledHeader.h"
#include "Engine.h"
#include "EventBroker.h"
struct TestEvent : Event
{
std::string Hello;
};
bool OnTestEvent(const TestEvent &event)
{
std::cout << "TestEvent.Hello = " << event.Hello << std::endl;
return true;
}
int main(int argc, char* argv[])
{
EventBroker broker;
TestEvent e;
e.Hello = "Hello world";
{
EventRelay<TestEvent> testRelay = &OnTestEvent;
broker.Subscribe(testRelay);
broker.Publish<TestEvent>(e);
}
broker.Publish<TestEvent>(e);
return 0;
Engine engine(argc, argv);
while (engine.Running())
engine.Tick();
+2 -1
View File
@@ -96,6 +96,7 @@
<ItemGroup>
<ClCompile Include="..\..\src\Camera.cpp" />
<ClCompile Include="..\..\src\CubemapTexture.cpp" />
<ClCompile Include="..\..\src\EventBroker.cpp" />
<ClCompile Include="..\..\src\GameWorld.cpp" />
<ClCompile Include="..\..\src\main.cpp" />
<ClCompile Include="..\..\src\Model.cpp" />
@@ -140,7 +141,7 @@
<ClInclude Include="..\..\src\Factory.h" />
<ClInclude Include="..\..\src\GameWorld.h" />
<ClInclude Include="..\..\src\GUI\Frame.h" />
<ClInclude Include="..\..\src\EventRelay.h" />
<ClInclude Include="..\..\src\EventBroker.h" />
<ClInclude Include="..\..\src\Model.h" />
<ClInclude Include="..\..\src\OBJ.h" />
<ClInclude Include="..\..\src\PrecompiledHeader.h" />
@@ -50,6 +50,7 @@
</ClCompile>
<ClCompile Include="..\..\src\ResourceManager.cpp" />
<ClCompile Include="..\..\src\Sound.cpp" />
<ClCompile Include="..\..\src\EventBroker.cpp" />
</ItemGroup>
<ItemGroup>
<Filter Include="Util">
@@ -223,7 +224,7 @@
<ClInclude Include="..\..\src\Util\Rectangle.h">
<Filter>Util</Filter>
</ClInclude>
<ClInclude Include="..\..\src\EventRelay.h" />
<ClInclude Include="..\..\src\EventBroker.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\..\src\Shaders\AABB.frag.glsl">