28 template <
typename TRet,
typename...
Args>
50 virtual std::type_index
GetType()
const = 0;
100 } _state = STATE_NONE;
123 *
this = std::move(
other);
134 if (
this == &
other) {
138 switch (
other._state) {
144 std::unique_ptr<TCallable>
cloned(
other._GetSingle()->Clone());
145 _Reset(STATE_SINGLE);
146 _GetSingle() = std::move(
cloned);
152 _GetList() = std::move(
copied);
164 if (
this == &
other) {
168 _Reset(
other._state);
170 switch (
other._state) {
175 _GetSingle() = std::move(
other._GetSingle());
180 _GetList() = std::move(
other._GetList());
207 return _GetList().size();
221 return _state == STATE_NONE;
250 _Reset(STATE_SINGLE);
260 _GetList() = std::move(
list);
265 _GetList().emplace_back(std::move(
sp));
287 auto &
list = _GetList();
288 if (index >=
list.size()) {
314 return index == 0 ? _GetSingle().get() :
nullptr;
317 auto &
list = _GetList();
318 return (index <
list.size()) ?
list[index].get() :
nullptr;
341 return *
reinterpret_cast<TSinglePtr *
>(_data._single);
349 return *
reinterpret_cast<TSharedList *
>(_data._list);
355 void _Reset() noexcept
362 _GetSingle().~TSinglePtr();
367 _GetList().~TSharedList();
377 void _Reset(uint8_t state)
noexcept
384 _state = STATE_SINGLE;
401 template <
typename TRet,
typename... Args>
407 template <
typename T,
typename =
void>
411 template <
typename T>
416 template <
typename T,
typename =
void>
420 template <
typename T>
423 typename std::
enable_if< std::is_standard_layout<T>::value, void>::type> : std::true_type {
426 template <
typename T>
429 alignas(
T)
mutable uint8_t _storage[
sizeof(
T)];
432 _CallableWrapperImpl(
const T &value)
434 memset(_storage, 0,
sizeof(_storage));
435 new (_storage)
T(value);
437 _CallableWrapperImpl(
T &&value)
439 memset(_storage, 0,
sizeof(_storage));
440 new (_storage)
T(std::move(value));
442 virtual ~_CallableWrapperImpl()
447 T &GetValue()
const noexcept
449 return *
reinterpret_cast<T *
>(_storage);
451 TRet Invoke(
Args...
args)
const override
453 return GetValue()(std::forward<Args>(
args)...);
457 return new _CallableWrapperImpl(GetValue());
459 virtual std::type_index GetType()
const override
465 return EqualsImpl(
other);
467 template <
typename U = T>
469 ->
typename std::enable_if<_IsEqualityComparable<U>::value,
bool>::type
471 if (
this == &
other) {
474 if (GetType() !=
other.GetType()) {
480 template <
typename U = T>
484 if (
this == &
other) {
487 if (GetType() !=
other.GetType()) {
493 template <
typename U = T>
497 return this == &
other;
503 _CallableWrapperImpl(
const _CallableWrapperImpl &) =
delete;
504 _CallableWrapperImpl(_CallableWrapperImpl &&) =
delete;
505 _CallableWrapperImpl &operator=(
const _CallableWrapperImpl &) =
delete;
506 _CallableWrapperImpl &operator=(_CallableWrapperImpl &&) =
delete;
509 template <
typename T>
512 template <
typename T>
516 TRet (
T::*func)(
Args...);
519 _MemberFuncWrapper(
T &obj, TRet (
T::*func)(
Args...))
520 : obj(&obj), func(func)
523 TRet Invoke(
Args...
args)
const override
525 return (obj->*func)(std::forward<Args>(
args)...);
529 return new _MemberFuncWrapper(*obj, func);
531 virtual std::type_index GetType()
const override
537 if (
this == &
other) {
540 if (GetType() !=
other.GetType()) {
549 _MemberFuncWrapper(
const _MemberFuncWrapper &) =
delete;
550 _MemberFuncWrapper(_MemberFuncWrapper &&) =
delete;
551 _MemberFuncWrapper &operator=(
const _MemberFuncWrapper &) =
delete;
552 _MemberFuncWrapper &operator=(_MemberFuncWrapper &&) =
delete;
555 template <
typename T>
559 TRet (
T::*func)(
Args...)
const;
562 _ConstMemberFuncWrapper(
const T &obj, TRet (
T::*func)(
Args...)
const)
563 : obj(&obj), func(func)
566 TRet Invoke(
Args...
args)
const override
568 return (obj->*func)(std::forward<Args>(
args)...);
572 return new _ConstMemberFuncWrapper(*obj, func);
574 virtual std::type_index GetType()
const override
580 if (
this == &
other) {
583 if (GetType() !=
other.GetType()) {
592 _ConstMemberFuncWrapper(
const _ConstMemberFuncWrapper &) =
delete;
593 _ConstMemberFuncWrapper(_ConstMemberFuncWrapper &&) =
delete;
594 _ConstMemberFuncWrapper &operator=(
const _ConstMemberFuncWrapper &) =
delete;
595 _ConstMemberFuncWrapper &operator=(_ConstMemberFuncWrapper &&) =
delete;
640 template <
typename T>
649 template <
typename T>
660 for (
size_t i = 0;
i <
other._data.Count(); ++
i) {
669 : _data(std::move(
other._data))
678 if (
this == &
other) {
682 for (
size_t i = 0;
i <
other._data.Count(); ++
i) {
693 if (
this != &
other) {
694 _data = std::move(
other._data);
712 if (
callable.GetType() == GetType()) {
716 }
else if (
delegate._data.Count() == 1) {
729 if (func !=
nullptr) {
737 template <
typename T>
739 ->
typename std::enable_if<!std::is_base_of<_ICallable, T>::value,
void>::type
747 template <
typename T>
756 template <
typename T>
782 if (
callable.GetType() == GetType()) {
786 }
else if (
delegate._data.Count() == 1) {
800 if (func ==
nullptr) {
811 template <
typename T>
813 ->
typename std::enable_if<!std::is_base_of<_ICallable, T>::value,
bool>::type
823 template <
typename T>
834 template <
typename T>
848 return _InvokeImpl(std::forward<Args>(
args)...);
858 return Equals(
other);
868 return !Equals(
other);
922 template <
typename T>
924 ->
typename std::enable_if<!std::is_base_of<_ICallable, T>::value,
Delegate &>::type
954 template <
typename T>
956 ->
typename std::enable_if<!std::is_base_of<_ICallable, T>::value,
Delegate &>::type
970 return _InvokeImpl(std::forward<Args>(
args)...);
986 virtual std::type_index
GetType()
const override
998 if (
this == &
other) {
1001 if (GetType() !=
other.GetType()) {
1008 for (
size_t i = _data.
Count();
i > 0; --
i) {
1023 template <
typename U = TRet>
1025 ->
typename std::enable_if<!std::is_void<U>::value, std::vector<U>>::type
1030 _ThrowEmptyDelegateError();
1031 }
else if (
count == 1) {
1032 results.emplace_back(_data[0]->Invoke(std::forward<Args>(
args)...));
1036 for (
size_t i = 0;
i + 1 <
count; ++
i) {
1048 bool _Remove(
const _ICallable &
callable)
1050 for (
size_t i = _data.
Count();
i > 0; --
i) {
1061 [[noreturn]]
void _ThrowEmptyDelegateError()
const
1063 throw std::runtime_error(
"Delegate is empty");
1071 inline TRet _InvokeImpl(Args... args)
const
1073 size_t count = _data.
Count();
1075 _ThrowEmptyDelegateError();
1076 }
else if (count == 1) {
1077 return _data[0]->Invoke(std::forward<Args>(args)...);
1080 for (
size_t i = 0; i + 1 < count; ++i)
1081 list[i]->Invoke(args...);
1082 return list[count - 1]->Invoke(std::forward<Args>(args)...);
1093 template <
typename TRet,
typename... Args>
1096 return d ==
nullptr;
1103 template <
typename TRet,
typename... Args>
1106 return d !=
nullptr;
1114 template <
typename... Args>
1120 template <
typename T>
1128 template <
typename...>
1134 template <
typename Last>
1137 using TArgsTuple = std::tuple<>;
1143 template <
typename First,
typename...
Rest>
1152 template <
typename TArgsTuple>
1158 template <
typename...
Args>
1160 template <
typename TRet>
1167 template <
typename...
Types>
用于存储和管理多个可调用对象的列表,针对单个可调用对象的情况进行优化
Definition Delegate.h:67
CallableList(CallableList &&other) noexcept
移动构造函数
Definition Delegate.h:121
CallableList(const CallableList &other)
拷贝构造函数
Definition Delegate.h:113
CallableList()
默认构造函数
Definition Delegate.h:106
bool RemoveAt(size_t index) noexcept
移除指定索引处的可调用对象
Definition Delegate.h:275
std::unique_ptr< TCallable > TSinglePtr
智能指针类型别名,用于存储可调用对象的唯一指针
Definition Delegate.h:77
CallableList & operator=(const CallableList &other)
拷贝赋值运算
Definition Delegate.h:132
CallableList & operator=(CallableList &&other) noexcept
移动赋值运算
Definition Delegate.h:162
TCallable * operator[](size_t index) const noexcept
获取指定索引处的可调用对象
Definition Delegate.h:330
void Clear() noexcept
清空当前存储的可调用对象
Definition Delegate.h:227
TCallable * GetAt(size_t index) const noexcept
获取指定索引处的可调用对象
Definition Delegate.h:310
~CallableList()
析构函数
Definition Delegate.h:191
std::vector< std::shared_ptr< TCallable > > TSharedList
列表类型别名,用于存储多个可调用对象的智能指针
Definition Delegate.h:82
size_t Count() const noexcept
获取当前存储的可调用对象数量
Definition Delegate.h:200
bool IsEmpty() const noexcept
判断当前存储的可调用对象是否为空
Definition Delegate.h:219
void Add(TCallable *callable)
添加一个可调用对象到列表中
Definition Delegate.h:242
委托类,类似于C::中的委托,支持存储和调用任意可调用对象
Definition Delegate.h:403
Delegate(const T &obj, TRet(T::*func)(Args...) const)
构造函数,接受一个常量成员函数指针
Definition Delegate.h:650
void Add(TRet(*func)(Args...))
添加一个函数指针到委托中
Definition Delegate.h:727
void Add(const T &obj, TRet(T::*func)(Args...) const)
添加一个常量成员函数指针到委托中
Definition Delegate.h:757
Delegate & operator+=(TRet(*func)(Args...))
添加一个函数指针到委托中
Definition Delegate.h:912
Delegate(const Delegate &other)
拷贝构造函数
Definition Delegate.h:658
Delegate(std::nullptr_t=nullptr)
默认构造函数
Definition Delegate.h:608
auto InvokeAll(Args... args) const -> typename std::enable_if<!std::is_void< U >::value, std::vector< U > >::type
调用所有存储的可调用对象,并返回它们的结果
Definition Delegate.h:1024
Delegate & operator-=(TRet(*func)(Args...))
移除一个函数指针
Definition Delegate.h:944
Delegate(T &obj, TRet(T::*func)(Args...))
构造函数,接受一个成员函数指针
Definition Delegate.h:641
Delegate & operator=(Delegate &&other) noexcept
移动赋值运算符
Definition Delegate.h:691
virtual std::type_index GetType() const override
获取当前委托的类型信息
Definition Delegate.h:986
Delegate & operator=(const Delegate &other)
拷贝赋值运算符
Definition Delegate.h:676
Delegate(const T &callable)
构造函数,接受一个可调用对象
Definition Delegate.h:632
bool operator!=(const Delegate &other) const
判断当前委托是否不等于另一个委托
Definition Delegate.h:866
bool Remove(const ICallable< TRet(Args...)> &callable)
移除一个可调用对象
Definition Delegate.h:780
bool operator==(std::nullptr_t) const noexcept
判断当前委托是否等于nullptr
Definition Delegate.h:875
bool Remove(TRet(*func)(Args...))
移除一个函数指针
Definition Delegate.h:798
auto operator-=(const T &callable) -> typename std::enable_if<!std::is_base_of< _ICallable, T >::value, Delegate & >::type
移除一个可调用对象
Definition Delegate.h:955
virtual ICallable< TRet(Args...)> * Clone() const override
克隆当前委托
Definition Delegate.h:977
bool operator==(const Delegate &other) const
判断当前委托是否等于另一个委托
Definition Delegate.h:856
void Clear()
清空委托中的所有可调用对象
Definition Delegate.h:765
Delegate & operator+=(const ICallable< TRet(Args...)> &callable)
添加一个可调用对象到委托中
Definition Delegate.h:902
Delegate(Delegate &&other) noexcept
移动构造函数
Definition Delegate.h:668
auto operator+=(const T &callable) -> typename std::enable_if<!std::is_base_of< _ICallable, T >::value, Delegate & >::type
添加一个可调用对象到委托中
Definition Delegate.h:923
auto Remove(const T &callable) -> typename std::enable_if<!std::is_base_of< _ICallable, T >::value, bool >::type
移除一个可调用对象
Definition Delegate.h:812
virtual TRet Invoke(Args... args) const override
调用委托,执行所有存储的可调用对象
Definition Delegate.h:968
bool operator!=(std::nullptr_t) const noexcept
判断当前委托是否不等于nullptr
Definition Delegate.h:884
void Add(const ICallable< TRet(Args...)> &callable)
添加一个可调用对象到委托中
Definition Delegate.h:710
Delegate(TRet(*func)(Args...))
构造函数,接受一个函数指针
Definition Delegate.h:623
virtual bool Equals(const ICallable< TRet(Args...)> &other) const override
判断当前委托是否与另一个可调用对象相等
Definition Delegate.h:996
bool Remove(const T &obj, TRet(T::*func)(Args...) const)
移除一个常量成员函数指针
Definition Delegate.h:835
Delegate & operator-=(const ICallable< TRet(Args...)> &callable)
移除一个可调用对象
Definition Delegate.h:934
auto Add(const T &callable) -> typename std::enable_if<!std::is_base_of< _ICallable, T >::value, void >::type
添加一个可调用对象到委托中
Definition Delegate.h:738
Delegate(const ICallable< TRet(Args...)> &callable)
构造函数,接受一个可调用对象
Definition Delegate.h:615
bool Remove(T &obj, TRet(T::*func)(Args...))
移除一个成员函数指针
Definition Delegate.h:824
void Add(T &obj, TRet(T::*func)(Args...))
添加一个成员函数指针到委托中
Definition Delegate.h:748
TRet operator()(Args... args) const
调用委托,执行所有存储的可调用对象
Definition Delegate.h:846
值转换器接口
Definition IValueConverter.h:14
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
typename _FuncTypeHelper< typename _FuncTraits< Types... >::TArgsTuple >::template TFunc< typename _FuncTraits< Types... >::TRet > Func
Func类型别名,类似C::中的Func<T1, T2, ..., TResult>
Definition Delegate.h:1168
bool operator==(std::nullptr_t, const Delegate< TRet(Args...)> &d) noexcept
比较委托和nullptr
Definition Delegate.h:1094
bool operator!=(std::nullptr_t, const Delegate< TRet(Args...)> &d) noexcept
比较委托和nullptr
Definition Delegate.h:1104
ICallable接口,用于表示可调用对象的接口
Definition Delegate.h:29
virtual std::type_index GetType() const =0
获取当前可调用对象的类型信息
virtual ICallable * Clone() const =0
克隆当前可调用对象
virtual bool Equals(const ICallable &other) const =0
判断当前可调用对象是否与另一个可调用对象相等
virtual TRet Invoke(Args... args) const =0
调用函数
virtual ~ICallable()=default
析构函数
_FuncTraits模板,用于提取函数类型的返回值和参数类型
Definition Delegate.h:1129
_FuncTypeHelper模板,用于根据参数元组生成对应的Func类型
Definition Delegate.h:1153