28 #ifndef YSL_INC_Core_yevt_hpp_
29 #define YSL_INC_Core_yevt_hpp_ 1
32 #include YFM_YSLib_Core_YObject
33 #include YFM_YSLib_Core_YFunc
45 template<
typename... _tParams>
47 DeclIEntry(
size_t operator()(_tParams...) const)
64 template<typename _tRet, typename... _tParams>
65 class GHEvent<_tRet(_tParams...)>
66 : protected std::function<_tRet(_tParams...)>
75 using Comparer = bool(*)(
const GHEvent&,
const GHEvent&);
76 template<
class _tFunctor>
88 static yconstexpr bool is_noexcept_v = noexcept(std::declval<
89 const decayed_type>() == std::declval<const decayed_type>());
95 if(
const auto p = x.template target<decayed_type>())
96 if(
const auto q = y.template target<decayed_type>())
97 return p == q || *p == *q;
118 template<
class _fCallable>
121 std::is_constructible<BaseType, _fCallable>::value,
int> = 0)
122 :
BaseType(f), comp_eq(GetComparer(f, f))
129 template<
class _fCallable>
132 !std::is_constructible<BaseType, _fCallable>::value,
int> = 0)
134 comp_eq(GHEvent::AreAlwaysEqual)
141 template<
class _type>
143 GHEvent(_type& obj, _tRet(_type::*pm)(_tParams...))
144 : GHEvent([&, pm](_tParams...
args){
158 operator==(const GHEvent& h)
const
161 #if defined(YF_DLL) || defined(YF_BUILD_DLL)
162 BaseType::target_type() == h.BaseType::target_type()
166 && (comp_eq(*
this, h));
172 using BaseType::operator();
177 template<
typename _type>
181 return GEquality<_type>::AreEqual;
183 template<
typename _type,
typename _tUnused>
187 return GHEvent::AreAlwaysEqual;
224 template<
typename _tRet,
typename... _tParams>
236 = multimap<EventPriority, HandlerType, std::greater<EventPriority>>;
237 using SizeType =
typename ContainerType::size_type;
254 template<typename _tHandler,
256 GEvent(_tHandler&& h)
275 template<typename _tHandler,
278 operator=(_tHandler&& _arg)
280 return *
this = GEvent(
yforward(_arg));
296 operator+=(const HandlerType& h)
305 operator+=(HandlerType&& h)
307 return Add(std::move(h));
313 template<
typename _type>
315 operator+=(_type&& _arg)
317 return Add(HandlerType(
yforward(_arg)));
324 operator-=(
const HandlerType& h)
326 ystdex::erase_all_if<ContainerType>(List, List.begin(), List.end(),
327 [&](decltype(*List.begin())& pr){
328 return pr.second == h;
337 operator-=(HandlerType&& h)
339 return *
this -=
static_cast<const HandlerType&
>(h);
345 template<
typename _type>
347 operator-=(_type&& _arg)
349 return *
this -= HandlerType(
yforward(_arg));
360 List.insert(make_pair(prior, h));
371 List.insert(make_pair(prior, std::move(h)));
379 template<
typename _type>
383 return Add(HandlerType(
yforward(_arg)), prior);
390 template<
class _tObj,
class _type>
392 Add(_tObj& obj, _tRet(_type::*pm)(_tParams...),
395 return Add(HandlerType(static_cast<_type&>(obj), std::move(pm)), prior);
402 template<
class _tObj,
class _type>
404 Remove(_tObj& obj, _tRet(_type::*pm)(_tParams...))
406 return *
this -= HandlerType(static_cast<_type&>(obj), std::move(pm));
413 Contains(
const HandlerType& h)
const
424 template<
typename _type>
437 operator()(_tParams...
args)
const
441 for(
const auto& pr : List)
447 catch(std::bad_function_call&)
479 template<typename _tRet, typename... _tParams>
480 inline GEvent<_tRet(_tParams...)>&
482 const typename GEvent<_tRet(_tParams...)>::HandlerType& h,
485 return (evt -= h).Add(h, prior);
487 template<
typename _tRet,
typename... _tParams>
488 inline GEvent<_tRet(_tParams...)>&
489 AddUnique(GEvent<_tRet(_tParams...)>& evt,
typename GEvent<_tRet(_tParams...)>
492 return (evt -= h).Add(std::move(h), prior);
494 template<
typename _type,
typename _tRet,
typename... _tParams>
495 inline GEvent<_tRet(_tParams...)>&
502 template<
class _type,
typename _tRet,
typename... _tParams>
503 inline GEvent<_tRet(_tParams...)>&
507 return AddUnique(evt, HandlerType(static_cast<_type&>(obj), std::move(pm)),
516 template<
typename _tRet,
typename... _tParams>
525 template<typename... _tEventArgs>
529 using EventType = GEvent<_tEventArgs...>;
530 using HandlerType = GHEvent<_tEventArgs...>;
531 std::reference_wrapper<EventType> Event;
534 template<
typename _type>
535 GEventGuard(EventType& evt, _type&& handler,
539 Event.get().Add(Handler, prior);
552 #define DeclDelegate(_name, _tEventArgs) \
553 using _name = GHEvent<void(_tEventArgs)>;
561 template<
class _tEvent,
class _tOwnerPo
inter = shared_ptr<_tEvent>>
568 =
typename GDependency<_tEvent>::ConstReferenceType;
578 : GDependency<_tEvent>(p)
584 template<
typename _type>
588 return this->GetNewRef().operator+=(_arg);
594 template<
typename _type>
598 return this->GetNewRef().operator-=(_arg);
605 template<
class _type,
typename _tRet,
typename... _tParams>
607 Add(_type& obj, _tRet(_type::*pm)(_tParams...))
609 return this->GetNewRef().Add(obj, pm);
616 template<
class _type,
typename _tRet,
typename... _tParams>
618 Remove(_type& obj, _tRet(_type::*pm)(_tParams...))
620 return this->GetNewRef().Remove(obj, pm);
627 template<
typename... _tParams>
648 template<typename... _tParams>
655 template<
typename... _tParams>
665 #define EventT(_tEventHandler) \
666 GEvent<void(typename EventArgsHead<_tEventHandler::TupleType>::type)>
667 #define DepEventT(_tEventHandler) \
668 typename GDependencyEvent(EventT(_tEventHandler))
676 #define DeclEvent(_tEventHandler, _name) \
677 EventT(_tEventHandler) _name;
678 #define DeclDepEvent(_tEventHandler, _name) \
679 DepEventT(_tEventHandler) _name;
687 #define DeclEventRef(_tEventHandler, _name) \
688 EventT(_tEventHandler)& _name;
689 #define DeclDepEventRef(_tEventHandler, _name) \
690 DepEventT(_tEventHandler)& _name;
697 #define DeclIEventEntry(_tEventHandler, _name) \
699 DeclIEntry(const EventT(_tEventHandler)& YPP_Concat(Get, _name)() const)
700 #define DeclIDepEventEntry(_tEventHandler, _name) \
702 DeclIEntry(const DepEventT(_tEventHandler)& YPP_Concat(Get, _name)() const)
710 #define DefEventGetter(_q, _tEventHandler, _name, _member) \
711 DefGetter(_q, EventT(_tEventHandler)&, _name, _member)
712 #define DefEventGetterBase(_q, _tEventHandler, _name, _base) \
713 DefGetterBase(_q, EventT(_tEventHandler)&, _name, _base)
714 #define DefEventGetterMem(_q, _tEventHandler, _name, _member) \
715 DefGetterMem(_q, EventT(_tEventHandler)&, _name, _member)
716 #define DefDepEventGetter(_q, _tEventHandler, _name, _member) \
717 DefGetter(_q, DepEventT(_tEventHandler)&, _name, _member)
718 #define DefDepEventGetterBase(_q, _tEventHandler, _name, _base) \
719 DefGetterBase(_q, DepEventT(_tEventHandler)&, _name, _base)
720 #define DefDepEventGetterMem(_q, _tEventHandler, _name, _member) \
721 DefGetterMem(_q, DepEventT(_tEventHandler)&, _name, _member)
730 template<
typename _type,
typename _fCallable = std::function<
void(_type&)>>
740 : ObjectRef(obj), Caller(f)
742 template<
typename _fCaller>
748 template<
typename... _tParams>
756 catch(std::bad_function_call&)
762 ImplRet(std::addressof(adaptor.ObjectRef.get())
763 == std::addressof(ObjectRef.get()))
771 template<
class _tEvent,
typename _tBaseArgs>
793 inline ImplI(GIHEvent<_tBaseArgs>)
803 template<typename _tBaseArgs>
816 template<
typename _type>
828 template<
typename _type>
852 #define DefExtendEventMap(_n, _b) \
853 DefExtendClass(YF_API, _n, public _b)
std::reference_wrapper< _type > ObjectRef
#define ImplBodyMem(_m, _n,...)
typename std::tuple_element< _vIdx, _type >::type tuple_element_t
yconstfn GHEvent(FuncType *f)
构造:使用函数指针。
GEventPointerWrapper(_type &&p) ynoexcept(is_noexcept< _type >
static bool AreEqual(const GHEvent &x, const GHEvent &y) ynoexcept(is_noexcept_v)
typename EventArgsHead< typename EventT(HPaintEvent)::TupleType >::type EventArgsType
yconstfn const string _tParams && args
auto ClonePolymorphic(const _type &p) -> decltype(&*p)
使用 clone 成员函数复制指定指针指向的多态类类型对象。
ystdex::decay_t< _tFunctor > decayed_type
typename conditional< _bCond, _type, _type2 >::type conditional_t
ReferenceType Remove(_type &obj, _tRet(_type::*pm)(_tParams...))
移除事件响应:目标为指定对象引用和成员函数指针。
#define DefDeCopyCtor(_t)
multimap< EventPriority, HandlerType, std::greater< EventPriority >> ContainerType
容器类型。
#define DefSwap(_q, _t)
使用 RAII 管理的事件辅助类。
typename EventType::SEventType SEventType
GIHEvent< UIEventArgs && > ItemType
GHandlerAdaptor(_type &obj, CallerType f)
tuple< _tParams...> TupleType
static yconstfn Comparer GetComparer(_type &, _tUnused &) ynothrow
std::function< void(PaintEventArgs &&)> Handler
样式处理器。
typename ContainerType::size_type SizeType
typename GDependency< _tEvent >::ReferentType ReferentType
typename decay< _type >::type decay_t
GEvent< _tRet(_tParams...)> & AddUnique(GEvent< _tRet(_tParams...)> &evt, const typename GEvent< _tRet(_tParams...)>::HandlerType &h, EventPriority prior=DefaultEventPriority)
添加单一事件响应:删除后添加。
unique_ptr< ItemType > PointerType
#define yforward(_expr)
根据参数类型使用 std::forward 传递对应参数。
#define DefGetter(_q, _t, _n,...)
ReferenceType operator+=(_type _arg)
添加事件响应。
SizeType operator()(_tParams &&...args) const
调用函数。
yconstfn GHEvent(_fCallable f, ystdex::enable_if_t< std::is_constructible< BaseType, _fCallable >::value, int >=0)
使用函数对象。
std::function< FuncType > BaseType
void swap(any &x, any &y)
交换对象。
expanded_caller< _fHandler, decay_t< _fCallable > > make_expanded(_fCallable &&f)
构造接受冗余参数的可调用对象。
const second_tag get_value
yconstexpr EventPriority DefaultEventPriority(0x80)
默认事件优先级。
static yconstfn bool AreAlwaysEqual(const GHEvent &, const GHEvent &) ynothrow
typename EventType::FuncType FuncType
typename HandlerType::TupleType TupleType
#define DefDeMoveCtor(_t)
ystdex::conditional_t< sizeof...(_tParams)==0, void, ystdex::tuple_element_t< 0, tuple< _tParams...>>> type
typename GDependency< _tEvent >::PointerType PointerType
ReferenceType operator-=(_type _arg)
移除事件响应。
#define ynothrow
YSLib 无异常抛出保证:若支持 noexcept 关键字, 指定特定的 noexcept 异常规范。
GHandlerAdaptor(_type &obj, _fCaller &&f)
ystdex::decay_t< _fCallable > CallerType
Comparer comp_eq
比较函数:相等关系。
ImplI(GIHEvent< _tBaseArgs >) size_t operator()(BaseArgsType e) const
委托调用。
DeclDerivedI(, GIHEvent, ystdex::cloneable) DeclIEntry(size_t operator()(_tParams...) const ) DeclIEntry(GIHEvent *clone() const override) EndDecltemplate< typename > class GHEvent
事件处理器接口模板。
GDependencyEvent(PointerType p=PointerType())
yconstfn GHEvent(_type &obj, _tRet(_type::*pm)(_tParams...))
构造:使用对象引用和成员函数指针。
typename EventType::HandlerType HandlerType
#define YAssertNonnull(_expr)
GIHEvent< _tBaseArgs > ItemType
GEventPointerWrapper(const GEventPointerWrapper &item)
复制构造:深复制。
#define yconstfn
指定编译时常量函数。
typename EventType::SizeType SizeType
enable_if_t<!is_same< _tClass &, remove_rcv_t< _tParam > & >::value, _type > exclude_self_ctor_t
移除选择类类型的特定重载避免构造模板和复制/转移构造函数冲突。
EventT(HPaintEvent) EventType
static yconstfn Comparer GetComparer(_type &x, _type &y, decltype(x==y)={}) ynothrow
typename GDependency< _tEvent >::DependentType DependentType
#define DefClone(_q, _t)
动态复制。
Selected const shared_ptr< ListType > const pair< Color, Color > viewer Contains
ReferenceType Add(_type &obj, _tRet(_type::*pm)(_tParams...))
添加事件响应:使用对象引用和成员函数指针。
typename GDependency< _tEvent >::ConstReferenceType ConstReferenceType
#define DefDeMoveAssignment(_t)
#define yconstexpr
指定编译时常量表达式。
#define DefCvt(_q, _t,...)
_tRet(_tParams...) FuncType
bool(*)(const GHEvent &, const GHEvent &) Comparer
比较函数类型。
#define DefGetterMem(_q, _t, _n, _m)
void operator()(_tParams &&...args) const
#define ynoexcept(...)
YSLib 无异常抛出保证:指定特定的异常规范。
typename GDependency< _tEvent >::ReferenceType ReferenceType
YF_API yimpl(GUIApplication &) FetchGlobalInstance() ynothrow
取全局应用程序实例。
yconstfn GHEvent(_fCallable &&f, ystdex::enable_if_t< !std::is_constructible< BaseType, _fCallable >::value, int >=0)
使用扩展函数对象。
#define DefDeCopyAssignment(_t)
typename enable_if< _bCond, _type >::type enable_if_t
typename HandlerType::FuncType FuncType