aboutsummaryrefslogtreecommitdiff
path: root/src/common/concepts.h
diff options
context:
space:
mode:
authorDavid <25727384+ogniK5377@users.noreply.github.com>2020-08-03 21:28:54 +1000
committerGitHub <noreply@github.com>2020-08-03 07:28:54 -0400
commit9b75481755c8d566bc666465d659115bba2b2578 (patch)
tree309d0ff37c8e68d178b65861abeb3bb0e8387f43 /src/common/concepts.h
parent6c7292de33702aababf60acbc58128bd060f81ab (diff)
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/common/concepts.h')
-rw-r--r--src/common/concepts.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/common/concepts.h b/src/common/concepts.h
new file mode 100644
index 0000000000..db5fb373d9
--- /dev/null
+++ b/src/common/concepts.h
@@ -0,0 +1,32 @@
+// Copyright 2020 yuzu emulator team
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+namespace Common {
+
+#include <type_traits>
+
+// Check if type is like an STL container
+template <typename T>
+concept IsSTLContainer = requires(T t) {
+ typename T::value_type;
+ typename T::iterator;
+ typename T::const_iterator;
+ // TODO(ogniK): Replace below is std::same_as<void> when MSVC supports it.
+ t.begin();
+ t.end();
+ t.cbegin();
+ t.cend();
+ t.data();
+ t.size();
+};
+
+// Check if type T is derived from T2
+template <typename T, typename T2>
+concept IsBaseOf = requires {
+ std::is_base_of_v<T, T2>;
+};
+
+} // namespace Common