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 | 2c4e151343828af13b28ec39946b6bf34748c2b3 (patch) | |
| tree | 3572c1e224ad93e51c4a560198732e8f9bac7c99 /include/adwaitamm/helpers/gobj_mixin.hpp | |
| parent | 96ce3ba51c152e854bcc5e7df1c53fe776ca554b (diff) | |
| download | libadwaitamm-2c4e151343828af13b28ec39946b6bf34748c2b3.tar.xz libadwaitamm-2c4e151343828af13b28ec39946b6bf34748c2b3.zip | |
adw: extract class definitions
Diffstat (limited to 'include/adwaitamm/helpers/gobj_mixin.hpp')
| -rw-r--r-- | include/adwaitamm/helpers/gobj_mixin.hpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/include/adwaitamm/helpers/gobj_mixin.hpp b/include/adwaitamm/helpers/gobj_mixin.hpp index fbdaa4e..762136e 100644 --- a/include/adwaitamm/helpers/gobj_mixin.hpp +++ b/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()); } }; |
