[Add] Implementing a filesystem for LibD.
This commit is contained in:
		
							parent
							
								
									531e46357b
								
							
						
					
					
						commit
						b5210850b6
					
				| @ -37,6 +37,8 @@ HEADERS += ../src/Actor/Player.h \ | |||||||
|     ../src/Sprite/Sprite.h \ |     ../src/Sprite/Sprite.h \ | ||||||
|     ../src/System/Debug.h \ |     ../src/System/Debug.h \ | ||||||
|     ../src/System/ResourceManager.h \ |     ../src/System/ResourceManager.h \ | ||||||
|  |     ../src/System/ConvertType.h \ | ||||||
|  |     ../src/System/Filesystem/InputStream.h \ | ||||||
|     ../src/Texture/Texture.h \ |     ../src/Texture/Texture.h \ | ||||||
|     ../src/Sound/Music.h \ |     ../src/Sound/Music.h \ | ||||||
|     ../src/TMXParser/base64.h \ |     ../src/TMXParser/base64.h \ | ||||||
| @ -87,6 +89,7 @@ SOURCES += ../src/Actor/Player.cpp \ | |||||||
|     ../src/Math/FPS.cpp \ |     ../src/Math/FPS.cpp \ | ||||||
|     ../src/Sprite/Sprite.cpp \ |     ../src/Sprite/Sprite.cpp \ | ||||||
|     ../src/System/Debug.cpp \ |     ../src/System/Debug.cpp \ | ||||||
|  |     ../src/System/Filesystem/InputStream.cpp \ | ||||||
|     ../src/Texture/Texture.cpp \ |     ../src/Texture/Texture.cpp \ | ||||||
|     ../src/Sound/Music.cpp \ |     ../src/Sound/Music.cpp \ | ||||||
|     ../src/Actor/NPC.cpp \ |     ../src/Actor/NPC.cpp \ | ||||||
|  | |||||||
							
								
								
									
										55
									
								
								src/System/ConvertType.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/System/ConvertType.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #ifndef INCLUDED_CASSERT | ||||||
|  | #define INCLUSED_CASSERT | ||||||
|  | #include <cassert> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | namespace saracraft { | ||||||
|  | namespace filesystem { | ||||||
|  | 
 | ||||||
|  | template<class T> | ||||||
|  | struct ConvertBase { | ||||||
|  |   enum { charCount = sizeof(T) }; | ||||||
|  |   union Values { | ||||||
|  |     unsigned char c[charCount]; | ||||||
|  |     T t; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   Values value; | ||||||
|  | 
 | ||||||
|  |   int GetSize(void) const { return charCount; } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template<class T> | ||||||
|  | struct ConvertFrom: private ConvertBase<T> { | ||||||
|  |   explicit ConvertFrom(const T& t) { | ||||||
|  |     this->value.t = t; | ||||||
|  |   } | ||||||
|  |   using ConvertBase<T>::GetSize; | ||||||
|  | 
 | ||||||
|  |   unsigned char GetByte(int index) const  { | ||||||
|  |     assert((index >= 0) && (index < GetSize())); | ||||||
|  |     return this->value.c[index]; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template<class T> | ||||||
|  | struct ConvertTo: private ConvertBase<T> { | ||||||
|  |   using ConvertBase<T>::GetSize; | ||||||
|  | 
 | ||||||
|  |   void SetByte(int index, unsigned char c) { | ||||||
|  |     assert((index >= 0) && (index < GetSize())); | ||||||
|  |     this->value.c[index] = c; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const T& GetValue(void) const { | ||||||
|  |     return this->value.t; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | typedef unsigned short uint16_t; | ||||||
|  | 
 | ||||||
|  | } // Namespaces....
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										150
									
								
								src/System/Filesystem/InputStream.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								src/System/Filesystem/InputStream.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,150 @@ | |||||||
|  | #include  <boost/static_assert.hpp> | ||||||
|  | 
 | ||||||
|  | #include "../ConvertType.h" | ||||||
|  | #include <limits.h> | ||||||
|  | #include "InputStream.h" | ||||||
|  | BOOST_STATIC_ASSERT(sizeof(saracraft::filesystem::uint16_t) * CHAR_BIT == 16); | ||||||
|  | BOOST_STATIC_ASSERT(CHAR_BIT == 8); | ||||||
|  | 
 | ||||||
|  | namespace saracraft { | ||||||
|  | namespace filesystem { | ||||||
|  | namespace { | ||||||
|  | 
 | ||||||
|  |   template<class T> | ||||||
|  |   void ReadFromStream(IInputStreamBuffer& buffer, T& value) { | ||||||
|  |     ConvertTo<T> converter; | ||||||
|  |     for(int i = 0; i < converter.GetSize(); ++i) | ||||||
|  |       converter.SetByte(i, buffer.PopByte()); | ||||||
|  | 
 | ||||||
|  |       value = converter.GetValue(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } // End of unamed namespace.
 | ||||||
|  | 
 | ||||||
|  | InputStream::InputStream(void) { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream::~InputStream(void) { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void InputStream::SetBuffer(boost::shared_ptr<IInputStreamBuffer> streamBuffer_) { | ||||||
|  |   assert(streamBuffer_); | ||||||
|  |   _streamBuffer = streamBuffer_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool InputStream::IsEof(void) const { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  |   return _streamBuffer->IsEof(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int InputStream::GetSize(void) const { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  |   return _streamBuffer->GetSize(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(std::string& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   uint16_t stringSize = 0; | ||||||
|  |   this->Read(stringSize); | ||||||
|  | 
 | ||||||
|  |   value.resize(stringSize); | ||||||
|  |   for(int i = 0; i < stringSize; ++i) | ||||||
|  |     value[i] = _streamBuffer->PopByte(); | ||||||
|  | 
 | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(bool& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  |   value = _streamBuffer->PopByte() != 0; | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(unsigned char& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   value = _streamBuffer->PopByte(); | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(char& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   value = _streamBuffer->PopByte(); | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(signed char& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   value = _streamBuffer->PopByte(); | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(unsigned short& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   ReadFromStream(*_streamBuffer, value); | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(signed short& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   ReadFromStream(*_streamBuffer, value); | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(unsigned int& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   ReadFromStream(*_streamBuffer, value); | ||||||
|  |   return * this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(signed int& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   ReadFromStream(*_streamBuffer, value); | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(float& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   ReadFromStream(*_streamBuffer, value); | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(double& value) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   ReadFromStream(*_streamBuffer, value); | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(unsigned char* buffer, int elements) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   _streamBuffer->PopBytes(reinterpret_cast<char*>(buffer), elements); | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(char* buffer, int elements) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  |   _streamBuffer->PopBytes(buffer, elements); | ||||||
|  | 
 | ||||||
|  |   return *this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | InputStream& InputStream::Read(unsigned short* buffer, int elements) { | ||||||
|  |   assert(_streamBuffer); | ||||||
|  | 
 | ||||||
|  |   _streamBuffer->PopBytes(reinterpret_cast<char*>(buffer), elements * sizeof(short)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // End of namespace filesystem.
 | ||||||
|  | } // End of namespace saracraft.
 | ||||||
							
								
								
									
										90
									
								
								src/System/Filesystem/InputStream.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/System/Filesystem/InputStream.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #ifndef INCLUDED_BOOST_SHARED_PTR_HPP | ||||||
|  | #define INCLUDED_BOOST_SHATED_PTR_HPP | ||||||
|  | #include <boost/shared_ptr.hpp> | ||||||
|  | #endif | ||||||
|  | #ifndef INCLUDED_STRING | ||||||
|  | #define INCLUDED_STRING | ||||||
|  | #include <string> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | namespace saracraft { | ||||||
|  | namespace filesystem { | ||||||
|  | 
 | ||||||
|  | class IInputStreamBuffer { | ||||||
|  | public: | ||||||
|  |   virtual ~IInputStreamBuffer(void) { } | ||||||
|  | 
 | ||||||
|  |   virtual unsigned char PopByte(void) = 0; | ||||||
|  |   virtual bool IsEof(void) const = 0; | ||||||
|  |   virtual int GetSize(void) const = 0; | ||||||
|  | 
 | ||||||
|  |   virtual void PopBytes(char* buffer, int bytes) = 0; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class InputStream { | ||||||
|  |   boost::shared_ptr<IInputStreamBuffer> _streamBuffer; | ||||||
|  | public: | ||||||
|  |   InputStream(void); | ||||||
|  |   ~InputStream(void); | ||||||
|  | 
 | ||||||
|  |   void SetBuffer(boost::shared_ptr<IInputStreamBuffer> streamBuffer); | ||||||
|  |   bool IsEof(void) const; | ||||||
|  |   int GetSize(void) const; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |   InputStream& Read(std::string& value); | ||||||
|  |   InputStream& Read(bool& value); | ||||||
|  | 
 | ||||||
|  |   InputStream& Read(unsigned char& value); | ||||||
|  |   InputStream& Read(char& value); | ||||||
|  |   InputStream& Read(signed char& value); | ||||||
|  | 
 | ||||||
|  |   InputStream& Read(unsigned short& value); | ||||||
|  |   InputStream& Read(signed  short& value); | ||||||
|  | 
 | ||||||
|  |   InputStream& Read(unsigned int& value); | ||||||
|  |   InputStream& Read(signed int& value); | ||||||
|  | 
 | ||||||
|  |   InputStream& Read(float& value); | ||||||
|  |   InputStream& Read(double& value); | ||||||
|  | 
 | ||||||
|  |   friend InputStream& operator >> (InputStream&, std::string&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, bool&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, unsigned char&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, char&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, signed char&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, unsigned short&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, signed short&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, unsigned int&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, signed int&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, float&); | ||||||
|  |   friend InputStream& operator >> (InputStream&, double&); | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |   // Optimized readers.
 | ||||||
|  |   InputStream& Read(unsigned char* buffer, int elements); | ||||||
|  |   InputStream& Read(char* buffer, int elements); | ||||||
|  |   InputStream& Read(unsigned short* buffer, int elements); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | inline InputStream& operator >> (InputStream& stream, std::string& value)       { return stream.Read(value); } | ||||||
|  | inline InputStream& operator >> (InputStream& stream, bool& value)              { return stream.Read(value); } | ||||||
|  | 
 | ||||||
|  | inline InputStream& operator >> (InputStream& stream, unsigned char& value)     { return stream.Read(value); } | ||||||
|  | inline InputStream& operator >> (InputStream& stream, char& value)              { return stream.Read(value); } | ||||||
|  | inline InputStream& operator >> (InputStream& stream, signed char& value)       { return stream.Read(value); } | ||||||
|  | 
 | ||||||
|  | inline InputStream& operator >> (InputStream& stream, unsigned short& value)    { return stream.Read(value); } | ||||||
|  | inline InputStream& operator >> (InputStream& stream, signed short& value)      { return stream.Read(value); } | ||||||
|  | 
 | ||||||
|  | inline InputStream& operator >> (InputStream& stream, unsigned int& value)      { return stream.Read(value); } | ||||||
|  | inline InputStream& operator >> (InputStream& stream, signed int& value)        { return stream.Read(value); } | ||||||
|  | 
 | ||||||
|  | inline InputStream& operator >> (InputStream& stream, float& value)             { return stream.Read(value); } | ||||||
|  | inline InputStream& operator >> (InputStream& stream, double& value)            { return stream.Read(value); } | ||||||
|  | 
 | ||||||
|  | } // Namespace filesystem.
 | ||||||
|  | } // Namespace saracraft.
 | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Rtch90
						Rtch90