2018-07-09 22:15:37 +08:00
# Class ConditionalRemover reference
2019-04-02 19:33:01 +08:00
<!-- begintoc -->
2019-03-31 11:22:36 +08:00
## Table Of Contents
2019-03-31 22:32:04 +08:00
* [Description ](#a2_1 )
* [API reference ](#a2_2 )
2019-03-31 11:22:36 +08:00
* [Header ](#a3_1 )
* [Template parameters ](#a3_2 )
* [Member functions ](#a3_3 )
* [Free functions ](#a3_4 )
* [Sample code ](#a3_5 )
<!-- endtoc -->
2019-03-31 22:32:04 +08:00
< a id = "a2_1" > < / a >
2018-07-09 22:15:37 +08:00
## Description
2018-07-09 22:30:28 +08:00
ConditionalRemover is a utility class that automatically removes listeners after the listeners are triggered and certain condition is satisfied.
2018-07-09 22:15:37 +08:00
ConditionalRemover is a pure functional class. After the member functions in ConditionalRemover are invoked, the ConditionalRemover object can be destroyed safely.
2019-03-31 22:32:04 +08:00
< a id = "a2_2" > < / a >
2018-07-09 22:15:37 +08:00
## API reference
2019-03-31 11:22:36 +08:00
< a id = "a3_1" > < / a >
2018-07-09 22:15:37 +08:00
### Header
eventpp/utilities/conditionalremover.h
2019-03-31 11:22:36 +08:00
< a id = "a3_2" > < / a >
2018-07-09 22:15:37 +08:00
### Template parameters
```c++
template < typename DispatcherType >
class ConditionalRemover;
```
2019-05-31 19:53:37 +08:00
`DispatcherType` can be CallbackList, EventDispatcher, EventQueue, HeterCallbackList, HeterEventDispatcher, or HeterEventQueue.
2018-07-09 22:15:37 +08:00
2019-03-31 11:22:36 +08:00
< a id = "a3_3" > < / a >
2018-07-09 22:15:37 +08:00
### Member functions
```c++
explicit ConditionalRemover(DispatcherType & dispatcher);
```
Constructs an instance of ConditionalRemover.
**Member functions for EventDispatcher and EventQueue**
```c++
template < typename Condition >
typename DispatcherType::Handle appendListener(
const typename DispatcherType::Event & event,
const typename DispatcherType::Callback & listener,
const Condition & condition
);
template < typename Condition >
typename DispatcherType::Handle prependListener(
const typename DispatcherType::Event & event,
const typename DispatcherType::Callback & listener,
const Condition & condition
);
template < typename Condition >
typename DispatcherType::Handle insertListener(
const typename DispatcherType::Event & event,
const typename DispatcherType::Callback & listener,
const typename DispatcherType::Handle & before,
const Condition & condition
);
```
**Member functions for CallbackList**
```c++
template < typename Condition >
typename CallbackListType::Handle append(
const typename CallbackListType::Callback & listener,
const Condition & condition
);
template < typename Condition >
typename CallbackListType::Handle prepend(
const typename CallbackListType::Callback & listener,
const Condition & condition
);
template < typename Condition >
typename CallbackListType::Handle insert(
const typename CallbackListType::Callback & listener,
const typename CallbackListType::Handle & before,
const Condition & condition
);
```
The member functions have the same names with the corresponding underlying class (CallbackList, EventDispatcher, or EventQueue), and also have the same parameters except there is one more parameter, `condition` . `condition` is a predicate function of prototype `bool()` . It's invoked after each trigger, if it returns true, the listener will be removed.
2019-03-31 11:22:36 +08:00
< a id = "a3_4" > < / a >
2018-07-09 22:15:37 +08:00
### Free functions
```c++
template < typename DispatcherType >
ConditionalRemover< DispatcherType > conditionalRemover(DispatcherType & dispatcher);
```
Since ConditionalRemover takes one template parameter and it's verbose to instantiate its instance, the function `conditionalRemover` is used to construct an instance of ConditionalRemover via the deduced argument.
2019-03-31 11:22:36 +08:00
< a id = "a3_5" > < / a >
2018-07-09 22:30:28 +08:00
### Sample code
2018-07-09 22:15:37 +08:00
```c++
#include "eventpp/utilities/conditionalRemover.h"
#include "eventpp/eventdispatcher.h"
eventpp::EventDispatcher< int , void ( ) > dispatcher;
constexpr int event = 3;
dispatcher.appendListener(event, []() {
// listener A
});
// Note the ConditionalRemover instance returned by conditionalRemover is invoked
// prependListener and destroyed immediately.
std::string removeWho;
eventpp::conditionalRemover(dispatcher).prependListener(event, [& dataList]() {
// listener B
}, [& removeWho]() -> bool {
return removeWho == "removeB";
});
auto handle = eventpp::conditionalRemover(dispatcher).appendListener(event, [& dataList]() {
// listener C
}, [& removeWho]() -> bool {
return removeWho == "removeC";
});
eventpp::conditionalRemover(dispatcher).insertListener(event, [& dataList]() {
// listener D
}, handle, [& removeWho]() -> bool {
return removeWho == "removeD";
});
dispatcher.dispatch(event);
// No listeners were removed since no conditions were met.
removeWho = "removeB";
dispatcher.dispatch(event);
// All listeners were triggered.
// Listener B was removed.
removeWho = "removeC";
dispatcher.dispatch(event);
// Listeners A, C, D were triggered.
// Listener C was removed.
removeWho = "removeD";
dispatcher.dispatch(event);
// Listeners A, D were triggered.
// Listener D was removed.
dispatcher.dispatch(event);
// Listeners A was triggered.
```