diff options
author | David <25727384+ogniK5377@users.noreply.github.com> | 2020-08-03 21:28:54 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-03 07:28:54 -0400 |
commit | 9b75481755c8d566bc666465d659115bba2b2578 (patch) | |
tree | 309d0ff37c8e68d178b65861abeb3bb0e8387f43 /src/common/concepts.h | |
parent | 6c7292de33702aababf60acbc58128bd060f81ab (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.h | 32 |
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 |