diff options
author | Marco Trevisan (TreviƱo) <mail@3v1n0.net> | 2020-08-09 01:47:49 +0200 |
---|---|---|
committer | Philip Chimento <philip.chimento@gmail.com> | 2020-08-09 10:47:35 -0700 |
commit | 030c20346add7f17a1d17e246d86de80e3c15d2f (patch) | |
tree | da70c529fe1c3656a79bf5307c718987ed1981bb /gi/arg-inl.h | |
parent | ce48c3044f72f137dc172eb811050ef546aabc2f (diff) | |
download | gjs-030c20346add7f17a1d17e246d86de80e3c15d2f.tar.gz |
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
Diffstat (limited to 'gi/arg-inl.h')
-rw-r--r-- | gi/arg-inl.h | 34 |
1 files 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 |