mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-10-31 06:46:40 +08:00 
			
		
		
		
	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
					
				| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user