8#include <QtCore/qcompilerdetection.h>
27QT_WARNING_DISABLE_GCC(
"-Wnon-template-friend")
32 using MemberPtr =
typename Tag::MemberPtr;
33 friend constexpr MemberPtr get(Tag)
noexcept;
36template<
typename Tag,
typename Tag::MemberPtr Ptr>
39 friend constexpr typename Tag::MemberPtr get(Tag)
noexcept {
return Ptr; }
44#define D_DECLARE_PRIVATE_MEMBER(TagName, ClassName, Member, MemberType) \
46 using MemberPtr = MemberType ClassName::*; \
47 friend constexpr MemberPtr get(TagName) noexcept; \
49 template struct DtkDeclarativePrivateAccessorImpl<TagName, &ClassName::Member>
51#define D_DECLARE_PRIVATE_METHOD(TagName, ClassName, MethodName, RetType, ...) \
53 using MemberPtr = RetType (ClassName::*)(__VA_ARGS__); \
54 friend constexpr MemberPtr get(TagName) noexcept; \
56 template struct DtkDeclarativePrivateAccessorImpl<TagName, &ClassName::MethodName>
58#define D_DECLARE_PRIVATE_CONST_METHOD(TagName, ClassName, MethodName, RetType, ...) \
60 using MemberPtr = RetType (ClassName::*)(__VA_ARGS__) const; \
61 friend constexpr MemberPtr get(TagName) noexcept; \
63 template struct DtkDeclarativePrivateAccessorImpl<TagName, &ClassName::MethodName>
65#define D_DECLARE_PRIVATE_BITFIELD(TagName, ClassName, PrevMember, PrevMemberType, BfStorageType) \
67 using MemberPtr = PrevMemberType ClassName::*; \
68 friend constexpr MemberPtr get(TagName) noexcept; \
70 template struct DtkDeclarativePrivateAccessorImpl<TagName, &ClassName::PrevMember>; \
71 struct TagName##_bf_layout_mirror { PrevMemberType prev; BfStorageType storage; }; \
72 struct TagName##_Bits { \
73 static constexpr std::size_t kOffset = \
74 __builtin_offsetof(TagName##_bf_layout_mirror, storage) - \
75 __builtin_offsetof(TagName##_bf_layout_mirror, prev); \
76 static BfStorageType *storagePtr(ClassName *obj) noexcept { \
77 PrevMemberType &prev_ref = (*obj).*get(TagName{}); \
78 return reinterpret_cast<BfStorageType*>( \
79 reinterpret_cast<char *>(&prev_ref) + kOffset); \
81 static const BfStorageType *storagePtr(const ClassName *obj) noexcept { \
82 return storagePtr(const_cast<ClassName *>(obj)); \
84 static bool getBit(const ClassName *obj, unsigned bit) noexcept { \
85 return (*storagePtr(obj) >> bit) & BfStorageType{1}; \
87 static void setBit(ClassName *obj, unsigned bit, bool val) noexcept { \
88 BfStorageType *p = storagePtr(obj); \
89 if (val) *p |= (BfStorageType{1} << bit); \
90 else *p &= ~(BfStorageType{1} << bit); \
96namespace dtk_private_detail {
97 template<
typename Tag>
98 inline typename Tag::MemberPtr access(Tag t)
noexcept {
return get(t); }
101#define D_PRIVATE_MEMBER(obj, tag) ((obj).*dtk_private_detail::access(tag))
102#define D_PRIVATE_CALL(obj, tag, ...) ((obj).*dtk_private_detail::access(tag))(__VA_ARGS__)
103#define D_PRIVATE_BF_GET(obj, TagName, bit_pos) \
104 TagName##_Bits::getBit(&(obj), (bit_pos))
105#define D_PRIVATE_BF_SET(obj, TagName, bit_pos, val) \
106 TagName##_Bits::setBit(&(obj), (bit_pos), (val))
Definition dprivateaccessor_p.h:38
Definition dprivateaccessor_p.h:31