1//
2// StdFunctionDelegate.h
3//
4// Library: Foundation
5// Package: Events
6// Module: StdFunctionDelegate
7//
8// Implementation of the StdFunctionDelegate template.
9//
10// Copyright (c) 2006-2011, Applied Informatics Software Engineering GmbH.
11// and Contributors.
12//
13// SPDX-License-Identifier: BSL-1.0
14//
15
16
17#ifndef Foundation_StdFunctionDelegate_INCLUDED
18#define Foundation_StdFunctionDelegate_INCLUDED
19
20
21#include "Poco/Foundation.h"
22#include "Poco/AbstractDelegate.h"
23#include "Poco/Mutex.h"
24#include <functional>
25#include <atomic>
26
27
28namespace Poco {
29
30
31template <class TArgs, bool hasSender = true, bool senderIsConst = true>
32class StdFunctionDelegate: public Poco::AbstractDelegate<TArgs>
33 /// Wraps a std::function or lambda
34 /// for use as a Delegate.
35{
36public:
37 typedef std::function<void (const void*, TArgs&)> NotifyMethod;
38
39 StdFunctionDelegate() = delete;
40
41 StdFunctionDelegate(NotifyMethod method):
42 _receiverMethod(method), _id(++id_generator)
43 {
44 }
45
46 StdFunctionDelegate(const StdFunctionDelegate& delegate):
47 Poco::AbstractDelegate<TArgs>(delegate),
48 _receiverMethod(delegate._receiverMethod),
49 _id(delegate._id)
50 {
51 }
52
53 ~StdFunctionDelegate()
54 {
55 }
56
57 StdFunctionDelegate& operator = (const StdFunctionDelegate& delegate)
58 {
59 if (&delegate != this)
60 {
61 this->_pTarget = delegate._pTarget;
62 this->_receiverMethod = delegate._receiverMethod;
63 this->_id = delegate._id;
64 }
65 return *this;
66 }
67
68 bool notify(const void* sender, TArgs& arguments)
69 {
70 Poco::Mutex::ScopedLock lock(_mutex);
71 if (_receiverMethod)
72 {
73 _receiverMethod(sender, arguments);
74 return true;
75 }
76 else return false;
77 }
78
79
80 bool equals(const Poco::AbstractDelegate<TArgs>& other) const
81 {
82 const StdFunctionDelegate* pOtherDelegate = dynamic_cast<const StdFunctionDelegate*>(other.unwrap());
83 return pOtherDelegate && _id == pOtherDelegate->_id;
84 }
85
86 Poco::AbstractDelegate<TArgs>* clone() const
87 {
88 return new StdFunctionDelegate(*this);
89 }
90
91 void disable()
92 {
93 Poco::Mutex::ScopedLock lock(_mutex);
94 _receiverMethod = nullptr;
95 }
96
97protected:
98 NotifyMethod _receiverMethod;
99 Poco::Mutex _mutex;
100 int _id;
101
102private:
103 static std::atomic_int id_generator;
104};
105
106
107template <class TArgs, bool hasSender, bool senderIsConst>
108std::atomic_int StdFunctionDelegate<TArgs, hasSender, senderIsConst>::id_generator;
109
110
111} // namespace Poco
112
113
114#endif // Foundation_StdFunctionDelegate_INCLUDED
115