8 #ifndef Sawyer_Callbacks_H
9 #define Sawyer_Callbacks_H
11 #include <Sawyer/Sawyer.h>
12 #include <Sawyer/SharedPointer.h>
18 template<
class Callback>
21 typedef std::list<Callback> CbList;
25 bool isEmpty()
const {
26 return callbacks_.empty();
29 Callbacks& append(
const Callback &callback) {
30 callbacks_.push_back(callback);
35 callbacks_.insert(callbacks_.end(), other.callbacks_.begin(), other.callbacks_.end());
39 Callbacks& prepend(
const Callback &callback) {
40 callbacks_.push_front(callback);
44 Callback& prepend(
const Callbacks &other) {
45 callbacks_.insert(callbacks_.begin(), other.callbacks_.begin(), other.callbacks_.end());
49 Callbacks& eraseFirst(
const Callback &callback) {
50 for (
typename CbList::iterator iter=callbacks_.begin(); iter!=callbacks_.end(); ++iter) {
51 if (*iter == callback) {
52 callbacks_.erase(iter);
59 Callbacks& eraseLast(
const Callback &callback) {
60 for (
typename CbList::reverse_iterator reverseIter=callbacks_.rbegin(); reverseIter!=callbacks_.rend(); ++reverseIter) {
61 if (*reverseIter == callback) {
62 typename CbList::iterator forwardIter = (++reverseIter).base();
63 callbacks_.erase(forwardIter);
70 Callbacks& eraseMatching(
const Callback &callback) {
71 typename CbList::iterator iter = callbacks_.begin();
72 while (iter!=callbacks_.end()) {
73 if (*iter == callback) {
74 typename CbList::iterator toErase = iter++;
75 callbacks_.erase(toErase);
82 template<
class CB,
class Args>
83 bool applyCallback(CB *callback,
bool chained,
const Args &args)
const {
84 return (*callback)(chained, args);
87 template<
class CB,
class Args>
88 bool applyCallback(
const SharedPointer<CB> &callback,
bool chained,
const Args &args)
const {
89 return (*callback)(chained, args);
92 template<
class CB,
class Args>
93 bool applyCallback(CB &callback,
bool chained,
const Args &args)
const {
94 return callback(chained, args);
97 template<
class Arguments>
98 bool apply(
bool chained,
const Arguments &arguments)
const {
99 for (
typename CbList::const_iterator iter=callbacks_.begin(); iter!=callbacks_.end(); ++iter)
100 chained = applyCallback(*iter, chained, arguments);
105 template<
class Callback>
111 : callbacks_(callbacks), callback_(callback) {
112 callbacks_.append(callback);
116 callbacks_.eraseLast(callback_);
Reference-counting intrusive smart pointer.
Name space for the entire library.