2018-05-16 20:39:38 +08:00
# eventpp -- C++ library for event dispatcher and callback list
2018-05-13 12:26:27 +08:00
2018-12-15 23:21:28 +08:00
eventpp is a C++ event library that provides tools that enable your application components to communicate with each other by dispatching events and listening for them. With eventpp you can easily implement signal/slot mechanism, or observer pattern.
2018-05-13 12:26:27 +08:00
## Facts and features
2018-07-25 22:01:12 +08:00
- **Powerful**
2018-12-15 23:21:28 +08:00
- Supports synchronous event dispatching and asynchronous event queue.
2018-07-25 22:01:12 +08:00
- Configurable and extensible with policies and mixins.
- Supports event filter via mixins.
- **Robust**
2018-12-15 23:21:28 +08:00
- Supports nested event. During the process of handling an event, a listener can safely dispatch event and append/prepend/insert/remove other listeners.
- Thread safety. Supports multi-threading.
2018-07-25 22:01:12 +08:00
- Exception safety. Most operations guarantee strong exception safety.
- Well tested. Backed by unit tests.
- **Fast**
- The EventQueue can process 10M events in 1 second (10K events per millisecond).
- The CallbackList can invoke 100M callbacks in 1 second (100K callbacks per millisecond).
2018-07-25 23:02:45 +08:00
- The CallbackList can add/remove 5M callbacks in 1 second (5K callbacks per millisecond).
2018-07-25 22:01:12 +08:00
- **Flexible and easy to use**
2018-12-15 23:21:28 +08:00
- Listeners and events can be of any type and do not need to be inherited from any base class.
- Header only, no source file, no need to build. Does not depend on other libraries.
2018-07-25 22:01:12 +08:00
- Requires C++ 11 (tested with MSVC 2017, MSVC 2015, MinGW (Msys) gcc 7.2, and Ubuntu gcc 5.4).
- Written in portable and standard C++, no hacks or quirks.
2018-05-13 12:26:27 +08:00
## License
Apache License, Version 2.0
2018-05-28 17:25:53 +08:00
## Version 0.1.0
2018-12-15 23:21:28 +08:00
eventpp is currently usable and stable.
2018-05-28 17:25:53 +08:00
2018-05-13 12:26:27 +08:00
## Source code
[https://github.com/wqking/eventpp ](https://github.com/wqking/eventpp )
2018-05-14 19:16:36 +08:00
## Quick start
2018-05-13 12:26:27 +08:00
2018-05-14 20:42:54 +08:00
### Namespace
`eventpp`
2019-03-09 15:36:38 +08:00
### Add eventpp to your project
eventpp is header only library. Just add the 'include' folder in eventpp to your project, then you can use the library.
You don't need to link to any source code.
2018-05-19 17:42:41 +08:00
### Using CallbackList
```c++
#include "eventpp/callbacklist.h"
eventpp::CallbackList< void ( const std::string & , const bool ) > callbackList;
callbackList.append([](const std::string & s, const bool b) {
std::cout < < std::boolalpha < < " Got callback 1 , s is " < < s < < " b is " < < b < < std::endl ;
});
callbackList.append([](std::string s, int b) {
std::cout < < std::boolalpha < < " Got callback 2 , s is " < < s < < " b is " < < b < < std::endl ;
});
callbackList("Hello world", true);
```
2018-05-14 19:16:36 +08:00
### Using EventDispatcher
2018-05-13 12:26:27 +08:00
```c++
#include "eventpp/eventdispatcher.h"
eventpp::EventDispatcher< int , void ( ) > dispatcher;
dispatcher.appendListener(3, []() {
std::cout < < "Got event 3." < < std::endl ;
});
dispatcher.appendListener(5, []() {
std::cout < < "Got event 5." < < std::endl ;
});
dispatcher.appendListener(5, []() {
std::cout < < "Got another event 5." < < std::endl ;
});
2018-05-19 17:42:41 +08:00
// dispatch event 3
2018-05-13 12:26:27 +08:00
dispatcher.dispatch(3);
2018-05-19 17:42:41 +08:00
// dispatch event 5
2018-05-13 12:26:27 +08:00
dispatcher.dispatch(5);
```
2018-05-19 17:42:41 +08:00
### Using EventQueue
2018-05-13 12:26:27 +08:00
```c++
2018-05-19 17:42:41 +08:00
eventpp::EventQueue< int , void ( const std::string & , const bool ) > queue;
2018-05-14 19:16:36 +08:00
2018-05-19 17:42:41 +08:00
dispatcher.appendListener(3, [](const std::string s, bool b) {
std::cout < < std::boolalpha < < " Got event 3 , s is " < < s < < " b is " < < b < < std::endl ;
2018-05-13 12:26:27 +08:00
});
2018-05-19 17:42:41 +08:00
dispatcher.appendListener(5, [](const std::string s, bool b) {
std::cout < < std::boolalpha < < " Got event 5 , s is " < < s < < " b is " < < b < < std::endl ;
2018-05-13 12:26:27 +08:00
});
2018-05-19 17:42:41 +08:00
// The listeners are not triggered during enqueue.
queue.enqueue(3, "Hello", true);
queue.enqueue(5, "World", false);
// Process the event queue, dispatch all queued events.
queue.process();
2018-05-13 12:26:27 +08:00
```
## Documentations
2018-07-25 22:01:12 +08:00
* [Overview, thread and exception safety ](doc/introduction.md )
2018-05-19 17:42:41 +08:00
* [Tutorials of CallbackList ](doc/tutorial_callbacklist.md )
2018-05-19 20:04:09 +08:00
* [Tutorials of EventDispatcher ](doc/tutorial_eventdispatcher.md )
2018-05-19 17:42:41 +08:00
* [Tutorials of EventQueue ](doc/tutorial_eventqueue.md )
2018-07-09 22:15:37 +08:00
* [Class CallbackList ](doc/callbacklist.md )
* [Class EventDispatcher ](doc/eventdispatcher.md )
* [Class EventQueue ](doc/eventqueue.md )
2019-04-02 19:33:01 +08:00
* [Overview of heterogeneous classes ](doc/heterogeneous.md )
* [Class HeterCallbackList ](doc/hetercallbacklist.md )
* [Class HeterEventDispatcher ](doc/hetereventdispatcher.md )
* [Class HeterEventQueue ](doc/hetereventqueue.md )
2018-07-09 22:15:37 +08:00
* [Utility class CounterRemover -- auto remove listeners after triggered certain times ](doc/counterremover.md )
2018-07-09 22:30:28 +08:00
* [Utility class ConditionalRemover -- auto remove listeners when certain condition is satisfied ](doc/conditionalremover.md )
2018-07-09 22:15:37 +08:00
* [Utility class ScopedRemover -- auto remove listeners when out of scope ](doc/scopedremover.md )
2020-02-09 11:23:12 +08:00
* [Utility header eventmaker.h -- auto generate event classes ](doc/eventmaker.md )
2018-07-09 22:15:37 +08:00
* [Document of utilities ](doc/eventutil.md )
2018-05-28 17:18:49 +08:00
* [Policies -- configure eventpp ](doc/policies.md )
* [Mixins -- extend eventpp ](doc/mixins.md )
2018-05-31 12:48:40 +08:00
* [Performance benchmarks ](doc/benchmark.md )
2018-07-24 22:11:01 +08:00
* [FAQs, tricks, and tips ](doc/faq.md )
2018-05-16 20:39:38 +08:00
* There are compilable tutorials in the unit tests.
2018-05-13 12:26:27 +08:00
## Build the unit tests
2018-05-14 20:00:29 +08:00
The library itself is header only and doesn't need building.
2019-03-31 16:46:26 +08:00
The unit tests require CMake to build, and there is a makefile to ease the building.
Note the unit tests require C++14 (generic lambda), the library itself only requires C++11.
2018-05-14 20:00:29 +08:00
Go to folder `tests/build` , then run `make` with different target.
2019-12-13 21:17:00 +08:00
- `make vc19` #generate solution files for Microsoft Visual Studio 2019, then open eventpptest.sln in folder project_vc19
2018-05-14 20:00:29 +08:00
- `make vc17` #generate solution files for Microsoft Visual Studio 2017, then open eventpptest.sln in folder project_vc17
- `make vc15` #generate solution files for Microsoft Visual Studio 2015, then open eventpptest.sln in folder project_vc15
- `make mingw` #build using MinGW
- `make linux` #build on Linux
2020-04-15 21:01:31 +08:00
- `make mingw_coverage` #build using MinGW and generate code coverage report
2018-05-13 12:26:27 +08:00
## Motivations
2018-12-15 23:21:28 +08:00
I (wqking) am a big fan of observer pattern (publish/subscribe pattern), and I used this pattern extensively in my code. I either used GCallbackList in my [cpgf library ](https://github.com/cpgf/cpgf ) which is too simple and unsafe (not support multi-threading or nested events), or repeated coding event dispatching mechanism such as I did in my [Gincu game engine ](https://github.com/wqking/gincu ) (the latest version has be rewritten to use eventpp). Both or these methods are neither fun nor robust.
Thanking to C++11, now it's quite easy to write a reusable event library with beautiful syntax (it's a nightmare to simulate the variadic template in C++03), so here is `eventpp` .
2018-05-13 12:26:27 +08:00
2019-12-13 21:17:00 +08:00
## Change log
**Version 0.1.1**
Added HeterCallbackList, HeterEventDispatcher, and HeterEventQueue.
**Version 0.1.0**
First version.
Added CallbackList, EventDispatcher, EventQueue, CounterRemover, ConditionalRemover, ScopedRemover, and utilities.