1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
#pragma once
#include <functional>
#include <vector>
namespace pymol
{
template <typename... ParamTs> class Event
{
public:
/**
* Invokes all listener callbacks with parameters.
* @param params parameters for callback
*/
void invoke(ParamTs... params)
{
if (m_callbacks.empty()) {
return;
}
for (const auto& callback : m_callbacks) {
std::invoke(callback, params...);
}
}
/**
* @func function to be called when event occurs
*/
void add_listener(std::function<void(ParamTs...)> func)
{
m_callbacks.push_back(std::move(func));
}
/**
* Removes all listeners
*/
void reset() { m_callbacks.clear(); }
/**
* @return the number of listeners to this event
*/
std::size_t size() const { return m_callbacks.size(); }
private:
std::vector<std::function<void(ParamTs...)>> m_callbacks;
};
} // namespace pymol
|