util/BindMethod: new utility class for callbacks

Replaces the old BoundMethod template.
This commit is contained in:
Max Kellermann
2016-06-17 17:00:05 +02:00
parent bdd0c3686d
commit 863f4d8366
8 changed files with 206 additions and 92 deletions

View File

@@ -32,5 +32,5 @@ MaskMonitor::RunDeferred()
{
const unsigned mask = pending_mask.exchange(0);
if (mask != 0)
HandleMask(mask);
callback(mask);
}

View File

@@ -22,7 +22,7 @@
#include "check.h"
#include "DeferredMonitor.hxx"
#include "util/BoundMethod.hxx"
#include "util/BindMethod.hxx"
#include <atomic>
@@ -32,12 +32,15 @@
*
* This class is thread-safe.
*/
class MaskMonitor : DeferredMonitor {
class MaskMonitor final : DeferredMonitor {
typedef BoundMethod<void(unsigned)> Callback;
const Callback callback;
std::atomic_uint pending_mask;
public:
explicit MaskMonitor(EventLoop &_loop)
:DeferredMonitor(_loop), pending_mask(0) {}
MaskMonitor(EventLoop &_loop, Callback _callback)
:DeferredMonitor(_loop), callback(_callback), pending_mask(0) {}
using DeferredMonitor::GetEventLoop;
using DeferredMonitor::Cancel;
@@ -45,28 +48,8 @@ public:
void OrMask(unsigned new_mask);
protected:
virtual void HandleMask(unsigned mask) = 0;
/* virtual methode from class DeferredMonitor */
void RunDeferred() override;
};
/**
* A variant of #MaskMonitor which invokes a bound method.
*/
template<typename T>
class CallbackMaskMonitor final : public MaskMonitor {
BoundMethod<T, void, unsigned> callback;
public:
template<typename... Args>
explicit CallbackMaskMonitor(EventLoop &_loop, Args&&... args)
:MaskMonitor(_loop), callback(std::forward<Args>(args)...) {}
protected:
void HandleMask(unsigned mask) override {
callback(mask);
}
};
#endif