parent
							
								
									6613ecd9ba
								
							
						
					
					
						commit
						3f301ae2fd
					
				
				 1 changed files with 58 additions and 0 deletions
			
			
		| @ -0,0 +1,58 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | namespace Bk::Net { | ||||||
|  | 	class DataStream 
 | ||||||
|  | 	{ | ||||||
|  | 	public: | ||||||
|  | 		DataStream() = default; | ||||||
|  | 		DataStream(std::vector<char> data) | ||||||
|  | 		: payload(data) {} | ||||||
|  | 
 | ||||||
|  | 		int size() { return payload.size(); } | ||||||
|  | 
 | ||||||
|  | 		template <typename T> | ||||||
|  | 		void push(const T& data) | ||||||
|  | 		{ | ||||||
|  | 			static_assert(std::is_standard_layout<T>::value, "Data is too complex to be pushed into vector"); | ||||||
|  | 			size_t i = payload.size(); | ||||||
|  | 			payload.resize(i + sizeof(T)); | ||||||
|  | 			std::memcpy(payload.data() + i, &data, sizeof(T)); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		template <typename T> | ||||||
|  | 		void push(const T* data, int size) | ||||||
|  | 		{ | ||||||
|  | 			for(int i = 0; i < size; i++) push<T>(data[i]);	
 | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		template <typename T> | ||||||
|  | 		T pull() | ||||||
|  | 		{ | ||||||
|  | 			static_assert(std::is_standard_layout<T>::value, "Data is too complex to be pulled from vector"); | ||||||
|  | 			T data; | ||||||
|  | 			size_t i = payload.size() - sizeof(T); | ||||||
|  | 			std::memcpy(&data, payload.data() + i, sizeof(T)); | ||||||
|  | 			payload.resize(i); | ||||||
|  | 			return data; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		template <typename T> | ||||||
|  | 		std::unique_ptr<T[]> pull(int size) | ||||||
|  | 		{ | ||||||
|  | 			std::unique_ptr<T[]> data(new T[size]); | ||||||
|  | 			for(int i = size - 1; i >= 0; i--) data[i] = pull<T>(); | ||||||
|  | 			return data; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		bool append_data(std::vector<char> data) | ||||||
|  | 		{ | ||||||
|  | 			if (!data.size()) return false; | ||||||
|  | 			size_t i = payload.size(); | ||||||
|  | 			payload.resize(i + data.size()); | ||||||
|  | 			std::memcpy(payload.data() + i, data.data(), sizeof(char) * data.size()); | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 	
 | ||||||
|  | 		std::vector<char> payload; | ||||||
|  | 	}; | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue