mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-10-31 23:06:43 +08: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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user