[gjs] arg: Use if constexpr instead of std::enable_if when possible



commit 030c20346add7f17a1d17e246d86de80e3c15d2f
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Sun Aug 9 01:47:49 2020 +0200

    arg: Use if constexpr instead of std::enable_if when possible
    
    We have some dual codepaths that can be simplified using constexpr
    checks instead of using enable_if specializations that may be harder to
    debug

 gi/arg-inl.h | 34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)
---
diff --git a/gi/arg-inl.h b/gi/arg-inl.h
index e6492ee5..9c3cb8ca 100644
--- a/gi/arg-inl.h
+++ b/gi/arg-inl.h
@@ -168,17 +168,14 @@ gjs_arg_member<unsigned, GI_TYPE_TAG_INTERFACE>(GIArgument* arg) {
 }
 
 template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID>
-inline std::enable_if_t<!std::is_pointer_v<T>> gjs_arg_set(GIArgument* arg,
-                                                           T v) {
-    gjs_arg_member<T, TAG>(arg) = v;
-}
-
-template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID>
-inline std::enable_if_t<std::is_pointer_v<T>> gjs_arg_set(GIArgument* arg,
-                                                          T v) {
-    using NonconstPtrT =
-        std::add_pointer_t<std::remove_const_t<std::remove_pointer_t<T>>>;
-    gjs_arg_member<NonconstPtrT, TAG>(arg) = const_cast<NonconstPtrT>(v);
+inline void gjs_arg_set(GIArgument* arg, T v) {
+    if constexpr (std::is_pointer_v<T>) {
+        using NonconstPtrT =
+            std::add_pointer_t<std::remove_const_t<std::remove_pointer_t<T>>>;
+        gjs_arg_member<NonconstPtrT, TAG>(arg) = const_cast<NonconstPtrT>(v);
+    } else {
+        gjs_arg_member<T, TAG>(arg) = v;
+    }
 }
 
 // Store function pointers as void*. It is a requirement of GLib that your
@@ -222,19 +219,16 @@ template <>
 }
 
 template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID>
-[[nodiscard]] inline std::enable_if_t<std::is_integral_v<T>, void*>
-gjs_arg_get_as_pointer(GIArgument* arg) {
+[[nodiscard]] inline void* gjs_arg_get_as_pointer(GIArgument* arg) {
     return gjs_int_to_pointer(gjs_arg_get<T, TAG>(arg));
 }
 
 template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID>
-inline std::enable_if_t<!std::is_pointer_v<T>> gjs_arg_unset(GIArgument* arg) {
-    gjs_arg_set<T, TAG>(arg, static_cast<T>(0));
-}
-
-template <typename T, GITypeTag TAG = GI_TYPE_TAG_VOID>
-inline std::enable_if_t<std::is_pointer_v<T>> gjs_arg_unset(GIArgument* arg) {
-    gjs_arg_set<T, TAG>(arg, nullptr);
+inline void gjs_arg_unset(GIArgument* arg) {
+    if constexpr (std::is_pointer_v<T>)
+        gjs_arg_set<T, TAG>(arg, nullptr);
+    else
+        gjs_arg_set<T, TAG>(arg, static_cast<T>(0));
 }
 
 // Implementation to store rounded (u)int64_t numbers into double


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]