2018-10-15 14:46:36 +01:00
# EventBus [![GitHub version](https://badge.fury.io/gh/gelldur%2FEventBus.svg)](https://badge.fury.io/gh/gelldur%2FEventBus)
[![Build status for Travis](https://travis-ci.org/gelldur/EventBus.svg?branch=master)](https://travis-ci.org/gelldur/EventBus)
[![Build status for Appveyor](https://ci.appveyor.com/api/projects/status/github/gelldur/EventBus)](https://ci.appveyor.com/project/gelldur/EventBus)
2017-08-13 14:37:19 +02:00
2017-08-06 11:22:59 +02:00
Simple and very fast event bus.
The EventBus library is a convenient realization of the observer pattern.
It works perfectly to supplement the implementation of MVC logic (model-view-controller) in event-driven UIs
2020-04-12 16:44:31 +02:00
General concept
![EventBus Diagram ](docs/res/EventBus-concept.png )
2017-08-06 11:22:59 +02:00
EventBus was created because I want something easy to use and faster than [CCNotificationCenter ](https://github.com/cocos2d/cocos2d-x/blob/v2/cocos2dx/support/CCNotificationCenter.h )
2020-04-12 16:44:31 +02:00
from [cocos2d-x ](https://github.com/cocos2d/cocos2d-x ) library. Of course C++11 support was mandatory at that moment.
2017-08-06 11:22:59 +02:00
2017-08-06 18:16:41 +02:00
EventBus main goals:
2017-08-06 11:22:59 +02:00
- Fast
- Easy to use
2017-08-06 16:32:09 +02:00
- Strongly typed
2017-08-06 11:22:59 +02:00
- Free
2020-04-12 16:44:31 +02:00
- tiny (~37 KB)
2017-08-06 11:22:59 +02:00
- Decouples notification senders and receivers
2018-09-09 13:47:16 +02:00
- on every platform you need (cross-platform)
2018-07-02 13:26:13 +02:00
# Brief @ presentation
Presentation [google docs ](https://docs.google.com/presentation/d/1apAlKcVWo9FcqkPqL8108a1Fy9LGmhgLT56hSVpoI3w/edit?usp=sharing )
2020-04-12 16:44:31 +02:00
# Sample / use cases
You can checkout [use_case/ ](use_case/ )
If you want to play with sample online checkout this link: [wandbox.org ](https://wandbox.org/permlink/VWo2acOX6hxUfV1Q )
2017-09-20 20:42:01 +02:00
2017-08-06 11:22:59 +02:00
# Usage
2017-09-10 14:32:21 +02:00
0. Store bus
2017-08-06 11:22:59 +02:00
```cpp
2018-07-02 13:26:13 +02:00
// store it in controller / singleton / std::sharted_ptr whatever you want
2020-04-12 16:44:31 +02:00
auto bus = std::make_shared< EventBus > ();
2017-08-06 11:22:59 +02:00
```
2017-09-10 14:32:21 +02:00
1. Define events
2017-08-06 11:22:59 +02:00
```cpp
2020-04-12 16:44:31 +02:00
namespace event // optional namespace
2017-09-10 14:32:21 +02:00
{
struct Gold
{
int goldReceived = 0;
};
2018-09-09 13:47:16 +02:00
2017-09-10 14:32:21 +02:00
struct OK {}; // Simple event when user press "OK" button
}
```
2. Subscribe
```cpp
// ...
2020-04-12 16:44:31 +02:00
dexode::EventBus::Listener listener{bus};
listener.listen([](const event::Gold& event) // listen with lambda
{
std::cout < < "I received gold: " < < event.goldReceived < < " 💰 " < < std::endl ;
});
2018-09-09 13:47:16 +02:00
2017-09-10 14:32:21 +02:00
HudLayer* hudLayer;
// Hud layer will receive info about gold
2020-04-12 16:44:31 +02:00
hudLayer->listener.listen< event::Gold > (std::bind(& HudLayer::onGoldReceived, hudLayer, std::placeholders::_1));
2017-09-10 14:32:21 +02:00
```
2020-04-12 16:44:31 +02:00
3. Spread the news
2017-09-10 14:32:21 +02:00
```cpp
//Inform listeners about event
2020-04-12 16:44:31 +02:00
bus->postpone(event::Gold{12}); // 1 way
bus->postpone< event::Gold > ({12}); // 2 way
2017-08-06 11:22:59 +02:00
2020-04-12 16:44:31 +02:00
event::Gold myGold{12};
bus->postpone(myGold); // 3 way
2017-08-06 11:22:59 +02:00
```
2020-04-12 16:44:31 +02:00
Checkout [tests ](test/ ) or [use cases ](use_case/ ) for more examples. Or create issue what isn't clear :)
2017-08-06 11:22:59 +02:00
# Add to your project
EventBus can be added as `ADD_SUBDIRECTORY` to your cmake file.
2018-09-09 13:47:16 +02:00
Then simply link it via `TARGET_LINK_LIBRARIES`
2017-08-06 11:22:59 +02:00
Example:
```
2019-03-15 15:50:37 +01:00
# No tests/benchmarks target won't be added. Root CMakeLists is for development.
ADD_SUBDIRECTORY(path/to/EventBus/lib)
2017-08-06 11:22:59 +02:00
ADD_EXECUTABLE(MyExecutable
main.cpp
)
TARGET_LINK_LIBRARIES(MyExecutable PUBLIC Dexode::EventBus)
```
2018-09-09 13:47:16 +02:00
Also if you want you can install library and add it at any way you want.
2017-08-15 21:50:49 +02:00
Eg.
```commandline
2018-07-31 11:33:35 +02:00
mkdir -p lib/build/
cd lib/build
cmake -DCMAKE_BUILD_TYPE=Relase -DCMAKE_INSTALL_PREFIX=~/.local/ ..
cmake --build . --target install
# OR
2017-08-15 21:50:49 +02:00
make & & make install
```
2017-08-06 11:22:59 +02:00
2018-09-09 13:47:16 +02:00
Now in `Release/install` library is placed.
2017-08-06 11:22:59 +02:00
2019-04-12 13:37:35 +02:00
Or, you can install the library through your package manager (dpkg, rpm, etc).
2019-04-21 14:35:04 +02:00
E.g.
2019-04-12 13:37:35 +02:00
```commandline
mkdir -p lib/build/
cd lib/build
# For most RH-based Distributions
cmake -DCMAKE_BUILD_TYPE=Relase -DCPACK_GENERATOR="RPM" ..
# For most Debian-based Distributions
cmake -DCMAKE_BUILD_TYPE=Relase -DCPACK_GENERATOR="DEB" ..
# Or for both of them
cmake -DCMAKE_BUILD_TYPE=Relase -DCPACK_GENERATOR="RPM;DEB" ..
cmake --build . --target package
2019-04-21 14:35:04 +02:00
# Or
2019-04-12 13:37:35 +02:00
make package
# For most Debian-based systems
sudo dpkg -i EventBus*.deb
# For most RH-based systems
sudo rpm -i EventBus*.rpm
# OR
sudo yum install EventBus*.rpm
```
2018-09-09 13:47:16 +02:00
# Performance (could be outdated)
I have prepared some performance results. You can read about them [here ](performance/README.md )
2017-08-06 11:22:59 +02:00
Small example:
```
2017-08-26 13:28:45 +02:00
check10NotificationsFor1kListeners 263 ns 263 ns 2668786 sum=-1.76281G
2017-08-06 11:22:59 +02:00
check10NotificationsFor1kListeners_CCNotificationCenter 11172 ns 11171 ns 62865 sum=54.023M
2017-08-26 13:28:45 +02:00
checkNotifyFor10kListenersWhenNoOneListens 18 ns 18 ns 38976599 sum=0
checkNotifyFor10kListenersWhenNoOneListens_CCNotificationCenter 127388 ns 127378 ns 5460 sum=0
2017-08-06 11:22:59 +02:00
```
2017-08-05 00:36:05 +02:00
2018-10-15 14:46:36 +01:00
# Issues ? [![GitHub issues](https://img.shields.io/github/issues/gelldur/EventBus.svg)](https://github.com/gelldur/EventBus/issues)
2018-09-09 13:47:16 +02:00
Please report here issue / question / whatever, there is chance 99% I will answer ;)
2018-07-02 13:26:13 +02:00
2018-10-15 14:46:36 +01:00
If you have any questions or want to chat use gitter.
[![Join the chat at https://gitter.im/EventBusCpp/Lobby ](https://badges.gitter.im/EventBusCpp/Lobby.svg )](https://gitter.im/EventBusCpp/Lobby?utm_source=badge& utm_medium=badge& utm_campaign=pr-badge& utm_content=badge)
# Tesing and metrics
// TODO
[![LoC ](https://tokei.rs/b1/github/gelldur/EventBus )](https://github.com/gelldur/EventBus)
[![Coverage Status ](https://coveralls.io/repos/github/gelldur/EventBus/badge.svg?branch=master )](https://coveralls.io/github/gelldur/EventBus?branch=master)
# Thanks to [![GitHub contributors](https://img.shields.io/github/contributors/gelldur/EventBus.svg)](https://github.com/gelldur/EventBus/graphs/contributors) [![Open Source Helpers](https://www.codetriage.com/gelldur/eventbus/badges/users.svg)](https://www.codetriage.com/gelldur/eventbus)
2017-08-20 21:03:19 +02:00
- [staakk ](https://github.com/stanislawkabacinski ) for fixing windows ;) [53d5026 ](https://github.com/gelldur/EventBus/commit/53d5026cad24810e82cd8d4a43d58cbfe329c502 )
2017-08-05 02:36:12 +02:00
- [kuhar ](https://github.com/kuhar ) for his advice and suggestions for EventBus
2018-09-09 13:47:16 +02:00
- [swietlana ](https://github.com/swietlana ) for English correction and support ;)
2017-08-05 02:36:12 +02:00
- [ruslo ](https://github.com/ruslo ) for this great example: https://github.com/forexample/package-example
2017-08-06 11:22:59 +02:00
2018-07-31 11:33:35 +02:00
## For modern cmake refer
- https://github.com/forexample/package-example
- https://www.youtube.com/watch?v=6sWec7b0JIc
2017-08-06 11:22:59 +02:00
# License
2018-09-09 13:47:16 +02:00
EventBus source code can be used according to the **Apache License, Version 2.0** .
2017-08-06 11:22:59 +02:00
For more information see [LICENSE ](LICENSE ) file
2018-07-02 13:26:13 +02:00
If you don't like to read to much here is sumup about license [Apache 2.0 ](https://tldrlegal.com/license/apache-license-2.0-(apache-2.0 )#summary )