Added basic event dispatching (needs event types specialization)

This commit is contained in:
Vraiment 2017-08-05 23:08:12 -07:00
parent 04f7c2a365
commit 06f1d48de4
3 changed files with 72 additions and 13 deletions

View File

@ -28,35 +28,36 @@
#include <SDL_events.h>
#include <iostream>
using namespace std;
namespace SDL2pp {
namespace Private
{
template <typename EventHandler>
auto DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler) -> std::enable_if<IsEventHandlerFunctor<EventHandler, SDL_Event>::value>
{
eventHandler(event);
}
template <typename EventHandler>
auto DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler) -> std::enable_if<IsEventHandlerObject<EventHandler, SDL_Event>::value>
auto DispatchSpecificEvent(const SDL_Event &event, EventHandler&& eventHandler) -> typename std::enable_if<IsEventHandlerObject<EventHandler, SDL_Event>::value>::type
{
eventHandler.HandleEvent(event);
}
template <typename EventHandler>
auto DispatchEvent(const SDL_Event&, EventHandler&&) -> std::enable_if<!IsEventHandler<EventHandler, SDL_Event>::value>
auto DispatchSpecificEvent(const SDL_Event &event, EventHandler&& eventHandler) -> typename std::enable_if<IsEventHandlerFunctor<EventHandler, SDL_Event>::value>::type
{
static_assert(!IsEventHandler<EventHandler, SDL_Event>::value, "One of the given values is not a valid event handler");
eventHandler(event);
}
template <typename EventHandler>
auto DispatchSpecificEvent(const SDL_Event &, EventHandler&&) -> typename std::enable_if<!IsEventHandler<EventHandler, SDL_Event>::value>::type
{
static_assert(IsEventHandler<EventHandler, SDL_Event>::value, "Event handler is not a valid functor or object");
}
template <typename... EventHandlers>
void DispatchEvent(const SDL_Event & event, EventHandlers&&... eventHandlers) {
DispatchEvent(event, eventHandlers...);
}
void DispatchEvent(const SDL_Event &, EventHandlers&&...);
template <typename EventHandler, typename... EventHandlers>
void DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler, EventHandlers&&... eventHandlers) {
DispatchEvent(event, eventHandler);
DispatchSpecificEvent(event, eventHandler);
DispatchEvent(event, eventHandlers...);
}

View File

@ -3,6 +3,7 @@ SET(CLI_TESTS
test_color
test_color_constexpr
test_error
test_eventdispatching
test_eventhandler
test_optional
test_pointrect

View File

@ -0,0 +1,57 @@
#include <SDL_main.h>
#include <SDL2pp/Private/EventDispatching.hh>
#include "testing.h"
using namespace SDL2pp::Private;
static auto globalResult = Sint32{0};
inline void handler(SDL_Event event)
{
globalResult = event.user.code;
}
BEGIN_TEST(int, char*[])
SDL_Event event;
event.type = SDL_USEREVENT;
event.user.code = 31;
DispatchEvent(event);
auto result = Sint32{0};
DispatchEvent(event, [&result](SDL_Event event) {
result = event.user.code;
});
EXPECT_EQUAL(event.user.code, result);
DispatchEvent(event, handler);
EXPECT_EQUAL(event.user.code, globalResult);
struct EventHandlerFunctor {
Sint32 result;
void operator()(SDL_Event event) {
result = event.user.code;
}
};
auto eventHandlerFunctor = EventHandlerFunctor{};
DispatchEvent(event, eventHandlerFunctor);
EXPECT_EQUAL(event.user.code, eventHandlerFunctor.result);
struct EventHandlerObject {
Sint32 result;
void HandleEvent(SDL_Event event) {
result = event.user.code;
}
};
auto eventHandlerObject = EventHandlerObject{};
DispatchEvent(event, eventHandlerObject);
EXPECT_EQUAL(event.user.code, eventHandlerObject.result);
END_TEST()