summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/common_funcs.h23
-rw-r--r--src/common/intrusive_red_black_tree.h1
-rw-r--r--src/common/parent_of_member.h8
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.
140template <class C>
141constexpr auto Size(const C& c) -> decltype(c.size()) {
142 return std::size(c);
143}
144
145template <class C>
146constexpr 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
510private: 510private:
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
515template <auto T, class Derived = impl::GetParentType<T>> 514template <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>
133using GetMemberType = typename GetMemberPointerTraits<decltype(MemberPtr)>::Member; 133using GetMemberType = typename GetMemberPointerTraits<decltype(MemberPtr)>::Member;
134 134
135template <auto MemberPtr, typename RealParentType = GetParentType<MemberPtr>> 135template <auto MemberPtr, typename RealParentType = GetParentType<MemberPtr>>
136static inline std::ptrdiff_t OffsetOf = [] { 136constexpr 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
147template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> 147template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>>
148constexpr RealParentType& GetParentReference(impl::GetMemberType<MemberPtr>* member) { 148constexpr 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
154template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> 154template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>>
155constexpr RealParentType const& GetParentReference(impl::GetMemberType<MemberPtr> const* member) { 155constexpr 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}