28 #ifndef YSL_INC_Core_yevt_hpp_
29 #define YSL_INC_Core_yevt_hpp_ 1
42 template<
typename... _tParams>
44 DeclIEntry(
size_t operator()(_tParams...) const)
60 template<typename _tRet, typename... _tParams>
61 class GHEvent<_tRet(_tParams...)>
62 : protected std::function<
void(_tParams...)>
66 typedef typename std::conditional<std::tuple_size<TupleType>::value == 0,
67 void,
typename std::tuple_element<0, TupleType>::type>::type
73 typedef bool(*Comparer)(
const GHEvent&,
const GHEvent&);
74 template<
class _tFunctor>
82 static yconstexpr bool except_helper = noexcept(std::declval<
83 const decayed_type>() == std::declval<const decayed_type>());
87 AreEqual(
const GHEvent& x,
const GHEvent& y)
93 if(
const auto p = x.template target<decayed_type>())
94 if(
const auto q = y.template target<decayed_type>())
95 return p == q || *p == *q;
110 : BaseType(f), comp_eq(GEquality<FuncType>::AreEqual)
116 template<
class _fCallable>
118 GHEvent(_fCallable&& f,
typename std::enable_if<std::is_constructible<
119 BaseType, _fCallable>::value,
int>::type = 0)
120 : BaseType(
yforward(f)), comp_eq(GetComparer(f, f))
125 template<
class _type>
127 GHEvent(_type& obj,
void(_type::*pm)(_tParams...))
130 _tParams...>>::AreEqual)
142 operator==(const GHEvent&
h)
const
145 #if defined(YF_DLL) || defined(YF_BUILD_DLL)
146 BaseType::target_type() == h.BaseType::target_type()
150 && (comp_eq(*
this, h));
156 using BaseType::operator();
161 template<
typename _type>
163 GetComparer(_type& x, _type& y, decltype(x == y) =
false)
ynothrow
165 return GEquality<_type>::AreEqual;
167 template<
typename _type,
typename _tUnused>
171 return GHEvent::AreAlwaysEqual;
175 AreAlwaysEqual(
const GHEvent&,
const GHEvent&)
ynothrow
208 template<
typename _tRet,
typename... _tParams>
219 typedef multimap<EventPriority, HandlerType, std::greater<EventPriority>>
221 typedef typename ContainerType::size_type
SizeType;
249 template<typename _tHandler>
269 template<typename _type>
271 operator=(_type&& _arg)
292 return Add(std::move(
h));
298 template<
typename _type>
300 operator+=(_type&& _arg)
311 ystdex::erase_all_if<ContainerType>(List, List.begin(), List.end(),
312 [&](decltype(*List.begin())& pr){
313 return pr.second ==
h;
330 template<
typename _type>
332 operator-=(_type&& _arg)
345 List.insert(make_pair(prior, h));
356 List.insert(make_pair(prior, std::move(
h)));
364 template<
typename _type>
375 template<
class _tObj,
class _type>
380 return Add(
HandlerType(static_cast<_type&>(obj), std::move(pm)), prior);
387 template<
class _tObj,
class _type>
391 return *
this -=
HandlerType(static_cast<_type&>(obj), std::move(pm));
409 template<
typename _type>
422 operator()(_tParams... args)
const
426 for(
const auto& pr : List)
432 catch(std::bad_function_call&)
463 template<
typename _tRet,
typename... _tParams>
464 inline GEvent<_tRet(_tParams...)>&
466 const typename GEvent<_tRet(_tParams...)>::HandlerType&
h,
469 return (evt -= h).
Add(h, prior);
471 template<
typename _tRet,
typename... _tParams>
472 inline GEvent<_tRet(_tParams...)>&
476 return (evt -=
h).
Add(std::move(
h), prior);
478 template<
typename _type,
typename _tRet,
typename... _tParams>
479 inline GEvent<_tRet(_tParams...)>&
485 template<
class _type,
typename _tRet,
typename... _tParams>
486 inline GEvent<_tRet(_tParams...)>&
488 void(_type::*pm)(
typename GEvent<_tRet(_tParams...)>::EventArgsType),
491 return AddUnique(evt, HandlerType(static_cast<_type&>(obj), std::move(pm)),
501 #define DeclDelegate(_name, _tEventArgs) \
502 typedef GHEvent<void(_tEventArgs)> _name;
510 template<
class _tEvent,
class _tOwnerPo
inter = shared_ptr<_tEvent>>
534 template<
typename _type>
536 operator+=(_type _arg)
538 return this->GetNewRef().operator+=(_arg);
544 template<
typename _type>
546 operator-=(_type _arg)
548 return this->GetNewRef().operator-=(_arg);
554 template<
class _type>
558 return this->GetNewRef().Add(obj, pm);
564 template<
class _type>
568 return this->GetNewRef().Remove(obj, pm);
577 return this->GetRef().operator()(std::move(e));
598 #define EventT(_tEventHandler) GEvent<void(_tEventHandler::EventArgsType)>
599 #define DepEventT(_tEventHandler) \
600 typename GDependencyEvent(EventT(_tEventHandler))
608 #define DeclEvent(_tEventHandler, _name) \
609 EventT(_tEventHandler) _name;
610 #define DeclDepEvent(_tEventHandler, _name) \
611 DepEventT(_tEventHandler) _name;
619 #define DeclEventRef(_tEventHandler, _name) \
620 EventT(_tEventHandler)& _name;
621 #define DeclDepEventRef(_tEventHandler, _name) \
622 DepEventT(_tEventHandler)& _name;
630 #define DeclIEventEntry(_tEventHandler, _name) \
631 DeclIEntry(const EventT(_tEventHandler)& yJOIN(Get, _name)() const)
633 #define DeclIDepEventEntry(_tEventHandler, _name) \
634 DeclIEntry(const DepEventT(_tEventHandler)& yJOIN(Get, _name)() const)
642 #define DefEventGetter(_q, _tEventHandler, _name, _member) \
643 DefGetter(_q, EventT(_tEventHandler)&, _name, _member)
644 #define DefEventGetterBase(_q, _tEventHandler, _name, _base) \
645 DefGetterBase(_q, EventT(_tEventHandler)&, _name, _base)
646 #define DefEventGetterMem(_q, _tEventHandler, _name, _member) \
647 DefGetterMem(_q, EventT(_tEventHandler)&, _name, _member)
648 #define DefDepEventGetter(_q, _tEventHandler, _name, _member) \
649 DefGetter(_q, DepEventT(_tEventHandler)&, _name, _member)
650 #define DefDepEventGetterBase(_q, _tEventHandler, _name, _base) \
651 DefGetterBase(_q, DepEventT(_tEventHandler)&, _name, _base)
652 #define DefDepEventGetterMem(_q, _tEventHandler, _name, _member) \
653 DefGetterMem(_q, DepEventT(_tEventHandler)&, _name, _member)
661 template<
class _tEvent,
typename _tBaseArgs>
691 template<typename _tBaseArgs>
700 template<
typename _type>
701 struct except_helper_t
704 = noexcept(PointerType(std::declval<_type>()));
712 template<
typename _type>
714 GEventPointerWrapper(_type&& p)
721 YAssert(
bool(p),
"Null pointer found.");
726 GEventPointerWrapper(
const GEventPointerWrapper& item)
740 #define DefExtendEventMap(_n, _b) \
741 DefExtendClass(YF_API, _n, public _b)