Browse Source

common/parent_of_member: Replace TYPED_STORAGE define with template alias

Provides the same construct, but makes it obey namespacing.
nce_cpp
Lioncash 5 years ago
parent
commit
6d1212fdb9
  1. 4
      src/common/intrusive_red_black_tree.h
  2. 14
      src/common/parent_of_member.h

4
src/common/intrusive_red_black_tree.h

@ -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);
} }

14
src/common/parent_of_member.h

@ -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>
using TypedStorage = detail::TypedStorageImpl<T, sizeof(T), alignof(T)>;
template <typename 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_))); 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…
Cancel
Save