forked from Bananymous/banan-os
				
			LibGUI: Implement serialization for BAN::Vector
This commit is contained in:
		
							parent
							
								
									d73a667437
								
							
						
					
					
						commit
						7aa24b6157
					
				|  | @ -75,6 +75,15 @@ | ||||||
| namespace LibGUI | namespace LibGUI | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
|  | 	namespace detail | ||||||
|  | 	{ | ||||||
|  | 		template<typename T> | ||||||
|  | 		concept Vector = requires { | ||||||
|  | 			requires BAN::same_as<T, BAN::Vector<typename T::value_type>>; | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	static constexpr BAN::StringView s_window_server_socket = "/tmp/window-server.socket"_sv; | 	static constexpr BAN::StringView s_window_server_socket = "/tmp/window-server.socket"_sv; | ||||||
| 
 | 
 | ||||||
| 	namespace Serialize | 	namespace Serialize | ||||||
|  | @ -153,6 +162,40 @@ namespace LibGUI | ||||||
| 			return string; | 			return string; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		template<detail::Vector T> | ||||||
|  | 		inline size_t serialized_size_impl(const T& vector) | ||||||
|  | 		{ | ||||||
|  | 			size_t result = sizeof(uint32_t); | ||||||
|  | 			for (const auto& element : vector) | ||||||
|  | 				result += serialized_size_impl(element); | ||||||
|  | 			return result; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		template<detail::Vector T> | ||||||
|  | 		inline BAN::ErrorOr<void> send_serialized_impl(int socket, const T& vector) | ||||||
|  | 		{ | ||||||
|  | 			const uint32_t value_size = vector.size(); | ||||||
|  | 			TRY(send_raw_data(socket, BAN::ConstByteSpan::from(value_size))); | ||||||
|  | 			for (const auto& element : vector) | ||||||
|  | 				TRY(send_serialized_impl(socket, element)); | ||||||
|  | 			return {}; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		template<detail::Vector T> | ||||||
|  | 		inline BAN::ErrorOr<T> deserialize_impl(BAN::ConstByteSpan& buffer) | ||||||
|  | 		{ | ||||||
|  | 			if (buffer.size() < sizeof(uint32_t)) | ||||||
|  | 				return BAN::Error::from_errno(ENOBUFS); | ||||||
|  | 			const uint32_t vector_size = buffer.as<const uint32_t>(); | ||||||
|  | 			buffer = buffer.slice(sizeof(uint32_t)); | ||||||
|  | 
 | ||||||
|  | 			T vector; | ||||||
|  | 			TRY(vector.resize(vector_size)); | ||||||
|  | 			for (auto& element : vector) | ||||||
|  | 				element = TRY(deserialize_impl<typename T::value_type>(buffer)); | ||||||
|  | 
 | ||||||
|  | 			return vector; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	enum class PacketType : uint32_t | 	enum class PacketType : uint32_t | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue