Browse Source

add ByteArrayReader class

Kolja Strohm 2 years ago
parent
commit
8bcc04ee9d
4 changed files with 141 additions and 29 deletions
  1. 1 0
      Framework.vcxproj
  2. 3 0
      Framework.vcxproj.filters
  3. 73 0
      Reader.cpp
  4. 64 29
      Reader.h

+ 1 - 0
Framework.vcxproj

@@ -340,6 +340,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClCompile Include="Model3DCollection.h" />
     <ClCompile Include="Model3DList.cpp" />
     <ClCompile Include="Random.cpp" />
+    <ClCompile Include="Reader.cpp" />
     <ClCompile Include="ReferenceCounter.cpp" />
     <ClCompile Include="Shader.cpp" />
     <ClCompile Include="Slider.cpp" />

+ 3 - 0
Framework.vcxproj.filters

@@ -608,6 +608,9 @@
     <ClCompile Include="Writer.cpp">
       <Filter>Quelldateien\Framework\IO</Filter>
     </ClCompile>
+    <ClCompile Include="Reader.cpp">
+      <Filter>Quelldateien\Framework\IO</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <FxCompile Include="DX12VertexShader.hlsl">

+ 73 - 0
Reader.cpp

@@ -0,0 +1,73 @@
+#include "Reader.h"
+#include "Text.h"
+
+using namespace Framework;
+
+//! \param buffer der Buffer der gelesen werden soll
+//! \param length Die länge des buffers
+//! \param deleteBuffer true, wenn der buffer automatisch mit delete[] gelöscht werden soll
+ByteArrayReader::ByteArrayReader(const char* buffer, int length, bool deleteBuffer)
+	: ReferenceCounter(),
+	length(length),
+	buffer(buffer),
+	deleteBuffer(deleteBuffer),
+	position(0)
+{}
+
+ByteArrayReader::~ByteArrayReader()
+{
+	if (deleteBuffer)
+		delete[] buffer;
+}
+
+//! Ließt aus der Datei
+//! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
+//! \param len Wie viele Bytes aus der Resource gelesen werden sollen
+void ByteArrayReader::lese(char* bytes, int len)
+{
+	if (position < length)
+		memcpy(bytes, buffer + position, min(len, length - position));
+	position = min(position + len, length);
+}
+
+//! Ließt die nächste zeile der Resource ein
+//! \return Die gelesene Zeile als Text mit zeilenumbruch
+Text* ByteArrayReader::leseZeile()
+{
+	if (position >= length)
+		return 0;
+	int start = position;
+	for (; buffer[position] != '\n' && position < length; position++);
+	Text* ret = new Text("");
+	ret->fillText('\0', position - start + 1);
+	lese(ret->getText(), position - start + 1);
+	return ret;
+}
+
+//! Prüft, ob die Resource vollständig gelesen wurde
+//!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+bool ByteArrayReader::istEnde() const
+{
+	return position >= length;
+}
+
+//! Setzt die Position des Bytes, das als nächstes gelesen werden soll
+//! \param pos Der Index des Bytes
+//! \param ende 1, wenn der Index vom ende der Resource zählt. 0, wenn der Index vom Beginn der Resource zählt
+void ByteArrayReader::setLPosition(__int64 pos, bool ende)
+{
+	position = ende ? max(length - pos, 0) : min((int)pos, length);
+}
+
+//! Gibt den Index des Bytes aus der Resource zurück, welches als nächstes gelesen werden würde
+//! return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Lesezeigers
+__int64 ByteArrayReader::getLPosition() const
+{
+	return position;
+}
+
+//! Gibt die Anzahl der zu lesenden Bytes zurück
+__int64 ByteArrayReader::getSize() const
+{
+	return length;
+}

+ 64 - 29
Reader.h

@@ -1,37 +1,72 @@
 #pragma once
 
-#include "Betriebssystem.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
-    class Text;
+	class Text;
 
-    class StreamReader
-    {
-    public:
-        //! Ließt aus der Datei
-        //! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
-        //! \param len Wie viele Bytes aus der Resource gelesen werden sollen
-        virtual void lese( char *bytes, int len ) = 0;
-        //! Ließt die nächste zeile der Resource ein
-        //! \return Die gelesene Zeile als Text mit zeilenumbruch
-        virtual Text *leseZeile() = 0;
-        //! Prüft, ob die Resource vollständig gelesen wurde
-        //!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
-        virtual bool istEnde() const = 0;
-    };
+	class StreamReader
+	{
+	public:
+		//! Ließt aus der Datei
+		//! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
+		//! \param len Wie viele Bytes aus der Resource gelesen werden sollen
+		virtual void lese(char* bytes, int len) = 0;
+		//! Ließt die nächste zeile der Resource ein
+		//! \return Die gelesene Zeile als Text mit zeilenumbruch
+		virtual Text* leseZeile() = 0;
+		//! Prüft, ob die Resource vollständig gelesen wurde
+		//!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+		virtual bool istEnde() const = 0;
+	};
 
-    class Reader : public StreamReader
-    {
-    public:
-        //! Setzt die Position des Bytes, das als nächstes gelesen werden soll
-        //! \param pos Der Index des Bytes
-        //! \param ende 1, wenn der Index vom ende der Resource zählt. 0, wenn der Index vom Beginn der Resource zählt
-        virtual void setLPosition( __int64 pos, bool ende ) = 0;
-        //! Gibt den Index des Bytes aus der Resource zurück, welches als nächstes gelesen werden würde
-        //! return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Lesezeigers
-        virtual __int64 getLPosition() const = 0;
-        //! Gibt die Anzahl der zu lesenden Bytes zurück
-        virtual __int64 getSize() const = 0;
-    };
+	class Reader : public StreamReader
+	{
+	public:
+		//! Setzt die Position des Bytes, das als nächstes gelesen werden soll
+		//! \param pos Der Index des Bytes
+		//! \param ende 1, wenn der Index vom ende der Resource zählt. 0, wenn der Index vom Beginn der Resource zählt
+		virtual void setLPosition(__int64 pos, bool ende) = 0;
+		//! Gibt den Index des Bytes aus der Resource zurück, welches als nächstes gelesen werden würde
+		//! return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Lesezeigers
+		virtual __int64 getLPosition() const = 0;
+		//! Gibt die Anzahl der zu lesenden Bytes zurück
+		virtual __int64 getSize() const = 0;
+	};
+
+	class ByteArrayReader : public Reader, public ReferenceCounter
+	{
+	private:
+		int length;
+		const char* buffer;
+		bool deleteBuffer;
+		int position;
+
+	public:
+		//! \param buffer der Buffer der gelesen werden soll
+		//! \param length Die länge des buffers
+		//! \param deleteBuffer true, wenn der buffer automatisch mit delete[] gelöscht werden soll
+		DLLEXPORT ByteArrayReader(const char* buffer, int length, bool deleteBuffer);
+		DLLEXPORT ~ByteArrayReader();
+		//! Ließt aus der Datei
+		//! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
+		//! \param len Wie viele Bytes aus der Resource gelesen werden sollen
+		DLLEXPORT void lese(char* bytes, int len) override;
+		//! Ließt die nächste zeile der Resource ein
+		//! \return Die gelesene Zeile als Text mit zeilenumbruch
+		DLLEXPORT Text* leseZeile() override;
+		//! Prüft, ob die Resource vollständig gelesen wurde
+		//!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+		DLLEXPORT bool istEnde() const override;
+		//! Setzt die Position des Bytes, das als nächstes gelesen werden soll
+		//! \param pos Der Index des Bytes
+		//! \param ende 1, wenn der Index vom ende der Resource zählt. 0, wenn der Index vom Beginn der Resource zählt
+		DLLEXPORT void setLPosition(__int64 pos, bool ende) override;
+		//! Gibt den Index des Bytes aus der Resource zurück, welches als nächstes gelesen werden würde
+		//! return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Lesezeigers
+		DLLEXPORT __int64 getLPosition() const override;
+		//! Gibt die Anzahl der zu lesenden Bytes zurück
+		DLLEXPORT __int64 getSize() const override;
+	};
 }