Skip to content

Commit 324aa9c

Browse files
authored
Merge pull request #157 from Mzying2001/dev
Dev
2 parents 51b50e7 + 929ee10 commit 324aa9c

12 files changed

Lines changed: 1331 additions & 118 deletions

sw/inc/ITag.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
#pragma once
22

3-
#include <cstdint>
3+
#include "Internal.h"
44

55
namespace sw
66
{
77
/**
88
* @brief Tag接口
99
*/
10+
template <typename T>
1011
class ITag
1112
{
1213
public:
@@ -19,11 +20,11 @@ namespace sw
1920
/**
2021
* @brief 获取Tag
2122
*/
22-
virtual uint64_t GetTag() const = 0;
23+
virtual T GetTag() const = 0;
2324

2425
/**
2526
* @brief 设置Tag
2627
*/
27-
virtual void SetTag(uint64_t tag) = 0;
28+
virtual void SetTag(_OptimalParamType<T> tag) = 0;
2829
};
2930
}

sw/inc/IValueConverter.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
#pragma once
22

3-
#include "Property.h" // For _PropertySetterParamType<T>
3+
#include "Internal.h"
44

55
namespace sw
66
{
7-
/**
8-
* @brief 最佳参数类型,标量类型使用值传递,复杂类型使用常量引用传递
9-
*/
10-
template <typename T>
11-
using _OptimalParamType = _PropertySetterParamType<T>;
12-
137
/**
148
* @brief 值转换器接口
159
* @tparam TSource 源类型

sw/inc/Internal.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#pragma once
2+
3+
#include <type_traits>
4+
5+
namespace sw
6+
{
7+
/**
8+
* @brief 最佳参数类型,标量类型使用值传递,复杂类型使用常量引用传递
9+
*/
10+
template <typename T>
11+
using _OptimalParamType = typename std::conditional<
12+
std::is_scalar<typename std::decay<T>::type>::value,
13+
typename std::decay<T>::type, const typename std::decay<T>::type &>::type;
14+
15+
/**
16+
* @brief 判断类型是否可以显式转换的辅助模板
17+
*/
18+
template <typename TFrom, typename TTo, typename = void>
19+
struct _IsExplicitlyConvertable : std::false_type {
20+
};
21+
22+
/**
23+
* @brief _IsExplicitlyConvertable模板特化
24+
*/
25+
template <typename TFrom, typename TTo>
26+
struct _IsExplicitlyConvertable<
27+
TFrom, TTo, decltype(void(static_cast<TTo>(std::declval<TFrom>())))> : std::true_type {
28+
};
29+
30+
/**
31+
* @brief 用于判断是否可以通过static_cast进行转换
32+
*/
33+
template <typename TFrom, typename TTo>
34+
using _IsStaticCastable = _IsExplicitlyConvertable<TFrom, TTo>;
35+
36+
/**
37+
* @brief 判断类型是否可以使用dynamic_cast进行转换的辅助模板
38+
*/
39+
template <typename TFrom, typename TTo, typename = void>
40+
struct _IsDynamicCastable : std::false_type {
41+
};
42+
43+
/**
44+
* @brief _IsDynamicCastable模板特化
45+
*/
46+
template <typename TFrom, typename TTo>
47+
struct _IsDynamicCastable<
48+
TFrom, TTo, decltype(void(dynamic_cast<TTo>(std::declval<TFrom>())))> : std::true_type {
49+
};
50+
}

sw/inc/Macros.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,13 @@
193193
static auto _Get_##propname(T &self) \
194194
-> typename std::enable_if<sw::_IsProperty<U>::value, typename U::TValue>::type \
195195
{ \
196-
return self.##expr.Get(); \
196+
return (self.##expr).Get(); \
197197
} \
198198
template <typename T, typename U = decltype(expr)> \
199199
static auto _Get_##propname(T &self) \
200200
-> typename std::enable_if<!sw::_IsProperty<U>::value, U>::type \
201201
{ \
202-
return self.##expr; \
202+
return (self.##expr); \
203203
}
204204

205205
/**
@@ -210,13 +210,13 @@
210210
static auto _Set_##propname(T &self, U &&value) \
211211
-> typename std::enable_if<sw::_IsProperty<V>::value>::type \
212212
{ \
213-
self.##expr.Set(std::forward<U>(value)); \
213+
(self.##expr).Set(std::forward<U>(value)); \
214214
} \
215215
template <typename T, typename U, typename V = decltype(expr)> \
216216
static auto _Set_##propname(T &self, U &&value) \
217217
-> typename std::enable_if<!sw::_IsProperty<V>::value>::type \
218218
{ \
219-
self.##expr = std::forward<U>(value); \
219+
(self.##expr) = std::forward<U>(value); \
220220
}
221221

222222
/*================================================================================*/
@@ -282,32 +282,32 @@
282282
static auto _Set_##name(T &self, U &&value) \
283283
-> typename std::enable_if<sw::_IsProperty<V>::value && sw::_EqOperationHelper<U, U>::value>::type \
284284
{ \
285-
if (!(self.##expr.Get() == value)) { \
286-
self.##expr.Set(std::forward<U>(value)); \
285+
if (!((self.##expr).Get() == value)) { \
286+
(self.##expr).Set(std::forward<U>(value)); \
287287
if (self.PropertyChanged) self.PropertyChanged(self, sw::Reflection::GetFieldId(&T::##name)); \
288288
} \
289289
} \
290290
template <typename T, typename U, typename V = decltype(expr)> \
291291
static auto _Set_##name(T &self, U &&value) \
292292
-> typename std::enable_if<sw::_IsProperty<V>::value && !sw::_EqOperationHelper<U, U>::value>::type \
293293
{ \
294-
self.##expr.Set(std::forward<U>(value)); \
294+
(self.##expr).Set(std::forward<U>(value)); \
295295
if (self.PropertyChanged) self.PropertyChanged(self, sw::Reflection::GetFieldId(&T::##name)); \
296296
} \
297297
template <typename T, typename U, typename V = decltype(expr)> \
298298
static auto _Set_##name(T &self, U &&value) \
299299
-> typename std::enable_if<!sw::_IsProperty<V>::value && sw::_EqOperationHelper<U, U>::value>::type \
300300
{ \
301-
if (!(self.##expr == value)) { \
302-
self.##expr = std::forward<U>(value); \
301+
if (!((self.##expr) == value)) { \
302+
(self.##expr) = std::forward<U>(value); \
303303
if (self.PropertyChanged) self.PropertyChanged(self, sw::Reflection::GetFieldId(&T::##name)); \
304304
} \
305305
} \
306306
template <typename T, typename U, typename V = decltype(expr)> \
307307
static auto _Set_##name(T &self, U &&value) \
308308
-> typename std::enable_if<!sw::_IsProperty<V>::value && !sw::_EqOperationHelper<U, U>::value>::type \
309309
{ \
310-
self.##expr = std::forward<U>(value); \
310+
(self.##expr) = std::forward<U>(value); \
311311
if (self.PropertyChanged) self.PropertyChanged(self, sw::Reflection::GetFieldId(&T::##name)); \
312312
} \
313313
sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)> name \

sw/inc/MenuItem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace sw
2020
/**
2121
* @brief 菜单项
2222
*/
23-
class MenuItem : public ITag
23+
class MenuItem : public ITag<uint64_t>
2424
{
2525
public:
2626
/**

sw/inc/Property.h

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "Internal.h"
34
#include <cassert>
45
#include <cstddef>
56
#include <cstdint>
@@ -156,21 +157,6 @@ namespace sw
156157
using type = decltype(std::declval<T>()[std::declval<U>()]);
157158
};
158159

159-
/**
160-
* @brief 判断类型是否可以显式转换的辅助模板
161-
*/
162-
template <typename TFrom, typename TTo, typename = void>
163-
struct _IsExplicitlyConvertable : std::false_type {
164-
};
165-
166-
/**
167-
* @brief _IsExplicitlyConvertable模板特化
168-
*/
169-
template <typename TFrom, typename TTo>
170-
struct _IsExplicitlyConvertable<
171-
TFrom, TTo, decltype(void(static_cast<TTo>(std::declval<TFrom>())))> : std::true_type {
172-
};
173-
174160
/**
175161
* @brief 判断类型是否有operator->的辅助模板
176162
*/
@@ -187,21 +173,11 @@ namespace sw
187173
using type = decltype(std::declval<T>().operator->());
188174
};
189175

190-
/**
191-
* @brief 属性setter参数类型辅助模板
192-
*/
193-
template <typename T>
194-
struct _PropertySetterParamTypeHelper {
195-
using type = typename std::conditional<
196-
std::is_scalar<T>::value, T, const T &>::type;
197-
};
198-
199176
/**
200177
* @brief 属性setter参数类型
201178
*/
202179
template <typename T>
203-
using _PropertySetterParamType =
204-
typename _PropertySetterParamTypeHelper<typename std::decay<T>::type>::type;
180+
using _PropertySetterParamType = _OptimalParamType<T>;
205181

206182
/*================================================================================*/
207183

0 commit comments

Comments
 (0)