Skip to content

Commit 9eae7ea

Browse files
committed
accout for cv in not_void
1 parent 34d753f commit 9eae7ea

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

rpp/utility.h

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,6 @@ namespace rpp {
99

1010
namespace detail {
1111

12-
template<typename T>
13-
struct Is_Void {
14-
constexpr static bool value = false;
15-
};
16-
17-
template<>
18-
struct Is_Void<void> {
19-
constexpr static bool value = true;
20-
};
21-
2212
template<typename T>
2313
struct Is_Int {
2414
constexpr static bool value = false;
@@ -149,6 +139,26 @@ struct Remove_Const<const T> {
149139
using type = T;
150140
};
151141

142+
template<typename T>
143+
struct Is_Volatile {
144+
constexpr static bool value = false;
145+
};
146+
147+
template<typename T>
148+
struct Is_Volatile<volatile T> {
149+
constexpr static bool value = true;
150+
};
151+
152+
template<typename T>
153+
struct Remove_Volatile {
154+
using type = T;
155+
};
156+
157+
template<typename T>
158+
struct Remove_Volatile<volatile T> {
159+
using type = T;
160+
};
161+
152162
template<typename T>
153163
struct Is_Pointer {
154164
constexpr static bool value = false;
@@ -234,6 +244,11 @@ struct Decay<const T> {
234244
using type = typename Decay<T>::type;
235245
};
236246

247+
template<typename T>
248+
struct Decay<volatile T> {
249+
using type = typename Decay<T>::type;
250+
};
251+
237252
template<typename T>
238253
struct Decay<T&> {
239254
using type = typename Decay<T>::type;
@@ -433,10 +448,10 @@ template<typename T>
433448
concept Float = detail::Is_Float<T>::value;
434449

435450
template<typename T>
436-
concept Not_Void = !detail::Is_Void<T>::value;
451+
concept Const = detail::Is_Const<T>::value;
437452

438453
template<typename T>
439-
concept Const = detail::Is_Const<T>::value;
454+
concept Volatile = detail::Is_Volatile<T>::value;
440455

441456
template<typename T>
442457
concept Pointer = detail::Is_Pointer<T>::value;
@@ -450,6 +465,9 @@ concept Lvalue_Reference = detail::Is_Lvalue_Reference<T>::value;
450465
template<typename T>
451466
concept Rvalue_Reference = detail::Is_Rvalue_Reference<T>::value;
452467

468+
template<typename T>
469+
concept Not_Void = !detail::Is_Same<typename detail::Decay<T>::type, void>::value;
470+
453471
template<typename T>
454472
concept Not_Function = detail::Is_Const<const T>::value || detail::Is_Reference<T>::value;
455473

@@ -570,6 +588,9 @@ using With_Rvalue_Ref = T&&;
570588
template<typename T>
571589
using Without_Const = typename detail::Remove_Const<T>::type;
572590

591+
template<typename T>
592+
using Without_Volatile = typename detail::Remove_Volatile<T>::type;
593+
573594
template<typename T = void>
574595
struct Empty {};
575596

0 commit comments

Comments
 (0)