|
|
@ -133,27 +133,27 @@ template <auto MemberPtr> |
|
|
using GetMemberType = typename GetMemberPointerTraits<decltype(MemberPtr)>::Member; |
|
|
using GetMemberType = typename GetMemberPointerTraits<decltype(MemberPtr)>::Member; |
|
|
|
|
|
|
|
|
template <auto MemberPtr, typename RealParentType = GetParentType<MemberPtr>> |
|
|
template <auto MemberPtr, typename RealParentType = GetParentType<MemberPtr>> |
|
|
static inline std::ptrdiff_t OffsetOf = [] { |
|
|
|
|
|
|
|
|
constexpr std::ptrdiff_t OffsetOf() { |
|
|
using DeducedParentType = GetParentType<MemberPtr>; |
|
|
using DeducedParentType = GetParentType<MemberPtr>; |
|
|
using MemberType = GetMemberType<MemberPtr>; |
|
|
using MemberType = GetMemberType<MemberPtr>; |
|
|
static_assert(std::is_base_of<DeducedParentType, RealParentType>::value || |
|
|
static_assert(std::is_base_of<DeducedParentType, RealParentType>::value || |
|
|
std::is_same<RealParentType, DeducedParentType>::value); |
|
|
std::is_same<RealParentType, DeducedParentType>::value); |
|
|
|
|
|
|
|
|
return OffsetOfCalculator<RealParentType, MemberType>::OffsetOf(MemberPtr); |
|
|
return OffsetOfCalculator<RealParentType, MemberType>::OffsetOf(MemberPtr); |
|
|
}(); |
|
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
} // namespace impl |
|
|
} // namespace impl |
|
|
|
|
|
|
|
|
template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> |
|
|
template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> |
|
|
constexpr RealParentType& GetParentReference(impl::GetMemberType<MemberPtr>* member) { |
|
|
constexpr RealParentType& GetParentReference(impl::GetMemberType<MemberPtr>* member) { |
|
|
std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>; |
|
|
|
|
|
|
|
|
std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>(); |
|
|
return *static_cast<RealParentType*>( |
|
|
return *static_cast<RealParentType*>( |
|
|
static_cast<void*>(static_cast<uint8_t*>(static_cast<void*>(member)) - Offset)); |
|
|
static_cast<void*>(static_cast<uint8_t*>(static_cast<void*>(member)) - Offset)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> |
|
|
template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> |
|
|
constexpr RealParentType const& GetParentReference(impl::GetMemberType<MemberPtr> const* member) { |
|
|
constexpr RealParentType const& GetParentReference(impl::GetMemberType<MemberPtr> const* member) { |
|
|
std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>; |
|
|
|
|
|
|
|
|
std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>(); |
|
|
return *static_cast<const RealParentType*>(static_cast<const void*>( |
|
|
return *static_cast<const RealParentType*>(static_cast<const void*>( |
|
|
static_cast<const uint8_t*>(static_cast<const void*>(member)) - Offset)); |
|
|
static_cast<const uint8_t*>(static_cast<const void*>(member)) - Offset)); |
|
|
} |
|
|
} |
|
|
|