Skip to content

Commit de4bf7c

Browse files
authored
refactor: use concepts instead of SFINAE (#1652)
1 parent aeb3154 commit de4bf7c

File tree

13 files changed

+71
-70
lines changed

13 files changed

+71
-70
lines changed

src/Cafe/GameProfile/GameProfile.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ bool gameProfile_loadIntegerOption(IniParser* iniParser, const char* optionName,
106106
template <typename T>
107107
bool gameProfile_loadIntegerOption(IniParser& iniParser, const char* optionName, T& option, T minVal, T maxVal)
108108
{
109-
static_assert(std::is_integral<T>::value);
109+
static_assert(std::is_integral_v<T>);
110110
auto option_value = iniParser.FindOption(optionName);
111111
if (!option_value)
112112
return false;
@@ -133,7 +133,7 @@ bool gameProfile_loadIntegerOption(IniParser& iniParser, const char* optionName,
133133
template<typename T>
134134
bool gameProfile_loadEnumOption(IniParser& iniParser, const char* optionName, T& option)
135135
{
136-
static_assert(std::is_enum<T>::value);
136+
static_assert(std::is_enum_v<T>);
137137
auto option_value = iniParser.FindOption(optionName);
138138
if (!option_value)
139139
return false;
@@ -366,4 +366,4 @@ void GameProfile::Reset()
366366
// controller settings
367367
for (auto& profile : m_controllerProfile)
368368
profile.reset();
369-
}
369+
}

src/Cafe/HW/Latte/Core/LatteBufferCache.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class IntervalTree2
2525
// static TNodeObject* Split(TNodeObject* nodeObject, TRangeData firstRangeBegin, TRangeData firstRangeEnd, TRangeData secondRangeBegin, TRangeData secondRangeEnd)
2626
// Cut a hole into an existing range and split it in two. Should return the newly created node object after the hole
2727

28-
static_assert(std::is_pointer<TNodeObject>::value == false, "TNodeObject must be a non-pointer type");
28+
static_assert(!std::is_pointer_v<TNodeObject>, "TNodeObject must be a non-pointer type");
2929

3030
struct InternalRange
3131
{

src/Cafe/OS/common/OSUtil.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,14 @@ void cafeExportCallWrapper(PPCInterpreter_t* hCPU)
176176
if(cemuLog_advancedPPCLoggingEnabled())
177177
{
178178
MPTR threadMPTR = memory_getVirtualOffsetFromPointer(coreinit::OSGetCurrentThread());
179-
if constexpr (std::tuple_size<decltype(format_tup)>::value > 0)
179+
if constexpr (std::tuple_size_v<decltype(format_tup)> > 0)
180180
shouldLog = cemuLog_log(TLogType, "{}.{}{} # LR: {:#x} | Thread: {:#x}", TNames::GetLib(), TNames::GetFunc(), format_tup, hCPU->spr.LR, threadMPTR);
181181
else
182182
shouldLog = cemuLog_log(TLogType, "{}.{}() # LR: {:#x} | Thread: {:#x}", TNames::GetLib(), TNames::GetFunc(), hCPU->spr.LR, threadMPTR);
183183
}
184184
else
185185
{
186-
if constexpr (std::tuple_size<decltype(format_tup)>::value > 0)
186+
if constexpr (std::tuple_size_v<decltype(format_tup)> > 0)
187187
{
188188
shouldLog = cemuLog_log(TLogType, "{}.{}{}", TNames::GetLib(), TNames::GetFunc(), format_tup);
189189
}
@@ -192,7 +192,7 @@ void cafeExportCallWrapper(PPCInterpreter_t* hCPU)
192192
}
193193
}
194194

195-
if constexpr (!std::is_void<decltype(std::apply(fn, tup))>::value)
195+
if constexpr (!std::is_void_v<decltype(std::apply(fn, tup))>)
196196
{
197197
// has non-void return type
198198
decltype(auto) result = std::apply(fn, tup);
@@ -241,4 +241,4 @@ MPTR makeCallableExport()
241241
return PPCInterpreter_makeCallableExportDepr(&cafeExportCallWrapper<fn, "CALLABLE_EXPORT">);
242242
}
243243

244-
void osLib_addVirtualPointer(const char* libraryName, const char* functionName, uint32 vPtr);
244+
void osLib_addVirtualPointer(const char* libraryName, const char* functionName, uint32 vPtr);

src/Cafe/OS/libs/gx2/GX2_Command.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ inline void gx2WriteGather_submit_(uint32 coreIndex, uint32be* writePtr, const b
3939
}
4040

4141
template <typename T, typename ...Targs>
42+
requires std::is_floating_point_v<T>
4243
inline
43-
typename std::enable_if< std::is_floating_point<T>::value, void>::type
44-
gx2WriteGather_submit_(uint32 coreIndex, uint32be* writePtr, const T& arg, Targs... args)
44+
void gx2WriteGather_submit_(uint32 coreIndex, uint32be* writePtr, const T& arg, Targs... args)
4545
{
4646
static_assert(sizeof(T) == sizeof(uint32));
4747
*writePtr = *(uint32*)&arg;
@@ -50,9 +50,9 @@ gx2WriteGather_submit_(uint32 coreIndex, uint32be* writePtr, const T& arg, Targs
5050
}
5151

5252
template <typename T, typename ...Targs>
53+
requires std::is_base_of_v<Latte::LATTEREG, T>
5354
inline
54-
typename std::enable_if< std::is_base_of<Latte::LATTEREG, T>::value, void>::type
55-
gx2WriteGather_submit_(uint32 coreIndex, uint32be* writePtr, const T& arg, Targs... args)
55+
void gx2WriteGather_submit_(uint32 coreIndex, uint32be* writePtr, const T& arg, Targs... args)
5656
{
5757
static_assert(sizeof(Latte::LATTEREG) == sizeof(uint32be));
5858
*writePtr = arg.getRawValue();
@@ -61,9 +61,9 @@ gx2WriteGather_submit_(uint32 coreIndex, uint32be* writePtr, const T& arg, Targs
6161
}
6262

6363
template <typename T, typename ...Targs>
64+
requires (!std::is_base_of_v<Latte::LATTEREG, T>) && (!std::is_floating_point_v<T>)
6465
inline
65-
typename std::enable_if< !std::is_base_of<Latte::LATTEREG, T>::value && !std::is_floating_point<T>::value, void>::type
66-
gx2WriteGather_submit_(uint32 coreIndex, uint32be* writePtr, const T& arg, Targs... args)
66+
void gx2WriteGather_submit_(uint32 coreIndex, uint32be* writePtr, const T& arg, Targs... args)
6767
{
6868
*writePtr = arg;
6969
writePtr++;
@@ -105,4 +105,4 @@ namespace GX2
105105
void GX2Init_commandBufferPool(void* bufferBase, uint32 bufferSize);
106106
void GX2Shutdown_commandBufferPool();
107107
void GX2CommandResetToDefaultState();
108-
}
108+
}

src/Cemu/ExpressionParser/ExpressionParser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class TExpressionParser
3737
template<typename T>
3838
T Evaluate(std::string_view expression) const
3939
{
40-
static_assert(std::is_arithmetic<T>::value, "type T must be an arithmetic type");
40+
static_assert(std::is_arithmetic_v<T>, "type T must be an arithmetic type");
4141
return (T)Evaluate(expression);
4242
}
4343

src/Common/SysAllocator.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,8 @@ class SysAllocator : public SysAllocatorBase
113113
operator void*() { return m_sysMem->GetPtr(); }
114114

115115
// for all arrays except bool
116-
template<class Q = T>
117-
typename std::enable_if< count != 1 && !std::is_same<Q, bool>::value, Q >::type&
118-
operator[](int index)
116+
T& operator[](int index)
117+
requires(count != 1) && (!std::is_same_v<T, bool>)
119118
{
120119
// return tmp data until we allocated in sys mem
121120
if (m_sysMem.GetMPTR() == 0)
@@ -125,7 +124,7 @@ class SysAllocator : public SysAllocatorBase
125124

126125
return m_sysMem[index];
127126
}
128-
private:
127+
private:
129128
SysAllocator(uint32 memptr)
130129
: m_sysMem(memptr)
131130
{}
@@ -215,4 +214,4 @@ class SysAllocator<T, 1> : public SysAllocatorBase
215214

216215
MEMPTR<T> m_sysMem;
217216
T m_tempData;
218-
};
217+
};

src/Common/betype.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ constexpr T bswap(T i)
2222
template <typename T>
2323
constexpr T SwapEndian(T value)
2424
{
25-
if constexpr (std::is_integral<T>::value)
25+
if constexpr (std::is_integral_v<T>)
2626
{
2727
#ifdef _MSC_VER
2828
if constexpr (sizeof(T) == sizeof(uint32_t))
@@ -33,7 +33,7 @@ constexpr T SwapEndian(T value)
3333

3434
return (T)bswap((std::make_unsigned_t<T>)value);
3535
}
36-
else if constexpr (std::is_floating_point<T>::value)
36+
else if constexpr (std::is_floating_point_v<T>)
3737
{
3838
if constexpr (sizeof(T) == sizeof(uint32_t))
3939
{
@@ -46,18 +46,18 @@ constexpr T SwapEndian(T value)
4646
return *(T*)&tmp;
4747
}
4848
}
49-
else if constexpr (std::is_enum<T>::value)
49+
else if constexpr (std::is_enum_v<T>)
5050
{
5151
return (T)SwapEndian((std::underlying_type_t<T>)value);
5252
}
53-
else if constexpr (std::is_base_of<Latte::LATTEREG, T>::value)
53+
else if constexpr (std::is_base_of_v<Latte::LATTEREG, T>)
5454
{
5555
const auto tmp = bswap<uint32_t>(*(uint32_t*)&value);
5656
return *(T*)&tmp;
5757
}
5858
else
5959
{
60-
static_assert(std::is_integral<T>::value, "unsupported betype specialization!");
60+
static_assert(std::is_integral_v<T>, "unsupported betype specialization!");
6161
}
6262

6363
return value;

src/Common/enumFlags.h

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,63 +10,65 @@ struct EnableBitMaskOperators
1010
};
1111

1212
template<typename TEnum>
13-
typename std::enable_if<EnableBitMaskOperators<TEnum>::enable, TEnum>::type
14-
operator &(TEnum lhs, TEnum rhs)
13+
requires EnableBitMaskOperators<TEnum>::enable
14+
TEnum operator &(TEnum lhs, TEnum rhs)
1515
{
1616
return static_cast<TEnum> (static_cast<typename std::underlying_type<TEnum>::type>(lhs) & static_cast<typename std::underlying_type<TEnum>::type>(rhs));
1717
}
1818

1919
template<typename TEnum>
20-
typename std::enable_if<EnableBitMaskOperators<TEnum>::enable, TEnum>::type
21-
operator |(TEnum lhs, TEnum rhs)
20+
requires EnableBitMaskOperators<TEnum>::enable
21+
TEnum operator |(TEnum lhs, TEnum rhs)
2222
{
2323
return static_cast<TEnum> (static_cast<typename std::underlying_type<TEnum>::type>(lhs) | static_cast<typename std::underlying_type<TEnum>::type>(rhs));
2424
}
2525

2626
template<typename TEnum>
27-
typename std::enable_if<EnableBitMaskOperators<TEnum>::enable, TEnum>::type
28-
operator ^(TEnum lhs, TEnum rhs)
27+
requires EnableBitMaskOperators<TEnum>::enable
28+
TEnum operator ^(TEnum lhs, TEnum rhs)
2929
{
3030
return static_cast<TEnum> (static_cast<typename std::underlying_type<TEnum>::type>(lhs) ^ static_cast<typename std::underlying_type<TEnum>::type>(rhs));
3131
}
3232

3333
template<typename TEnum>
34-
typename std::enable_if<EnableBitMaskOperators<TEnum>::enable, TEnum>::type
35-
operator ~(TEnum rhs)
34+
requires EnableBitMaskOperators<TEnum>::enable
35+
TEnum operator ~(TEnum rhs)
3636
{
3737
return static_cast<TEnum> (~static_cast<typename std::underlying_type<TEnum>::type>(rhs));
3838
}
3939

4040
template<typename TEnum>
41-
typename std::enable_if<EnableBitMaskOperators<TEnum>::enable, TEnum>::type&
42-
operator &=(TEnum& lhs, TEnum rhs)
41+
requires EnableBitMaskOperators<TEnum>::enable
42+
TEnum& operator &=(TEnum& lhs, TEnum rhs)
4343
{
4444
lhs = static_cast<TEnum> (static_cast<typename std::underlying_type<TEnum>::type>(lhs) & static_cast<typename std::underlying_type<TEnum>::type>(rhs));
4545
return lhs;
4646
}
4747

4848
template<typename TEnum>
49-
typename std::enable_if<EnableBitMaskOperators<TEnum>::enable, TEnum>::type&
50-
operator |=(TEnum& lhs, TEnum rhs)
49+
requires EnableBitMaskOperators<TEnum>::enable
50+
TEnum& operator |=(TEnum& lhs, TEnum rhs)
5151
{
5252
lhs = static_cast<TEnum> (static_cast<typename std::underlying_type<TEnum>::type>(lhs) | static_cast<typename std::underlying_type<TEnum>::type>(rhs));
5353
return lhs;
5454
}
5555

5656
template<typename TEnum>
57-
typename std::enable_if<EnableBitMaskOperators<TEnum>::enable, TEnum>::type&
58-
operator ^=(TEnum& lhs, TEnum rhs)
57+
requires EnableBitMaskOperators<TEnum>::enable
58+
TEnum& operator ^=(TEnum& lhs, TEnum rhs)
5959
{
6060
lhs = static_cast<TEnum> (static_cast<typename std::underlying_type<TEnum>::type>(lhs) ^ static_cast<typename std::underlying_type<TEnum>::type>(rhs));
6161
return lhs;
6262
}
6363

64-
template<typename TEnum, typename = std::enable_if_t<EnableBitMaskOperators<TEnum>::enable>>
64+
template<typename TEnum>
65+
requires EnableBitMaskOperators<TEnum>::enable
6566
constexpr bool operator==(TEnum lhs, std::underlying_type_t<TEnum> rhs)
6667
{
6768
return static_cast<std::underlying_type_t<TEnum>>(lhs) == rhs;
6869
}
69-
template<typename TEnum, typename = std::enable_if_t<EnableBitMaskOperators<TEnum>::enable>>
70+
template<typename TEnum>
71+
requires EnableBitMaskOperators<TEnum>::enable
7072
constexpr bool operator!=(TEnum lhs, std::underlying_type_t<TEnum> rhs)
7173
{
7274
return static_cast<std::underlying_type_t<TEnum>>(lhs) != rhs;
@@ -82,43 +84,43 @@ struct EnableEnumIterators
8284
};
8385

8486
template<typename TEnum>
85-
typename std::enable_if<EnableEnumIterators<TEnum>::enable, TEnum>::type&
86-
operator++(TEnum& lhs)
87+
requires EnableEnumIterators<TEnum>::enable
88+
TEnum& operator++(TEnum& lhs)
8789
{
8890
lhs = static_cast<TEnum>(static_cast<typename std::underlying_type<TEnum>::type>(lhs) + 1);
8991
return lhs;
9092
}
9193

9294
template<typename TEnum>
93-
typename std::enable_if<EnableEnumIterators<TEnum>::enable, TEnum>::type
94-
operator*(TEnum rhs)
95+
requires EnableEnumIterators<TEnum>::enable
96+
TEnum operator*(TEnum rhs)
9597
{
9698
return rhs;
9799
}
98100

99101
template<typename TEnum>
100-
typename std::enable_if<EnableEnumIterators<TEnum>::enable, TEnum>::type
101-
begin(TEnum value)
102+
requires EnableEnumIterators<TEnum>::enable
103+
TEnum begin(TEnum value)
102104
{
103105
return EnableEnumIterators<TEnum>::begin;
104106
}
105107

106108
template<typename TEnum>
107-
typename std::enable_if<EnableEnumIterators<TEnum>::enable, TEnum>::type
108-
rbegin(TEnum value)
109+
requires EnableEnumIterators<TEnum>::enable
110+
TEnum rbegin(TEnum value)
109111
{
110112
return EnableEnumIterators<TEnum>::rbegin;
111113
}
112114

113115
template<typename TEnum>
114-
typename std::enable_if<EnableEnumIterators<TEnum>::enable, TEnum>::type
115-
end(TEnum r) {
116+
requires EnableEnumIterators<TEnum>::enable
117+
TEnum end(TEnum r) {
116118
return EnableEnumIterators<TEnum>::end;
117119
}
118120

119121
template<typename TEnum>
120-
typename std::enable_if<EnableEnumIterators<TEnum>::enable, TEnum>::type
121-
rend(TEnum r) {
122+
requires EnableEnumIterators<TEnum>::enable
123+
TEnum rend(TEnum r) {
122124
return EnableEnumIterators<TEnum>::rend;
123125
}
124126

@@ -129,4 +131,4 @@ rend(TEnum r) {
129131
static const x end = static_cast<x>(static_cast<typename std::underlying_type<x>::type>(last_value) + 1);\
130132
static const x rend = static_cast<x>(static_cast<typename std::underlying_type<x>::type>(first_value) - 1);\
131133
};
132-
// todo: rend type must be signed?
134+
// todo: rend type must be signed?

src/Common/precompiled.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,8 @@ struct fmt::formatter<betype<T>> : fmt::formatter<T>
653653
namespace stdx
654654
{
655655
// std::to_underlying
656-
template <typename EnumT, typename = std::enable_if_t < std::is_enum<EnumT>{} >>
656+
template <typename EnumT>
657+
requires (std::is_enum_v<EnumT>)
657658
constexpr std::underlying_type_t<EnumT> to_underlying(EnumT e) noexcept {
658659
return static_cast<std::underlying_type_t<EnumT>>(e);
659660
};
@@ -689,7 +690,7 @@ namespace stdx
689690
template<typename T>
690691
class atomic_ref
691692
{
692-
static_assert(std::is_trivially_copyable<T>::value, "atomic_ref requires trivially copyable types");
693+
static_assert(std::is_trivially_copyable_v<T>, "atomic_ref requires trivially copyable types");
693694
public:
694695
using value_type = T;
695696

src/config/ConfigValue.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,15 @@ class ConfigValueNoneAtomic
9696
m_value = v;
9797
}
9898

99-
template <typename = typename std::enable_if<std::is_same_v<TType, std::string>>>
10099
void SetValue(std::string_view v)
100+
requires std::is_same_v<TType, std::string>
101101
{
102102
std::lock_guard lock(m_mutex);
103103
m_value = v;
104104
}
105105

106-
template <typename = typename std::enable_if<std::is_same_v<TType, std::wstring>>>
107106
void SetValue(std::wstring_view v)
107+
requires std::is_same_v<TType, std::string>
108108
{
109109
std::lock_guard lock(m_mutex);
110110
m_value = v;
@@ -171,22 +171,22 @@ class ConfigValueBounds : public ConfigValue<TType>
171171
}
172172

173173
// init from enum with iterators
174-
template<typename TEnum = typename std::enable_if<std::is_enum<TType>::value && EnableEnumIterators<TType>::enable, TType>>
175174
constexpr ConfigValueBounds()
176-
: base_type(), m_min_value(begin(TEnum{})), m_max_value(rbegin(TEnum{}))
175+
requires std::is_enum_v<TType> && EnableEnumIterators<TType>::enable
176+
: base_type(), m_min_value(begin(TType{})), m_max_value(rbegin(TType{}))
177177
{
178178
assert(m_min_value <= this->GetInitValue() && this->GetInitValue() <= m_max_value);
179179
}
180180

181-
template<typename TEnum = typename std::enable_if<std::is_enum<TType>::value && EnableEnumIterators<TType>::enable, TType>>
182181
constexpr ConfigValueBounds(const TType& init_value)
182+
requires std::is_enum_v<TType> && EnableEnumIterators<TType>::enable
183183
: base_type(std::forward<TType>(init_value)), m_min_value(begin(init_value)), m_max_value(rbegin(init_value))
184184
{
185185
assert(m_min_value <= init_value && init_value <= m_max_value);
186186
}
187187

188-
template<typename TEnum = typename std::enable_if<std::is_enum<TType>::value && EnableEnumIterators<TType>::enable, TType>>
189188
constexpr ConfigValueBounds(TType&& init_value)
189+
requires std::is_enum_v<TType> && EnableEnumIterators<TType>::enable
190190
: base_type(std::forward<TType>(init_value)), m_min_value(begin(init_value)), m_max_value(rbegin(init_value))
191191
{
192192
assert(m_min_value <= init_value && init_value <= m_max_value);

0 commit comments

Comments
 (0)