Skip to content

Instantly share code, notes, and snippets.

@thomaslee
Last active December 11, 2015 03:19
Show Gist options
  • Save thomaslee/4537167 to your computer and use it in GitHub Desktop.
Save thomaslee/4537167 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <vector>
#include <map>
#include <functional>
class some_arg_t {
public:
some_arg_t(const char *name) : name_(name) {};
const char *name() const { return name_.c_str(); }
private:
std::string name_;
};
typedef std::pointer_to_unary_function<const some_arg_t &, int> fn_t;
typedef std::vector<fn_t> fn_vec_t;
typedef std::map<std::string, fn_vec_t > fn_map_t;
class event_manager_t {
public:
event_manager_t() {}
void on(const char *name, int (*fn)(const some_arg_t &)) {
fn_map_t::iterator iter = fnmap_.find(name);
if (iter == fnmap_.end()) {
std::pair<fn_map_t::iterator, bool> res =
fnmap_.insert(fn_map_t::value_type(name, fn_vec_t()));
iter = res.first;
}
iter->second.push_back(std::ptr_fun(fn));
}
void emit(const char *name, const some_arg_t &arg) {
fn_map_t::const_iterator iter = fnmap_.find(name);
if (iter != fnmap_.end()) {
fn_vec_t::const_iterator vec_iter = iter->second.begin();
for (; vec_iter != iter->second.end(); vec_iter++) {
(*vec_iter)(arg);
}
}
}
private:
fn_map_t fnmap_;
};
int
do_some_event_1 (const some_arg_t &arg)
{
std::cout << "a: " << arg.name() << std::endl;
return 0;
}
int
do_some_event_2 (const some_arg_t &arg)
{
std::cout << "b: " << arg.name() << std::endl;
return 0;
}
int
main (int argc, char **argv)
{
fn_map_t f;
event_manager_t event_manager;
event_manager.on("some-event", do_some_event_1);
event_manager.on("some-event", do_some_event_2);
event_manager.emit("some-event", some_arg_t("arg"));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment