forked from ShuriZma/suyu
common: parent_of_member: Fix build for OffsetOf().
This commit is contained in:
parent
27a6ef64fd
commit
e02785be83
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue