summaryrefslogtreecommitdiff
path: root/gi/arg-inl.h
diff options
context:
space:
mode:
authorMarco Trevisan (TreviƱo) <mail@3v1n0.net>2020-08-09 01:47:49 +0200
committerPhilip Chimento <philip.chimento@gmail.com>2020-08-09 10:47:35 -0700
commit030c20346add7f17a1d17e246d86de80e3c15d2f (patch)
treeda70c529fe1c3656a79bf5307c718987ed1981bb /gi/arg-inl.h
parentce48c3044f72f137dc172eb811050ef546aabc2f (diff)
downloadgjs-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.h34
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