diff --git a/include/event.hpp b/include/event.hpp index e1f9ebb..ddf6d88 100644 --- a/include/event.hpp +++ b/include/event.hpp @@ -1,20 +1,21 @@ /* -Low Latency IPC Library for high-speed traffic -Copyright (C) 2019 Michael Fabian Dirks - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ + * Low Latency IPC Library for high-speed traffic + * Copyright (C) 2017-2019 Michael Fabian Dirks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ #pragma once #include @@ -25,40 +26,94 @@ namespace datapath { class event { std::list> listeners; - public: - void add(std::function listener) + std::function listen_cb; + std::function silence_cb; + + public /* functions */: + + // Destructor + inline ~event() { + this->clear(); + } + + // Add new listener. + inline void add(std::function listener) + { + if (listeners.size() == 0) { + if (listen_cb) { + listen_cb(); + } + } listeners.push_back(listener); } - void remove(std::function listener) + // Remove existing listener. + inline void remove(std::function listener) { listeners.remove(listener); + if (listeners.size() == 0) { + if (silence_cb) { + silence_cb(); + } + } } - // Not valid without the extra template. + // Check if empty / no listeners. + inline bool empty() + { + return listeners.empty(); + } + + // Remove all listeners. + inline void clear() + { + listeners.clear(); + if (silence_cb) { + silence_cb(); + } + } + + public /* operators */: + // Call Listeners with arguments. + /// Not valid without the extra template. template - void operator()(_args... args) + inline void operator()(_args... args) { for (auto& l : listeners) { l(args...); } } - operator bool() + // Convert to bool (true if not empty, false if empty). + inline operator bool() { - return !listeners.empty(); + return !this->empty(); } - public: - bool empty() + // Add new listener. + inline event<_args...>& operator+=(std::function listener) { - return listeners.empty(); + this->add(listener); + return *this; } - void clear() + // Remove existing listener. + inline event<_args...>& operator-=(std::function listener) { - listeners.clear(); + this->remove(listener); + return *this; + } + + public /* events */: + void set_listen_callback(std::function cb) + { + this->listen_cb = cb; + } + + void set_silence_callback(std::function cb) + { + this->silence_cb = cb; } }; }; // namespace datapath