7#ifndef MYGUI_DELEGATE_H_
8#define MYGUI_DELEGATE_H_
29 m_baseDelegateUnlink =
this;
33 return m_baseDelegateUnlink ==
_unlink->m_baseDelegateUnlink;
40 template <
typename ...Args>
79 return _delegate->mObject == mObject &&
_delegate->mFunctionPointer.compare(mFunctionPointer);
91 const void* mObject =
nullptr;
98template <
typename ...Args>
105template <
typename T,
typename ...Args>
113template <
typename T,
typename ...Args>
125template <
typename ...Args>
134 template <
typename ...Args>
138 using IDelegate = DelegateFunction<Args...>;
140 Delegate() : mDelegate(nullptr) { }
141 Delegate(
const Delegate& _event) : mDelegate(nullptr)
144 mDelegate = _event.mDelegate;
145 const_cast<Delegate&
>(_event).mDelegate =
nullptr;
155 return mDelegate ==
nullptr;
164 Delegate& operator=(IDelegate* _delegate)
167 mDelegate = _delegate;
171 Delegate& operator=(
const Delegate<Args...>& _event)
177 IDelegate* del = _event.mDelegate;
178 const_cast<Delegate&
>(_event).mDelegate =
nullptr;
180 if (mDelegate !=
nullptr && !mDelegate->compare(del))
188 void operator()(Args... args)
const
190 if (mDelegate ==
nullptr)
return;
191 mDelegate->invoke(args...);
195 IDelegate* mDelegate;
198 template <
typename ...Args>
202 using IDelegate = DelegateFunction<Args...>;
203 using ListDelegate =
typename std::list<IDelegate*>;
213 for (
const auto& delegate : mListDelegates)
215 if (delegate)
return false;
222 for (
auto iter = mListDelegates.begin(); iter != mListDelegates.end(); ++iter)
232 void clear(IDelegateUnlink* _unlink)
234 for (
auto iter = mListDelegates.begin(); iter != mListDelegates.end(); ++iter)
236 if ((*iter) && (*iter)->compare(_unlink))
244 void operator+=(IDelegate* _delegate)
246 for (
auto iter = mListDelegates.begin(); iter != mListDelegates.end(); ++iter)
248 if ((*iter) && (*iter)->compare(_delegate))
253 mListDelegates.push_back(_delegate);
256 void operator-=(IDelegate* _delegate)
258 for (
auto iter = mListDelegates.begin(); iter != mListDelegates.end(); ++iter)
260 if ((*iter) && (*iter)->compare(_delegate))
262 if ((*iter) != _delegate)
delete (*iter);
270 void operator()(Args... args)
const
272 auto iter = mListDelegates.begin();
273 while (iter != mListDelegates.end())
275 if (
nullptr == (*iter))
277 iter = mListDelegates.erase(iter);
281 (*iter)->invoke(args...);
287 MultiDelegate(
const MultiDelegate& _event)
290 ListDelegate del = _event.mListDelegates;
291 const_cast<MultiDelegate&
>(_event).mListDelegates.clear();
295 mListDelegates = del;
298 MultiDelegate& operator=(
const MultiDelegate& _event)
301 ListDelegate del = _event.mListDelegates;
302 const_cast<MultiDelegate&
>(_event).mListDelegates.clear();
306 mListDelegates = del;
312 MultiDelegate& operator=(IDelegate* _delegate)
320 void safe_clear(ListDelegate& _delegates)
322 for (
auto iter = mListDelegates.begin(); iter != mListDelegates.end(); ++iter)
326 IDelegate* del = (*iter);
328 delete_is_not_found(del, _delegates);
333 void delete_is_not_found(IDelegate* _del, ListDelegate& _delegates)
335 for (
auto iter = _delegates.begin(); iter != _delegates.end(); ++iter)
337 if ((*iter) && (*iter)->compare(_del))
347 mutable ListDelegate mListDelegates;
351 using CDelegate0 = Delegate<>;
352 template <
typename ...Args>
353 using CDelegate1 = Delegate<Args...>;
354 template <
typename ...Args>
355 using CDelegate2 = Delegate<Args...>;
356 template <
typename ...Args>
357 using CDelegate3 = Delegate<Args...>;
358 template <
typename ...Args>
359 using CDelegate4 = Delegate<Args...>;
360 template <
typename ...Args>
361 using CDelegate5 = Delegate<Args...>;
362 template <
typename ...Args>
363 using CDelegate6 = Delegate<Args...>;
365 using CMultiDelegate0 = MultiDelegate<>;
366 template <
typename ...Args>
367 using CMultiDelegate1 = MultiDelegate<Args...>;
368 template <
typename ...Args>
369 using CMultiDelegate2 = MultiDelegate<Args...>;
370 template <
typename ...Args>
371 using CMultiDelegate3 = MultiDelegate<Args...>;
372 template <
typename ...Args>
373 using CMultiDelegate4 = MultiDelegate<Args...>;
374 template <
typename ...Args>
375 using CMultiDelegate5 = MultiDelegate<Args...>;
376 template <
typename ...Args>
377 using CMultiDelegate6 = MultiDelegate<Args...>;
#define MYGUI_EXCEPT(dest)
#define MYGUI_OBSOLETE(text)
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
virtual ~IDelegateUnlink()=default
bool compare(IDelegateUnlink *_unlink) const
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))