forked from suyu/suyu
common/parent_of_member: Replace TYPED_STORAGE define with template alias
Provides the same construct, but makes it obey namespacing.
This commit is contained in:
parent
eb3cb54aa5
commit
703c57a119
2 changed files with 11 additions and 9 deletions
|
@ -533,7 +533,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr TYPED_STORAGE(Derived) DerivedStorage = {};
|
static constexpr TypedStorage<Derived> DerivedStorage = {};
|
||||||
static_assert(GetParent(GetNode(GetPointer(DerivedStorage))) == GetPointer(DerivedStorage));
|
static_assert(GetParent(GetNode(GetPointer(DerivedStorage))) == GetPointer(DerivedStorage));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -549,7 +549,7 @@ public:
|
||||||
using TreeTypeImpl = impl::IntrusiveRedBlackTreeImpl;
|
using TreeTypeImpl = impl::IntrusiveRedBlackTreeImpl;
|
||||||
|
|
||||||
static constexpr bool IsValid() {
|
static constexpr bool IsValid() {
|
||||||
TYPED_STORAGE(Derived) DerivedStorage = {};
|
TypedStorage<Derived> DerivedStorage = {};
|
||||||
return GetParent(GetNode(GetPointer(DerivedStorage))) == GetPointer(DerivedStorage);
|
return GetParent(GetNode(GetPointer(DerivedStorage))) == GetPointer(DerivedStorage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,21 +10,23 @@
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
namespace detail {
|
||||||
template <typename T, size_t Size, size_t Align>
|
template <typename T, size_t Size, size_t Align>
|
||||||
struct TypedStorage {
|
struct TypedStorageImpl {
|
||||||
std::aligned_storage_t<Size, Align> storage_;
|
std::aligned_storage_t<Size, Align> storage_;
|
||||||
};
|
};
|
||||||
|
} // namespace detail
|
||||||
#define TYPED_STORAGE(...) TypedStorage<__VA_ARGS__, sizeof(__VA_ARGS__), alignof(__VA_ARGS__)>
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static constexpr T* GetPointer(TYPED_STORAGE(T) & ts) {
|
using TypedStorage = detail::TypedStorageImpl<T, sizeof(T), alignof(T)>;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static constexpr T* GetPointer(TypedStorage<T>& ts) {
|
||||||
return static_cast<T*>(static_cast<void*>(std::addressof(ts.storage_)));
|
return static_cast<T*>(static_cast<void*>(std::addressof(ts.storage_)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static constexpr const T* GetPointer(const TYPED_STORAGE(T) & ts) {
|
static constexpr const T* GetPointer(const TypedStorage<T>& ts) {
|
||||||
return static_cast<const T*>(static_cast<const void*>(std::addressof(ts.storage_)));
|
return static_cast<const T*>(static_cast<const void*>(std::addressof(ts.storage_)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,7 +74,7 @@ struct OffsetOfCalculator {
|
||||||
union Union {
|
union Union {
|
||||||
char c{};
|
char c{};
|
||||||
UnionHolder first_union;
|
UnionHolder first_union;
|
||||||
TYPED_STORAGE(ParentType) parent;
|
TypedStorage<ParentType> parent;
|
||||||
|
|
||||||
constexpr Union() : c() {}
|
constexpr Union() : c() {}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue