mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Added draft of IO memeory buffer
This commit is contained in:
		| @@ -12,7 +12,8 @@ set(lib_SRCS | ||||
| 		filesystem/CFilesystemLoader.cpp | ||||
| 		filesystem/CArchiveLoader.cpp | ||||
| 		filesystem/CFileInfo.cpp | ||||
| 		filesystem/CMemoryStream.cpp | ||||
|                 filesystem/CMemoryBuffer.cpp | ||||
|                 filesystem/CMemoryStream.cpp | ||||
| 		filesystem/CBinaryReader.cpp | ||||
| 		filesystem/CFileInputStream.cpp | ||||
| 		filesystem/CZipLoader.cpp | ||||
|   | ||||
							
								
								
									
										66
									
								
								lib/filesystem/CMemoryBuffer.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								lib/filesystem/CMemoryBuffer.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| /* | ||||
|  * CMemoryBuffer.cpp, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|  * License: GNU General Public License v2.0 or later | ||||
|  * Full text of license available in license.txt file, in main folder | ||||
|  * | ||||
|  */ | ||||
|   | ||||
| #include "StdInc.h" | ||||
| #include "CMemoryBuffer.h" | ||||
|  | ||||
| ///CMemoryBuffer | ||||
| CMemoryBuffer::CMemoryBuffer(): | ||||
| 	position(0) | ||||
| { | ||||
| 	 | ||||
| } | ||||
|  | ||||
| si64 CMemoryBuffer::write(ui8 * data, si64 size) | ||||
| { | ||||
| 	buffer.reserve(tell()+size); | ||||
| 	 | ||||
| 	std::copy(data, data + size, buffer.data() + position); | ||||
| 	position += size; | ||||
| 	 | ||||
| 	return size;		 | ||||
| } | ||||
|  | ||||
| si64 CMemoryBuffer::read(ui8 * data, si64 size) | ||||
| { | ||||
| 	si64 toRead = std::min(getSize() - tell(), size); | ||||
| 	 | ||||
| 	std::copy(buffer.data() + position, buffer.data() + position + toRead, data); | ||||
| 	position += toRead; | ||||
| 	 | ||||
| 	return toRead;	 | ||||
| } | ||||
|  | ||||
| si64 CMemoryBuffer::seek(si64 position) | ||||
| { | ||||
| 	this->position = position; | ||||
| 	if (this->position >=getSize()) | ||||
| 		this->position = getSize()-1; | ||||
| 	return this->position; | ||||
| } | ||||
|  | ||||
| si64 CMemoryBuffer::tell() | ||||
| { | ||||
| 	return position; | ||||
| } | ||||
|  | ||||
| si64 CMemoryBuffer::skip(si64 delta) | ||||
| { | ||||
| 	auto old_position = tell(); | ||||
| 	 | ||||
| 	return seek(old_position + delta) - old_position;  | ||||
| } | ||||
|  | ||||
| si64 CMemoryBuffer::getSize() | ||||
| { | ||||
| 	return buffer.size(); | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										87
									
								
								lib/filesystem/CMemoryBuffer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								lib/filesystem/CMemoryBuffer.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| #pragma once | ||||
|  | ||||
| /* | ||||
|  * CMemoryBuffer.h, part of VCMI engine | ||||
|  * | ||||
|  * Authors: listed in file AUTHORS in main folder | ||||
|  * | ||||
|  * License: GNU General Public License v2.0 or later | ||||
|  * Full text of license available in license.txt file, in main folder | ||||
|  * | ||||
|  */ | ||||
|   | ||||
|  | ||||
| #include "CInputStream.h" | ||||
| #include "COutputStream.h" | ||||
|  | ||||
| /** | ||||
|  * A class which provides IO memory buffer. | ||||
|  */ | ||||
|   | ||||
| class DLL_LINKAGE CMemoryBuffer : public CInputStream, public COutputStream | ||||
| { | ||||
| public: | ||||
| 	typedef std::vector<ui8> TBuffer; | ||||
|  | ||||
| 	/** | ||||
| 	 * C-tor. | ||||
| 	 * | ||||
| 	 */ | ||||
| 	CMemoryBuffer(); | ||||
| 	 | ||||
| 	/** | ||||
| 	 * Write n bytes from the stream into the data buffer. | ||||
| 	 * | ||||
| 	 * @param data A pointer to the destination data array. | ||||
| 	 * @param size The number of bytes to write. | ||||
| 	 * @return the number of bytes written actually. | ||||
| 	 */ | ||||
| 	si64 write(ui8 * data, si64 size) override;	 | ||||
|  | ||||
| 	/** | ||||
| 	 * Reads n bytes from the stream into the data buffer. | ||||
| 	 * | ||||
| 	 * @param data A pointer to the destination data array. | ||||
| 	 * @param size The number of bytes to read. | ||||
| 	 * @return the number of bytes read actually. | ||||
| 	 */ | ||||
| 	si64 read(ui8 * data, si64 size) override; | ||||
|  | ||||
| 	/** | ||||
| 	 * Seeks the internal read pointer to the specified position. | ||||
| 	 * | ||||
| 	 * @param position The read position from the beginning. | ||||
| 	 * @return the position actually moved to, -1 on error. | ||||
| 	 */ | ||||
| 	si64 seek(si64 position) override; | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the current read position in the stream. | ||||
| 	 * | ||||
| 	 * @return the read position. | ||||
| 	 */ | ||||
| 	si64 tell() override; | ||||
|  | ||||
| 	/** | ||||
| 	 * Skips delta numbers of bytes. | ||||
| 	 * | ||||
| 	 * @param delta The count of bytes to skip. | ||||
| 	 * @return the count of bytes skipped actually. | ||||
| 	 */ | ||||
| 	si64 skip(si64 delta) override; | ||||
|  | ||||
| 	/** | ||||
| 	 * Gets the length in bytes of the stream. | ||||
| 	 * | ||||
| 	 * @return the length in bytes of the stream. | ||||
| 	 */ | ||||
| 	si64 getSize() override; | ||||
|  | ||||
| private: | ||||
| 	/** Actual data. */ | ||||
| 	TBuffer buffer; | ||||
| 	 | ||||
| 	/** Current reading position of the stream. */ | ||||
| 	si64 position; | ||||
| }; | ||||
|  | ||||
| @@ -14,7 +14,8 @@ | ||||
|  | ||||
| /** | ||||
|  * A class which provides method definitions for reading from memory. | ||||
|  */ | ||||
|  * @deprecated use CMemoryBuffer | ||||
|  */  | ||||
| class DLL_LINKAGE CMemoryStream : public CInputStream | ||||
| { | ||||
| public: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user