mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
util: faster constexpr offsetof calc, at the cost of standards compliance
This commit is contained in:
parent
a6e3a93c07
commit
b8072b1398
1 changed files with 84 additions and 66 deletions
|
@ -23,6 +23,10 @@ namespace ams::util {
|
||||||
|
|
||||||
namespace impl {
|
namespace impl {
|
||||||
|
|
||||||
|
#define AMS_UTIL_OFFSET_OF_STANDARD_COMPLIANT 0
|
||||||
|
|
||||||
|
#if AMS_UTIL_OFFSET_OF_STANDARD_COMPLIANT
|
||||||
|
|
||||||
template<size_t MaxDepth>
|
template<size_t MaxDepth>
|
||||||
struct OffsetOfUnionHolder {
|
struct OffsetOfUnionHolder {
|
||||||
template<typename ParentType, typename MemberType, size_t Offset>
|
template<typename ParentType, typename MemberType, size_t Offset>
|
||||||
|
@ -101,6 +105,20 @@ namespace ams::util {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
template<typename ParentType, typename MemberType>
|
||||||
|
struct OffsetOfCalculator {
|
||||||
|
static constexpr std::ptrdiff_t OffsetOf(MemberType ParentType::*member) {
|
||||||
|
constexpr TYPED_STORAGE(ParentType) Holder = {};
|
||||||
|
const auto *parent = GetPointer(Holder);
|
||||||
|
const auto *target = std::addressof(parent->*member);
|
||||||
|
return static_cast<const uint8_t *>(static_cast<const void *>(target)) - static_cast<const uint8_t *>(static_cast<const void *>(parent));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct GetMemberPointerTraits;
|
struct GetMemberPointerTraits;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue