diff options
Diffstat (limited to 'adw/include/adwaitamm/helpers')
| -rw-r--r-- | adw/include/adwaitamm/helpers/gobj_mixin.hpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/adw/include/adwaitamm/helpers/gobj_mixin.hpp b/adw/include/adwaitamm/helpers/gobj_mixin.hpp index fbdaa4e..762136e 100644 --- a/adw/include/adwaitamm/helpers/gobj_mixin.hpp +++ b/adw/include/adwaitamm/helpers/gobj_mixin.hpp @@ -8,27 +8,35 @@ namespace Adwaita::helpers { - template<typename Type, typename AdwType> + template<typename SourceType, typename TargetType> + struct copy_const + { + using type = TargetType; + }; + + template<typename SourceType, typename TargetType> + struct copy_const<SourceType const, TargetType> + { + using type = std::add_const_t<TargetType>; + }; + + template<typename SourceType, typename TargetType> + using copy_const_t = typename copy_const<SourceType, TargetType>::type; + + template<typename CppType, typename BaseType> struct gobj_mixin { template<typename Self> auto gobj(this Self && self) noexcept { - using clean_type = std::remove_reference_t<Self>; - using gobj_type = std::conditional_t<std::is_const_v<clean_type>, std::add_const_t<Glib::Object>, Glib::Object>; - using cast_type = std::conditional_t<std::is_const_v<clean_type>, std::add_const_t<AdwType>, AdwType>; - - return reinterpret_cast<cast_type *>(static_cast<gobj_type &&>(self).gobj()); + using base_type = copy_const_t<std::remove_reference_t<Self>, BaseType>; + return reinterpret_cast<base_type *>(self.::Glib::Object::gobj()); } template<typename Self> - auto gobj_copy(this Self && self) noexcept -> AdwType * + auto gobj_copy(this Self && self) noexcept { - using clean_type = std::remove_reference_t<Self>; - using gobj_type = std::conditional_t<std::is_const_v<clean_type>, std::add_const_t<Glib::Object>, Glib::Object>; - - static_cast<gobj_type &&>(self).reference(); - return const_cast<AdwType *>(self.gobj()); + return reinterpret_cast<BaseType *>(self.::Glib::Object::gobj_copy()); } }; |
