diff options
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/common_funcs.h | 23 | ||||
| -rw-r--r-- | src/common/intrusive_red_black_tree.h | 1 | ||||
| -rw-r--r-- | src/common/parent_of_member.h | 8 |
3 files changed, 27 insertions, 5 deletions
diff --git a/src/common/common_funcs.h b/src/common/common_funcs.h index 4ace2cd33..17d1ee86b 100644 --- a/src/common/common_funcs.h +++ b/src/common/common_funcs.h | |||
| @@ -108,6 +108,14 @@ __declspec(dllimport) void __stdcall DebugBreak(void); | |||
| 108 | } \ | 108 | } \ |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | #define YUZU_NON_COPYABLE(cls) \ | ||
| 112 | cls(const cls&) = delete; \ | ||
| 113 | cls& operator=(const cls&) = delete | ||
| 114 | |||
| 115 | #define YUZU_NON_MOVEABLE(cls) \ | ||
| 116 | cls(cls&&) = delete; \ | ||
| 117 | cls& operator=(cls&&) = delete | ||
| 118 | |||
| 111 | #define R_SUCCEEDED(res) (res.IsSuccess()) | 119 | #define R_SUCCEEDED(res) (res.IsSuccess()) |
| 112 | 120 | ||
| 113 | /// Evaluates an expression that returns a result, and returns the result if it would fail. | 121 | /// Evaluates an expression that returns a result, and returns the result if it would fail. |
| @@ -128,4 +136,19 @@ namespace Common { | |||
| 128 | return u32(a) | u32(b) << 8 | u32(c) << 16 | u32(d) << 24; | 136 | return u32(a) | u32(b) << 8 | u32(c) << 16 | u32(d) << 24; |
| 129 | } | 137 | } |
| 130 | 138 | ||
| 139 | // std::size() does not support zero-size C arrays. We're fixing that. | ||
| 140 | template <class C> | ||
| 141 | constexpr auto Size(const C& c) -> decltype(c.size()) { | ||
| 142 | return std::size(c); | ||
| 143 | } | ||
| 144 | |||
| 145 | template <class C> | ||
| 146 | constexpr std::size_t Size(const C& c) { | ||
| 147 | if constexpr (sizeof(C) == 0) { | ||
| 148 | return 0; | ||
| 149 | } else { | ||
| 150 | return std::size(c); | ||
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 131 | } // namespace Common | 154 | } // namespace Common |
diff --git a/src/common/intrusive_red_black_tree.h b/src/common/intrusive_red_black_tree.h index c0bbcd457..1f696fe80 100644 --- a/src/common/intrusive_red_black_tree.h +++ b/src/common/intrusive_red_black_tree.h | |||
| @@ -509,7 +509,6 @@ private: | |||
| 509 | 509 | ||
| 510 | private: | 510 | private: |
| 511 | static constexpr TypedStorage<Derived> DerivedStorage = {}; | 511 | static constexpr TypedStorage<Derived> DerivedStorage = {}; |
| 512 | static_assert(GetParent(GetNode(GetPointer(DerivedStorage))) == GetPointer(DerivedStorage)); | ||
| 513 | }; | 512 | }; |
| 514 | 513 | ||
| 515 | template <auto T, class Derived = impl::GetParentType<T>> | 514 | template <auto T, class Derived = impl::GetParentType<T>> |
diff --git a/src/common/parent_of_member.h b/src/common/parent_of_member.h index d9a14529d..e0f8ab5c8 100644 --- a/src/common/parent_of_member.h +++ b/src/common/parent_of_member.h | |||
| @@ -133,27 +133,27 @@ template <auto MemberPtr> | |||
| 133 | using GetMemberType = typename GetMemberPointerTraits<decltype(MemberPtr)>::Member; | 133 | using GetMemberType = typename GetMemberPointerTraits<decltype(MemberPtr)>::Member; |
| 134 | 134 | ||
| 135 | template <auto MemberPtr, typename RealParentType = GetParentType<MemberPtr>> | 135 | template <auto MemberPtr, typename RealParentType = GetParentType<MemberPtr>> |
| 136 | static inline std::ptrdiff_t OffsetOf = [] { | 136 | constexpr std::ptrdiff_t OffsetOf() { |
| 137 | using DeducedParentType = GetParentType<MemberPtr>; | 137 | using DeducedParentType = GetParentType<MemberPtr>; |
| 138 | using MemberType = GetMemberType<MemberPtr>; | 138 | using MemberType = GetMemberType<MemberPtr>; |
| 139 | static_assert(std::is_base_of<DeducedParentType, RealParentType>::value || | 139 | static_assert(std::is_base_of<DeducedParentType, RealParentType>::value || |
| 140 | std::is_same<RealParentType, DeducedParentType>::value); | 140 | std::is_same<RealParentType, DeducedParentType>::value); |
| 141 | 141 | ||
| 142 | return OffsetOfCalculator<RealParentType, MemberType>::OffsetOf(MemberPtr); | 142 | return OffsetOfCalculator<RealParentType, MemberType>::OffsetOf(MemberPtr); |
| 143 | }(); | 143 | }; |
| 144 | 144 | ||
| 145 | } // namespace impl | 145 | } // namespace impl |
| 146 | 146 | ||
| 147 | template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> | 147 | template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> |
| 148 | constexpr RealParentType& GetParentReference(impl::GetMemberType<MemberPtr>* member) { | 148 | constexpr RealParentType& GetParentReference(impl::GetMemberType<MemberPtr>* member) { |
| 149 | std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>; | 149 | std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>(); |
| 150 | return *static_cast<RealParentType*>( | 150 | return *static_cast<RealParentType*>( |
| 151 | static_cast<void*>(static_cast<uint8_t*>(static_cast<void*>(member)) - Offset)); | 151 | static_cast<void*>(static_cast<uint8_t*>(static_cast<void*>(member)) - Offset)); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> | 154 | template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> |
| 155 | constexpr RealParentType const& GetParentReference(impl::GetMemberType<MemberPtr> const* member) { | 155 | constexpr RealParentType const& GetParentReference(impl::GetMemberType<MemberPtr> const* member) { |
| 156 | std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>; | 156 | std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>(); |
| 157 | return *static_cast<const RealParentType*>(static_cast<const void*>( | 157 | return *static_cast<const RealParentType*>(static_cast<const void*>( |
| 158 | static_cast<const uint8_t*>(static_cast<const void*>(member)) - Offset)); | 158 | static_cast<const uint8_t*>(static_cast<const void*>(member)) - Offset)); |
| 159 | } | 159 | } |