summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar Lioncash2018-07-19 16:10:12 -0400
committerGravatar Lioncash2018-07-19 17:05:12 -0400
commitff500a7b6838f2eaca25b79ce602c499a71b9c10 (patch)
tree7813699b6de1c54556817cba997c870cb4846b35 /src/core/hle/kernel
parentMerge pull request #714 from lioncash/index (diff)
downloadyuzu-ff500a7b6838f2eaca25b79ce602c499a71b9c10.tar.gz
yuzu-ff500a7b6838f2eaca25b79ce602c499a71b9c10.tar.xz
yuzu-ff500a7b6838f2eaca25b79ce602c499a71b9c10.zip
hle_ipc: Introduce generic WriteBuffer overload for multiple container types
This introduces a slightly more generic variant of WriteBuffer(). Notably, this variant doesn't constrain the arguments to only accepting std::vector instances. It accepts whatever adheres to the ContiguousContainer concept in the C++ standard library. This essentially means, std::array, std::string, and std::vector can be used directly with this interface. The interface no longer forces you to solely use containers that dynamically allocate. To ensure our overloads play nice with one another, we only enable the container-based WriteBuffer if the argument is not a pointer, otherwise we fall back to the pointer-based one.
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp4
-rw-r--r--src/core/hle/kernel/hle_ipc.h23
2 files changed, 21 insertions, 6 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 911e6fbc1..8f40bdd5a 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -301,10 +301,6 @@ size_t HLERequestContext::WriteBuffer(const void* buffer, size_t size, int buffe
301 return size; 301 return size;
302} 302}
303 303
304size_t HLERequestContext::WriteBuffer(const std::vector<u8>& buffer, int buffer_index) const {
305 return WriteBuffer(buffer.data(), buffer.size(), buffer_index);
306}
307
308size_t HLERequestContext::GetReadBufferSize(int buffer_index) const { 304size_t HLERequestContext::GetReadBufferSize(int buffer_index) const {
309 const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[buffer_index].Size()}; 305 const bool is_buffer_a{BufferDescriptorA().size() && BufferDescriptorA()[buffer_index].Size()};
310 return is_buffer_a ? BufferDescriptorA()[buffer_index].Size() 306 return is_buffer_a ? BufferDescriptorA()[buffer_index].Size()
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index 88f93ad22..01b805df8 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -5,8 +5,10 @@
5#pragma once 5#pragma once
6 6
7#include <array> 7#include <array>
8#include <iterator>
8#include <memory> 9#include <memory>
9#include <string> 10#include <string>
11#include <type_traits>
10#include <vector> 12#include <vector>
11#include <boost/container/small_vector.hpp> 13#include <boost/container/small_vector.hpp>
12#include "common/common_types.h" 14#include "common/common_types.h"
@@ -171,8 +173,25 @@ public:
171 /// Helper function to write a buffer using the appropriate buffer descriptor 173 /// Helper function to write a buffer using the appropriate buffer descriptor
172 size_t WriteBuffer(const void* buffer, size_t size, int buffer_index = 0) const; 174 size_t WriteBuffer(const void* buffer, size_t size, int buffer_index = 0) const;
173 175
174 /// Helper function to write a buffer using the appropriate buffer descriptor 176 /* Helper function to write a buffer using the appropriate buffer descriptor
175 size_t WriteBuffer(const std::vector<u8>& buffer, int buffer_index = 0) const; 177 *
178 * @tparam ContiguousContainer an arbitrary container that satisfies the
179 * ContiguousContainer concept in the C++ standard library.
180 *
181 * @param container The container to write the data of into a buffer.
182 * @param buffer_index The buffer in particular to write to.
183 */
184 template <typename ContiguousContainer,
185 typename = std::enable_if_t<!std::is_pointer_v<ContiguousContainer>>>
186 size_t WriteBuffer(const ContiguousContainer& container, int buffer_index = 0) const {
187 using ContiguousType = typename ContiguousContainer::value_type;
188
189 static_assert(std::is_trivially_copyable_v<ContiguousType>,
190 "Container to WriteBuffer must contain trivially copyable objects");
191
192 return WriteBuffer(std::data(container), std::size(container) * sizeof(ContiguousType),
193 buffer_index);
194 }
176 195
177 /// Helper function to get the size of the input buffer 196 /// Helper function to get the size of the input buffer
178 size_t GetReadBufferSize(int buffer_index = 0) const; 197 size_t GetReadBufferSize(int buffer_index = 0) const;