7#ifndef MYGUI_DELEGATE_H_
8#define MYGUI_DELEGATE_H_
29 m_baseDelegateUnlink(this)
34 return m_baseDelegateUnlink == _unlink->m_baseDelegateUnlink;
41 template<
typename... Args>
50 mFunctionPointer(_functionPointer)
59 mFunctionPointer(_functionPointer)
67 mFunctionPointer(_functionPointer)
78 if (
nullptr == _delegate)
80 return _delegate->mObject == mObject && _delegate->mFunctionPointer.
compare(mFunctionPointer);
85 return mUnlink == _unlink;
92 const void* mObject =
nullptr;
99 template<
typename... Args>
106 template<
typename T,
typename... Args>
110 [=](Args&&... args) {
return (_object->*_method)(std::forward<decltype(args)>(args)...); },
114 template<
typename T,
typename... Args>
118 [=](Args&&... args) {
return (_object->*_method)(std::forward<decltype(args)>(args)...); },
126 template<
typename... Args>
128 const std::function<
void(Args...)>& _function,
137 template<
typename R,
typename C,
typename... Args>
146 template<
typename TLambda>
147 inline auto newDelegate(
const TLambda& _function, int64_t delegateId)
150 return new DelegateType(_function, delegateId);
156 template<
typename... Args>
174 mDelegate.reset(_delegate);
181 mDelegate->invoke(args...);
185 std::unique_ptr<IDelegate> mDelegate;
188 template<
typename... Args>
201 for (
const auto& delegate : mListDelegates)
213 for (
auto& delegate : mListDelegates)
217 mListDelegates.clear();
224 for (
auto& delegate : mListDelegates)
226 if (delegate && delegate->compare(_unlink))
235 auto found = std::find_if(
236 mListDelegates.begin(),
237 mListDelegates.end(),
238 [=](
const auto& delegate) { return delegate && delegate->compare(_delegate); });
239 if (found != mListDelegates.end())
241 mListDelegates.emplace_back(_delegate);
248 auto found = std::find_if(
249 mListDelegates.begin(),
250 mListDelegates.end(),
251 [=](
const auto& delegate) { return delegate && delegate->compare(_delegate); });
252 if (found != mListDelegates.end())
254 if (found->get() == _delegate)
263 bool canErase = !mRunning;
264 InvocationModificationGuard guard(*
this);
265 for (
auto it = mListDelegates.begin(); it != mListDelegates.end();)
268 (*it)->invoke(args...);
271 it = mListDelegates.erase(it);
288 mutable bool mRunning{
false};
297 if (delegate.mRunning)
301 mDelegate = &delegate;
302 mDelegate->mRunning =
true;
305 ~InvocationModificationGuard()
308 mDelegate->mRunning =
false;
311 friend class InvocationModificationGuard;
314#ifndef MYGUI_DONT_USE_OBSOLETE
316 template<
typename... Args>
318 template<
typename... Args>
320 template<
typename... Args>
322 template<
typename... Args>
324 template<
typename... Args>
326 template<
typename... Args>
330 template<
typename... Args>
332 template<
typename... Args>
334 template<
typename... Args>
336 template<
typename... Args>
338 template<
typename... Args>
340 template<
typename... Args>
#define MYGUI_EXCEPT(dest)
#define MYGUI_OBSOLETE(text)
bool compare(const Any &other) const
void invoke(Args... args)
DelegateFunction(Function _function, Any _functionPointer, const void *_object)
DelegateFunction(Function _function, Any _functionPointer)
DelegateFunction(Function _function, Any _functionPointer, const IDelegateUnlink *_object)
std::function< void(Args...)> Function
bool compare(DelegateFunction< Args... > *_delegate) const
bool compare(IDelegateUnlink *_unlink) const
void operator()(Args... args) const
DelegateFunction< Args... > IDelegate
Delegate & operator=(IDelegate *_delegate)
virtual ~IDelegateUnlink()=default
bool compare(IDelegateUnlink *_unlink) const
typename std::list< std::unique_ptr< IDelegate > > ListDelegate
void operator-=(IDelegate *_delegate)
DelegateFunction< Args... > IDelegate
friend class InvocationModificationGuard
void operator+=(IDelegate *_delegate)
MultiDelegate(MultiDelegate &&) noexcept=default
void clear(IDelegateUnlink *_unlink)
void operator()(Args... args) const
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))
MyGUI::delegates::DelegateFunction< Args... > type