@@ -9,16 +9,6 @@ namespace rpp {
99
1010namespace 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-
2212template <typename T>
2313struct 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+
152162template <typename T>
153163struct 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+
237252template <typename T>
238253struct Decay <T&> {
239254 using type = typename Decay<T>::type;
@@ -433,10 +448,10 @@ template<typename T>
433448concept Float = detail::Is_Float<T>::value;
434449
435450template <typename T>
436- concept Not_Void = ! detail::Is_Void <T>::value;
451+ concept Const = detail::Is_Const <T>::value;
437452
438453template <typename T>
439- concept Const = detail::Is_Const <T>::value;
454+ concept Volatile = detail::Is_Volatile <T>::value;
440455
441456template <typename T>
442457concept Pointer = detail::Is_Pointer<T>::value;
@@ -450,6 +465,9 @@ concept Lvalue_Reference = detail::Is_Lvalue_Reference<T>::value;
450465template <typename T>
451466concept 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+
453471template <typename T>
454472concept Not_Function = detail::Is_Const<const T>::value || detail::Is_Reference<T>::value;
455473
@@ -570,6 +588,9 @@ using With_Rvalue_Ref = T&&;
570588template <typename T>
571589using Without_Const = typename detail::Remove_Const<T>::type;
572590
591+ template <typename T>
592+ using Without_Volatile = typename detail::Remove_Volatile<T>::type;
593+
573594template <typename T = void >
574595struct Empty {};
575596
0 commit comments