diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2025-04-24 20:12:26 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2025-04-25 07:43:33 +0200 |
| commit | 95dc7e43a23300b3eacbb7e1e0a9d4f31a8bd5a0 (patch) | |
| tree | 9fedc2fef0f5459f3df38c91f3b6366ffb9d48b3 /adw/include/adwaitamm/helpers | |
| parent | 48eb849abde6c9af75c015a9721c9b337f3a5fd9 (diff) | |
| download | turns-95dc7e43a23300b3eacbb7e1e0a9d4f31a8bd5a0.tar.xz turns-95dc7e43a23300b3eacbb7e1e0a9d4f31a8bd5a0.zip | |
adw: extract class definitions
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()); } }; |
