Программы на C++. Форум разработчиков
-
Anonymous
Потеря ссылки
Сообщение
Anonymous »
Я пытаюсь создать генератор событий, аналогичный nodejs:
Код: Выделить всё
// emitter.cc
// ------------------------------------------------------
#include "event/emitter.h"
namespace game {
void Emitter::on(std::string eventName, Listener *listener) {
std::list *listenersByEventName;
try {
listenersByEventName = listeners.at(eventName);
} catch (const std::out_of_range &ex) {
listenersByEventName = new std::list;
listeners.insert({eventName, listenersByEventName});
}
listenersByEventName->push_back(listener);
};
void Emitter::off(std::string eventName, Listener *listener) {
try {
std::list listenersByEventName = *listeners.at(eventName);
std::list::iterator iterator = listenersByEventName.begin();
while (iterator != listenersByEventName.end()) {
if ((*iterator)->name == listener->name) {
iterator = listenersByEventName.erase(iterator);
break;
}
iterator++;
}
} catch (const std::out_of_range &ex) {
// do nothing
}
};
void Emitter::emit(Event event) {
try {
std::list listenersByEventName = *listeners.at(event.name);
for (auto listener : listenersByEventName) {
listener->function(event);
}
} catch (const std::out_of_range &ex) {
// do nothing
}
};
} // namespace game
// emitter.h
// ------------------------------------------------------
#pragma once
#include
#include
#include
#include
#include
#include "event/event.h"
#include "event/listener.h"
namespace game {
class Emitter {
public:
std::map listeners;
void on(std::string eventName, Listener *listener);
void off(std::string eventName, Listener *listener);
void emit(Event event);
};
} // namespace game
// unit test file main.cc
// ------------------------------------------------------
TEST_CASE("Emitter should work properly", "[event][emitter]") {
game::Emitter emitter;
std::string eventName0 = "event-0";
std::string listenerName0 = "listener-0";
std::map calls = {{listenerName0, 0}};
game::Listener *listener0 = new game::Listener{
"listener-0", [calls, listenerName0](game::Event event) mutable {
calls[listenerName0]++;
}};
SECTION("when adding a listener") {
emitter.on(eventName0, listener0);
REQUIRE(emitter.listeners.size() == 1);
};
SECTION("when emitting a event") {
REQUIRE(emitter.listeners.size() == 1);
Подробнее здесь: [url]https://stackoverflow.com/questions/79848109/loss-of-reference[/url]
1765892841
Anonymous
Я пытаюсь создать генератор событий, аналогичный nodejs:
[code]// emitter.cc
// ------------------------------------------------------
#include "event/emitter.h"
namespace game {
void Emitter::on(std::string eventName, Listener *listener) {
std::list *listenersByEventName;
try {
listenersByEventName = listeners.at(eventName);
} catch (const std::out_of_range &ex) {
listenersByEventName = new std::list;
listeners.insert({eventName, listenersByEventName});
}
listenersByEventName->push_back(listener);
};
void Emitter::off(std::string eventName, Listener *listener) {
try {
std::list listenersByEventName = *listeners.at(eventName);
std::list::iterator iterator = listenersByEventName.begin();
while (iterator != listenersByEventName.end()) {
if ((*iterator)->name == listener->name) {
iterator = listenersByEventName.erase(iterator);
break;
}
iterator++;
}
} catch (const std::out_of_range &ex) {
// do nothing
}
};
void Emitter::emit(Event event) {
try {
std::list listenersByEventName = *listeners.at(event.name);
for (auto listener : listenersByEventName) {
listener->function(event);
}
} catch (const std::out_of_range &ex) {
// do nothing
}
};
} // namespace game
// emitter.h
// ------------------------------------------------------
#pragma once
#include
#include
#include
#include
#include
#include "event/event.h"
#include "event/listener.h"
namespace game {
class Emitter {
public:
std::map listeners;
void on(std::string eventName, Listener *listener);
void off(std::string eventName, Listener *listener);
void emit(Event event);
};
} // namespace game
// unit test file main.cc
// ------------------------------------------------------
TEST_CASE("Emitter should work properly", "[event][emitter]") {
game::Emitter emitter;
std::string eventName0 = "event-0";
std::string listenerName0 = "listener-0";
std::map calls = {{listenerName0, 0}};
game::Listener *listener0 = new game::Listener{
"listener-0", [calls, listenerName0](game::Event event) mutable {
calls[listenerName0]++;
}};
SECTION("when adding a listener") {
emitter.on(eventName0, listener0);
REQUIRE(emitter.listeners.size() == 1);
};
SECTION("when emitting a event") {
REQUIRE(emitter.listeners.size() == 1);
Подробнее здесь: [url]https://stackoverflow.com/questions/79848109/loss-of-reference[/url]