diff options
| author | 2020-08-03 21:28:54 +1000 | |
|---|---|---|
| committer | 2020-08-03 07:28:54 -0400 | |
| commit | 9b75481755c8d566bc666465d659115bba2b2578 (patch) | |
| tree | 309d0ff37c8e68d178b65861abeb3bb0e8387f43 /src/core/hle/kernel | |
| parent | Merge pull request #4263 from lat9nq/fix-screencaps-2 (diff) | |
| download | yuzu-9b75481755c8d566bc666465d659115bba2b2578.tar.gz yuzu-9b75481755c8d566bc666465d659115bba2b2578.tar.xz yuzu-9b75481755c8d566bc666465d659115bba2b2578.zip | |
ipc: Allow all trivially copyable objects to be passed directly into WriteBuffer (#4465)
* ipc: Allow all trivially copyable objects to be passed directly into WriteBuffer
With the support of C++20, we can use concepts to deduce if a type is an STL container or not.
* More agressive concept for stl containers
* Add -fconcepts
* Move to common namespace
* Add Common::IsBaseOf
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index b31673928..f3277b766 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <vector> | 13 | #include <vector> |
| 14 | #include <boost/container/small_vector.hpp> | 14 | #include <boost/container/small_vector.hpp> |
| 15 | #include "common/common_types.h" | 15 | #include "common/common_types.h" |
| 16 | #include "common/concepts.h" | ||
| 16 | #include "common/swap.h" | 17 | #include "common/swap.h" |
| 17 | #include "core/hle/ipc.h" | 18 | #include "core/hle/ipc.h" |
| 18 | #include "core/hle/kernel/object.h" | 19 | #include "core/hle/kernel/object.h" |
| @@ -193,23 +194,24 @@ public: | |||
| 193 | 194 | ||
| 194 | /* Helper function to write a buffer using the appropriate buffer descriptor | 195 | /* Helper function to write a buffer using the appropriate buffer descriptor |
| 195 | * | 196 | * |
| 196 | * @tparam ContiguousContainer an arbitrary container that satisfies the | 197 | * @tparam T an arbitrary container that satisfies the |
| 197 | * ContiguousContainer concept in the C++ standard library. | 198 | * ContiguousContainer concept in the C++ standard library or a trivially copyable type. |
| 198 | * | 199 | * |
| 199 | * @param container The container to write the data of into a buffer. | 200 | * @param data The container/data to write into a buffer. |
| 200 | * @param buffer_index The buffer in particular to write to. | 201 | * @param buffer_index The buffer in particular to write to. |
| 201 | */ | 202 | */ |
| 202 | template <typename ContiguousContainer, | 203 | template <typename T, typename = std::enable_if_t<!std::is_pointer_v<T>>> |
| 203 | typename = std::enable_if_t<!std::is_pointer_v<ContiguousContainer>>> | 204 | std::size_t WriteBuffer(const T& data, std::size_t buffer_index = 0) const { |
| 204 | std::size_t WriteBuffer(const ContiguousContainer& container, | 205 | if constexpr (Common::IsSTLContainer<T>) { |
| 205 | std::size_t buffer_index = 0) const { | 206 | using ContiguousType = typename T::value_type; |
| 206 | using ContiguousType = typename ContiguousContainer::value_type; | 207 | static_assert(std::is_trivially_copyable_v<ContiguousType>, |
| 207 | 208 | "Container to WriteBuffer must contain trivially copyable objects"); | |
| 208 | static_assert(std::is_trivially_copyable_v<ContiguousType>, | 209 | return WriteBuffer(std::data(data), std::size(data) * sizeof(ContiguousType), |
| 209 | "Container to WriteBuffer must contain trivially copyable objects"); | 210 | buffer_index); |
| 210 | 211 | } else { | |
| 211 | return WriteBuffer(std::data(container), std::size(container) * sizeof(ContiguousType), | 212 | static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable"); |
| 212 | buffer_index); | 213 | return WriteBuffer(&data, sizeof(T), buffer_index); |
| 214 | } | ||
| 213 | } | 215 | } |
| 214 | 216 | ||
| 215 | /// Helper function to get the size of the input buffer | 217 | /// Helper function to get the size of the input buffer |