mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-11-04 04:34:07 +01:00 
			
		
		
		
	concepts: Use the std::contiguous_iterator concept
This also covers std::span, which does not have a const iterator. Also renames IsSTLContainer to IsContiguousContainer to explicitly convey its semantics.
This commit is contained in:
		
							parent
							
								
									d8e3380ea5
								
							
						
					
					
						commit
						8b4d5aeb4f
					
				@ -3,24 +3,14 @@
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
 | 
			
		||||
namespace Common {
 | 
			
		||||
 | 
			
		||||
// Check if type is like an STL container
 | 
			
		||||
// Check if type satisfies the ContiguousContainer named requirement.
 | 
			
		||||
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();
 | 
			
		||||
};
 | 
			
		||||
concept IsContiguousContainer = std::contiguous_iterator<typename T::iterator>;
 | 
			
		||||
 | 
			
		||||
// TODO: Replace with std::derived_from when the <concepts> header
 | 
			
		||||
//       is available on all supported platforms.
 | 
			
		||||
 | 
			
		||||
@ -209,8 +209,8 @@ public:
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Helper function which deduces the value type of a contiguous STL container used in ReadSpan.
 | 
			
		||||
     * If T is not a contiguous STL container as defined by the concept IsSTLContainer, this calls
 | 
			
		||||
     * ReadObject and T must be a trivially copyable object.
 | 
			
		||||
     * If T is not a contiguous container as defined by the concept IsContiguousContainer, this
 | 
			
		||||
     * calls ReadObject and T must be a trivially copyable object.
 | 
			
		||||
     *
 | 
			
		||||
     * See ReadSpan for more details if T is a contiguous container.
 | 
			
		||||
     * See ReadObject for more details if T is a trivially copyable object.
 | 
			
		||||
@ -223,7 +223,7 @@ public:
 | 
			
		||||
     */
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    [[nodiscard]] size_t Read(T& data) const {
 | 
			
		||||
        if constexpr (IsSTLContainer<T>) {
 | 
			
		||||
        if constexpr (IsContiguousContainer<T>) {
 | 
			
		||||
            using ContiguousType = typename T::value_type;
 | 
			
		||||
            static_assert(std::is_trivially_copyable_v<ContiguousType>,
 | 
			
		||||
                          "Data type must be trivially copyable.");
 | 
			
		||||
@ -235,8 +235,8 @@ public:
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Helper function which deduces the value type of a contiguous STL container used in WriteSpan.
 | 
			
		||||
     * If T is not a contiguous STL container as defined by the concept IsSTLContainer, this calls
 | 
			
		||||
     * WriteObject and T must be a trivially copyable object.
 | 
			
		||||
     * If T is not a contiguous STL container as defined by the concept IsContiguousContainer, this
 | 
			
		||||
     * calls WriteObject and T must be a trivially copyable object.
 | 
			
		||||
     *
 | 
			
		||||
     * See WriteSpan for more details if T is a contiguous container.
 | 
			
		||||
     * See WriteObject for more details if T is a trivially copyable object.
 | 
			
		||||
@ -249,7 +249,7 @@ public:
 | 
			
		||||
     */
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    [[nodiscard]] size_t Write(const T& data) const {
 | 
			
		||||
        if constexpr (IsSTLContainer<T>) {
 | 
			
		||||
        if constexpr (IsContiguousContainer<T>) {
 | 
			
		||||
            using ContiguousType = typename T::value_type;
 | 
			
		||||
            static_assert(std::is_trivially_copyable_v<ContiguousType>,
 | 
			
		||||
                          "Data type must be trivially copyable.");
 | 
			
		||||
 | 
			
		||||
@ -304,7 +304,7 @@ public:
 | 
			
		||||
     */
 | 
			
		||||
    template <typename T, typename = std::enable_if_t<!std::is_pointer_v<T>>>
 | 
			
		||||
    std::size_t WriteBuffer(const T& data, std::size_t buffer_index = 0) const {
 | 
			
		||||
        if constexpr (Common::IsSTLContainer<T>) {
 | 
			
		||||
        if constexpr (Common::IsContiguousContainer<T>) {
 | 
			
		||||
            using ContiguousType = typename T::value_type;
 | 
			
		||||
            static_assert(std::is_trivially_copyable_v<ContiguousType>,
 | 
			
		||||
                          "Container to WriteBuffer must contain trivially copyable objects");
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user