summaryrefslogtreecommitdiff
path: root/adw/include/adwaitamm/helpers
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2025-04-24 20:12:26 +0200
committerFelix Morgner <felix.morgner@gmail.com>2025-04-25 07:43:33 +0200
commit95dc7e43a23300b3eacbb7e1e0a9d4f31a8bd5a0 (patch)
tree9fedc2fef0f5459f3df38c91f3b6366ffb9d48b3 /adw/include/adwaitamm/helpers
parent48eb849abde6c9af75c015a9721c9b337f3a5fd9 (diff)
downloadturns-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.hpp32
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());
}
};