Browse Source
Merge pull request #5333 from lioncash/define
common/parent_of_member: Replace TYPED_STORAGE define with template alias
pull/15/merge
bunnei
5 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
10 additions and
8 deletions
-
src/common/intrusive_red_black_tree.h
-
src/common/parent_of_member.h
|
|
|
@ -533,7 +533,7 @@ private: |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
static constexpr TYPED_STORAGE(Derived) DerivedStorage = {}; |
|
|
|
static constexpr TypedStorage<Derived> DerivedStorage = {}; |
|
|
|
static_assert(GetParent(GetNode(GetPointer(DerivedStorage))) == GetPointer(DerivedStorage)); |
|
|
|
}; |
|
|
|
|
|
|
|
@ -549,7 +549,7 @@ public: |
|
|
|
using TreeTypeImpl = impl::IntrusiveRedBlackTreeImpl; |
|
|
|
|
|
|
|
static constexpr bool IsValid() { |
|
|
|
TYPED_STORAGE(Derived) DerivedStorage = {}; |
|
|
|
TypedStorage<Derived> DerivedStorage = {}; |
|
|
|
return GetParent(GetNode(GetPointer(DerivedStorage))) == GetPointer(DerivedStorage); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -10,21 +10,23 @@ |
|
|
|
#include "common/common_types.h" |
|
|
|
|
|
|
|
namespace Common { |
|
|
|
|
|
|
|
namespace detail { |
|
|
|
template <typename T, size_t Size, size_t Align> |
|
|
|
struct TypedStorage { |
|
|
|
struct TypedStorageImpl { |
|
|
|
std::aligned_storage_t<Size, Align> storage_; |
|
|
|
}; |
|
|
|
} // namespace detail |
|
|
|
|
|
|
|
#define TYPED_STORAGE(...) TypedStorage<__VA_ARGS__, sizeof(__VA_ARGS__), alignof(__VA_ARGS__)> |
|
|
|
template <typename T> |
|
|
|
using TypedStorage = detail::TypedStorageImpl<T, sizeof(T), alignof(T)>; |
|
|
|
|
|
|
|
template <typename T> |
|
|
|
static constexpr T* GetPointer(TYPED_STORAGE(T) & ts) { |
|
|
|
static constexpr T* GetPointer(TypedStorage<T>& ts) { |
|
|
|
return static_cast<T*>(static_cast<void*>(std::addressof(ts.storage_))); |
|
|
|
} |
|
|
|
|
|
|
|
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_))); |
|
|
|
} |
|
|
|
|
|
|
|
@ -72,7 +74,7 @@ struct OffsetOfCalculator { |
|
|
|
union Union { |
|
|
|
char c{}; |
|
|
|
UnionHolder first_union; |
|
|
|
TYPED_STORAGE(ParentType) parent; |
|
|
|
TypedStorage<ParentType> parent; |
|
|
|
|
|
|
|
constexpr Union() : c() {} |
|
|
|
}; |
|
|
|
|