Skip to content

Commit 4ff57ab

Browse files
ZXShadyChrisThrasher
authored andcommitted
Use variable templates
1 parent dde8220 commit 4ff57ab

6 files changed

+32
-37
lines changed

src/catch2/benchmark/catch_benchmark.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ namespace Catch {
9797
}
9898

9999
// sets lambda to be used in fun *and* executes benchmark!
100-
template <typename Fun, std::enable_if_t<!Detail::is_related<Fun, Benchmark>::value, int> = 0>
100+
template <typename Fun, std::enable_if_t<!Detail::is_related_v<Fun, Benchmark>, int> = 0>
101101
Benchmark & operator=(Fun func) {
102102
auto const* cfg = getCurrentContext().getConfig();
103103
if (!cfg->skipBenchmarks()) {

src/catch2/benchmark/detail/catch_benchmark_function.hpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ namespace Catch {
2121
namespace Benchmark {
2222
namespace Detail {
2323
template <typename T, typename U>
24-
struct is_related
25-
: std::is_same<std::decay_t<T>, std::decay_t<U>> {};
24+
static constexpr bool is_related_v = std::is_same<std::decay_t<T>, std::decay_t<U>>::value;
2625

2726
/// We need to reinvent std::function because every piece of code that might add overhead
2827
/// in a measurement context needs to have consistent performance characteristics so that we
@@ -63,7 +62,7 @@ namespace Catch {
6362
BenchmarkFunction();
6463

6564
template <typename Fun,
66-
std::enable_if_t<!is_related<Fun, BenchmarkFunction>::value, int> = 0>
65+
std::enable_if_t<!is_related_v<Fun, BenchmarkFunction>, int> = 0>
6766
BenchmarkFunction(Fun&& fun)
6867
: f(new model<std::decay_t<Fun>>(CATCH_FORWARD(fun))) {}
6968

src/catch2/catch_tostring.hpp

+10-14
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,14 @@ namespace Catch {
6464
return rawMemoryToString( &object, sizeof(object) );
6565
}
6666

67-
template<typename T>
68-
class IsStreamInsertable {
69-
template<typename Stream, typename U>
70-
static auto test(int)
71-
-> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type());
72-
73-
template<typename, typename>
74-
static auto test(...)->std::false_type;
67+
template<typename T,typename = void>
68+
static constexpr bool IsStreamInsertable_v = false;
7569

76-
public:
77-
static const bool value = decltype(test<std::ostream, const T&>(0))::value;
78-
};
70+
template <typename T>
71+
static constexpr bool IsStreamInsertable_v<
72+
T,
73+
decltype( void( std::declval<std::ostream&>() << std::declval<T>() ) )> =
74+
true;
7975

8076
template<typename E>
8177
std::string convertUnknownEnumToString( E e );
@@ -120,7 +116,7 @@ namespace Catch {
120116
struct StringMaker {
121117
template <typename Fake = T>
122118
static
123-
std::enable_if_t<::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>
119+
std::enable_if_t<::Catch::Detail::IsStreamInsertable_v<Fake>, std::string>
124120
convert(const Fake& value) {
125121
ReusableStringStream rss;
126122
// NB: call using the function-like syntax to avoid ambiguity with
@@ -131,7 +127,7 @@ namespace Catch {
131127

132128
template <typename Fake = T>
133129
static
134-
std::enable_if_t<!::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>
130+
std::enable_if_t<!::Catch::Detail::IsStreamInsertable_v<Fake>, std::string>
135131
convert( const Fake& value ) {
136132
#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)
137133
return Detail::convertUnstreamable(value);
@@ -523,7 +519,7 @@ namespace Catch {
523519
}
524520

525521
template<typename R>
526-
struct StringMaker<R, std::enable_if_t<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>> {
522+
struct StringMaker<R, std::enable_if_t<is_range<R>::value && !::Catch::Detail::IsStreamInsertable_v<R>>> {
527523
static std::string convert( R const& range ) {
528524
return rangeToString( range );
529525
}

src/catch2/matchers/catch_matchers_container_properties.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ namespace Catch {
7979
//! Creates a matcher that accepts ranges/containers with specific size
8080
HasSizeMatcher SizeIs(std::size_t sz);
8181
template <typename Matcher>
82-
std::enable_if_t<Detail::is_matcher<Matcher>::value,
82+
std::enable_if_t<Detail::is_matcher_v<Matcher>,
8383
SizeMatchesMatcher<Matcher>> SizeIs(Matcher&& m) {
8484
return SizeMatchesMatcher<Matcher>{CATCH_FORWARD(m)};
8585
}

src/catch2/matchers/catch_matchers_contains.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@ namespace Catch {
7373
* Uses `std::equal_to` to do the comparison
7474
*/
7575
template <typename T>
76-
std::enable_if_t<!Detail::is_matcher<T>::value,
76+
std::enable_if_t<!Detail::is_matcher_v<T>,
7777
ContainsElementMatcher<T, std::equal_to<>>> Contains(T&& elem) {
7878
return { CATCH_FORWARD(elem), std::equal_to<>{} };
7979
}
8080

8181
//! Creates a matcher that checks whether a range contains element matching a matcher
8282
template <typename Matcher>
83-
std::enable_if_t<Detail::is_matcher<Matcher>::value,
83+
std::enable_if_t<Detail::is_matcher_v<Matcher>,
8484
ContainsMatcherMatcher<Matcher>> Contains(Matcher&& matcher) {
8585
return { CATCH_FORWARD(matcher) };
8686
}

src/catch2/matchers/catch_matchers_templated.hpp

+16-16
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,19 @@ namespace Matchers {
5858
}
5959

6060
template<typename T>
61-
using is_generic_matcher = std::is_base_of<
61+
static constexpr bool is_generic_matcher_v = std::is_base_of<
6262
Catch::Matchers::MatcherGenericBase,
6363
std::remove_cv_t<std::remove_reference_t<T>>
64-
>;
64+
>::value;
6565

6666
template<typename... Ts>
67-
using are_generic_matchers = Catch::Detail::conjunction<is_generic_matcher<Ts>...>;
67+
static constexpr bool are_generic_matchers_v = Catch::Detail::conjunction<std::integral_constant<bool,is_generic_matcher_v<Ts>>...>::value;
6868

6969
template<typename T>
70-
using is_matcher = std::is_base_of<
70+
static constexpr bool is_matcher_v = std::is_base_of<
7171
Catch::Matchers::MatcherUntypedBase,
7272
std::remove_cv_t<std::remove_reference_t<T>>
73-
>;
73+
>::value;
7474

7575

7676
template<std::size_t N, typename Arg>
@@ -143,7 +143,7 @@ namespace Matchers {
143143

144144
//! Avoids type nesting for `GenericAllOf && some matcher` case
145145
template<typename MatcherRHS>
146-
friend std::enable_if_t<is_matcher<MatcherRHS>::value,
146+
friend std::enable_if_t<is_matcher_v<MatcherRHS>,
147147
MatchAllOfGeneric<MatcherTs..., MatcherRHS>> operator && (
148148
MatchAllOfGeneric<MatcherTs...>&& lhs,
149149
MatcherRHS const& rhs) {
@@ -152,7 +152,7 @@ namespace Matchers {
152152

153153
//! Avoids type nesting for `some matcher && GenericAllOf` case
154154
template<typename MatcherLHS>
155-
friend std::enable_if_t<is_matcher<MatcherLHS>::value,
155+
friend std::enable_if_t<is_matcher_v<MatcherLHS>,
156156
MatchAllOfGeneric<MatcherLHS, MatcherTs...>> operator && (
157157
MatcherLHS const& lhs,
158158
MatchAllOfGeneric<MatcherTs...>&& rhs) {
@@ -197,7 +197,7 @@ namespace Matchers {
197197

198198
//! Avoids type nesting for `GenericAnyOf || some matcher` case
199199
template<typename MatcherRHS>
200-
friend std::enable_if_t<is_matcher<MatcherRHS>::value,
200+
friend std::enable_if_t<is_matcher_v<MatcherRHS>,
201201
MatchAnyOfGeneric<MatcherTs..., MatcherRHS>> operator || (
202202
MatchAnyOfGeneric<MatcherTs...>&& lhs,
203203
MatcherRHS const& rhs) {
@@ -206,7 +206,7 @@ namespace Matchers {
206206

207207
//! Avoids type nesting for `some matcher || GenericAnyOf` case
208208
template<typename MatcherLHS>
209-
friend std::enable_if_t<is_matcher<MatcherLHS>::value,
209+
friend std::enable_if_t<is_matcher_v<MatcherLHS>,
210210
MatchAnyOfGeneric<MatcherLHS, MatcherTs...>> operator || (
211211
MatcherLHS const& lhs,
212212
MatchAnyOfGeneric<MatcherTs...>&& rhs) {
@@ -246,46 +246,46 @@ namespace Matchers {
246246

247247
// compose only generic matchers
248248
template<typename MatcherLHS, typename MatcherRHS>
249-
std::enable_if_t<Detail::are_generic_matchers<MatcherLHS, MatcherRHS>::value, Detail::MatchAllOfGeneric<MatcherLHS, MatcherRHS>>
249+
std::enable_if_t<Detail::are_generic_matchers_v<MatcherLHS, MatcherRHS>, Detail::MatchAllOfGeneric<MatcherLHS, MatcherRHS>>
250250
operator && (MatcherLHS const& lhs, MatcherRHS const& rhs) {
251251
return { lhs, rhs };
252252
}
253253

254254
template<typename MatcherLHS, typename MatcherRHS>
255-
std::enable_if_t<Detail::are_generic_matchers<MatcherLHS, MatcherRHS>::value, Detail::MatchAnyOfGeneric<MatcherLHS, MatcherRHS>>
255+
std::enable_if_t<Detail::are_generic_matchers_v<MatcherLHS, MatcherRHS>, Detail::MatchAnyOfGeneric<MatcherLHS, MatcherRHS>>
256256
operator || (MatcherLHS const& lhs, MatcherRHS const& rhs) {
257257
return { lhs, rhs };
258258
}
259259

260260
//! Wrap provided generic matcher in generic negator
261261
template<typename MatcherT>
262-
std::enable_if_t<Detail::is_generic_matcher<MatcherT>::value, Detail::MatchNotOfGeneric<MatcherT>>
262+
std::enable_if_t<Detail::is_generic_matcher_v<MatcherT>, Detail::MatchNotOfGeneric<MatcherT>>
263263
operator ! (MatcherT const& matcher) {
264264
return Detail::MatchNotOfGeneric<MatcherT>{matcher};
265265
}
266266

267267

268268
// compose mixed generic and non-generic matchers
269269
template<typename MatcherLHS, typename ArgRHS>
270-
std::enable_if_t<Detail::is_generic_matcher<MatcherLHS>::value, Detail::MatchAllOfGeneric<MatcherLHS, MatcherBase<ArgRHS>>>
270+
std::enable_if_t<Detail::is_generic_matcher_v<MatcherLHS>, Detail::MatchAllOfGeneric<MatcherLHS, MatcherBase<ArgRHS>>>
271271
operator && (MatcherLHS const& lhs, MatcherBase<ArgRHS> const& rhs) {
272272
return { lhs, rhs };
273273
}
274274

275275
template<typename ArgLHS, typename MatcherRHS>
276-
std::enable_if_t<Detail::is_generic_matcher<MatcherRHS>::value, Detail::MatchAllOfGeneric<MatcherBase<ArgLHS>, MatcherRHS>>
276+
std::enable_if_t<Detail::is_generic_matcher_v<MatcherRHS>, Detail::MatchAllOfGeneric<MatcherBase<ArgLHS>, MatcherRHS>>
277277
operator && (MatcherBase<ArgLHS> const& lhs, MatcherRHS const& rhs) {
278278
return { lhs, rhs };
279279
}
280280

281281
template<typename MatcherLHS, typename ArgRHS>
282-
std::enable_if_t<Detail::is_generic_matcher<MatcherLHS>::value, Detail::MatchAnyOfGeneric<MatcherLHS, MatcherBase<ArgRHS>>>
282+
std::enable_if_t<Detail::is_generic_matcher_v<MatcherLHS>, Detail::MatchAnyOfGeneric<MatcherLHS, MatcherBase<ArgRHS>>>
283283
operator || (MatcherLHS const& lhs, MatcherBase<ArgRHS> const& rhs) {
284284
return { lhs, rhs };
285285
}
286286

287287
template<typename ArgLHS, typename MatcherRHS>
288-
std::enable_if_t<Detail::is_generic_matcher<MatcherRHS>::value, Detail::MatchAnyOfGeneric<MatcherBase<ArgLHS>, MatcherRHS>>
288+
std::enable_if_t<Detail::is_generic_matcher_v<MatcherRHS>, Detail::MatchAnyOfGeneric<MatcherBase<ArgLHS>, MatcherRHS>>
289289
operator || (MatcherBase<ArgLHS> const& lhs, MatcherRHS const& rhs) {
290290
return { lhs, rhs };
291291
}

0 commit comments

Comments
 (0)