Browse Source

Reader Interface hinzugefügt,
AsynchronCall hinzugefügt für einfaches asynchrones aufrufen von methoden,
RandomGenerator hinzugefügt zum verlässlichen erstellen von zufallszahlen zu gegebenen seeds

kolja 6 years ago
parent
commit
b28d7a9007
13 changed files with 536 additions and 9 deletions
  1. 41 0
      AsynchronCall.cpp
  2. 28 0
      AsynchronCall.h
  3. 1 1
      Bildschirm.cpp
  4. 8 7
      Datei.h
  5. 5 0
      Framework Linux.vcxproj
  6. 15 0
      Framework Linux.vcxproj.filters
  7. 5 0
      Framework.vcxproj
  8. 15 0
      Framework.vcxproj.filters
  9. 155 0
      Random.cpp
  10. 51 0
      Random.h
  11. 30 0
      Reader.h
  12. 125 0
      Text.cpp
  13. 57 1
      Text.h

+ 41 - 0
AsynchronCall.cpp

@@ -0,0 +1,41 @@
+#include "AsynchronCall.h"
+
+using namespace Framework;
+
+// Inhalt der AsynchronCall Klasse
+// Konstruktor
+//  f: Die Funktion die asynchron aufgerufen werden soll
+//  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
+AsynchronCall::AsynchronCall( std::function< void() > f )
+    : Thread()
+{
+    this->finished = 0;
+    this->f = f;
+    start();
+}
+
+// Konstruktor
+//  f: Die Funktion die asynchron aufgerufen werden soll
+//  finished: Wird auf 1 gesetzt wenn der Aufruf abgearbeitet wurde
+//  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
+AsynchronCall::AsynchronCall( std::function< void() > f, bool *finished )
+    : Thread()
+{
+    this->finished = finished;
+    this->f = f;
+    if( finished )
+        finished = 0;
+    start();
+}
+
+void AsynchronCall::thread()
+{
+    f();
+}
+
+void AsynchronCall::threadEnd()
+{
+    if( finished )
+        *finished = 1;
+    delete this;
+}

+ 28 - 0
AsynchronCall.h

@@ -0,0 +1,28 @@
+#pragma once
+
+#include "Thread.h"
+#include <functional>
+
+namespace Framework
+{
+    class AsynchronCall : private Thread
+    {
+    private:
+        std::function< void() > f;
+        bool *finished;
+
+        void thread() override;
+        void threadEnd() override;
+
+    public:
+        // Konstruktor
+        //  f: Die Funktion die asynchron aufgerufen werden soll
+        //  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
+        __declspec( dllexport ) AsynchronCall( std::function< void() > f );
+        // Konstruktor
+        //  f: Die Funktion die asynchron aufgerufen werden soll
+        //  finished: Wird auf 1 gesetzt wenn der Aufruf abgearbeitet wurde
+        //  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
+        __declspec( dllexport ) AsynchronCall( std::function< void() > f, bool *finished );
+    };
+}

+ 1 - 1
Bildschirm.cpp

@@ -999,7 +999,7 @@ void Bildschirm3D::render() // Zeichnet das Bild
         result = d3d11SpawChain->Present( 0, 0 );
         renderZeit->messungEnde();
 #ifdef _DEBUG
-        std::cout << renderZeit->getSekunden() << "\n";
+        //std::cout << renderZeit->getSekunden() << "\n";
 #endif
         if( !SUCCEEDED( result ) )
         {

+ 8 - 7
Datei.h

@@ -2,6 +2,7 @@
 #define Datei_H
 
 #include "Array.h"
+#include "Reader.h"
 #include <fstream>
 
 namespace Framework
@@ -15,7 +16,7 @@ namespace Framework
     class Datei; // aus dieser Datei
 
     // Ließt und schreibt in eine Datei
-    class Datei
+    class Datei : public Reader
     {
     public:
         class Style
@@ -40,7 +41,7 @@ namespace Framework
         // Konstruktor 
         __declspec( dllexport ) Datei();
         // Destruktor 
-        __declspec( dllexport ) ~Datei();
+        __declspec( dllexport ) virtual ~Datei();
         // Setzt den Pfad zur Datei
         //  pfad: Der Pfad
         __declspec( dllexport ) void setDatei( const char *pfad );
@@ -68,7 +69,7 @@ namespace Framework
         // Setzt die Position des Bytes, das als nächstes gelesen werden soll
         //  pos: Der Index des Bytes
         //  ende: 1, wenn der Index vom ende der Datei zählt. 0, wenn der Index vom Beginn der Datei zählt
-        __declspec( dllexport ) void setLPosition( __int64 pos, bool ende );
+        __declspec( dllexport ) void setLPosition( __int64 pos, bool ende ) override;
         // Setzt die Position des Bytes, das als nächstes überschrieben wird
         //  pos: Der Index des Bytes
         //  ende: 1, wenn der Index vom ende der Datei zählt. 0, wenn der Index vom Beginn der Datei zählt
@@ -80,10 +81,10 @@ namespace Framework
         // Ließt aus der Datei
         //  bytes: Ein Array, der mit Bytes aus der Datei gefüllt werden soll
         //  len: Wie viele Bytes aus der Datei gelesen werden sollen
-        __declspec( dllexport ) void lese( char *bytes, int len );
+        __declspec( dllexport ) void lese( char *bytes, int len ) override;
         // Ließt die nächste zeile der Datei ein
         //  return: Die gelesene Zeile als Text mit zeilenumbruch
-        __declspec( dllexport ) Text *leseZeile();
+        __declspec( dllexport ) Text *leseZeile() override;
         // Schließt die datei
         __declspec( dllexport ) void close();
 		// Setzt den Schlüssel für die Datei
@@ -125,13 +126,13 @@ namespace Framework
         __declspec( dllexport ) bool existiert() const;
         // Gibt den Index des Bytes aus der Datei zurück, welches als nächstes gelesen werden würde
         // return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Lesezeigers
-        __declspec( dllexport ) __int64 getLPosition() const;
+        __declspec( dllexport ) __int64 getLPosition() const override;
         // Gibt den Index des Bytes aus der Datei zurück, welches als nächstes überschrieben werden würde
         // return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Schreibzeigers
         __declspec( dllexport ) __int64 getSPosition() const;
         // Prüft, ob die Datei vollständig gelesen wurde
         //  return 1, wenn die Datei vollständig gelesen wurde. 0, sonst
-        __declspec( dllexport ) bool istEnde() const;
+        __declspec( dllexport ) bool istEnde() const override;
         // Gibt den Pfad zur Datei zurück
         __declspec( dllexport ) Text *getPfad() const;
         // Gibt den Pfad zur Datei ohne erhöhten Reference Counter zurück

+ 5 - 0
Framework Linux.vcxproj

@@ -105,6 +105,7 @@
     <ClCompile Include="AlphaFeld.cpp" />
     <ClCompile Include="Animation.cpp" />
     <ClCompile Include="Animation3D.cpp" />
+    <ClCompile Include="AsynchronCall.cpp" />
     <ClCompile Include="AuswahlBox.cpp" />
     <ClCompile Include="Bild.cpp" />
     <ClCompile Include="Bildschirm.cpp" />
@@ -132,6 +133,7 @@
     <ClCompile Include="Prozess.cpp" />
     <ClCompile Include="Punkt.cpp" />
     <ClCompile Include="Rahmen.cpp" />
+    <ClCompile Include="Random.cpp" />
     <ClCompile Include="Schrift.cpp" />
     <ClCompile Include="Scroll.cpp" />
     <ClCompile Include="Tabelle.cpp" />
@@ -153,6 +155,7 @@
     <ClInclude Include="Animation.h" />
     <ClInclude Include="Animation3D.h" />
     <ClInclude Include="Array.h" />
+    <ClInclude Include="AsynchronCall.h" />
     <ClInclude Include="AuswahlBox.h" />
     <ClInclude Include="Betriebssystem.h" />
     <ClInclude Include="Bild.h" />
@@ -187,6 +190,8 @@
     <ClInclude Include="Prozess.h" />
     <ClInclude Include="Punkt.h" />
     <ClInclude Include="Rahmen.h" />
+    <ClInclude Include="Random.h" />
+    <ClInclude Include="Reader.h" />
     <ClInclude Include="Schrift.h" />
     <ClInclude Include="Scroll.h" />
     <ClInclude Include="Tabelle.h" />

+ 15 - 0
Framework Linux.vcxproj.filters

@@ -237,6 +237,15 @@
     <ClInclude Include="Critical.h">
       <Filter>Headerdateien\Framework\OS</Filter>
     </ClInclude>
+    <ClInclude Include="Reader.h">
+      <Filter>Headerdateien\Framework</Filter>
+    </ClInclude>
+    <ClInclude Include="Random.h">
+      <Filter>Headerdateien\Framework</Filter>
+    </ClInclude>
+    <ClInclude Include="AsynchronCall.h">
+      <Filter>Headerdateien\Framework\OS</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Prozess.cpp">
@@ -374,5 +383,11 @@
     <ClCompile Include="Animation3D.cpp">
       <Filter>Quelldateien\Framework\Grafik\3D</Filter>
     </ClCompile>
+    <ClCompile Include="Random.cpp">
+      <Filter>Quelldateien\Framework</Filter>
+    </ClCompile>
+    <ClCompile Include="AsynchronCall.cpp">
+      <Filter>Quelldateien\Framework\OS</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 5 - 0
Framework.vcxproj

@@ -201,6 +201,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClInclude Include="Animation.h" />
     <ClInclude Include="Animation3D.h" />
     <ClInclude Include="Array.h" />
+    <ClInclude Include="AsynchronCall.h" />
     <ClInclude Include="AuswahlBox.h" />
     <ClInclude Include="Bild.h" />
     <ClInclude Include="Bildschirm.h" />
@@ -234,6 +235,8 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClInclude Include="Model3D.h" />
     <ClInclude Include="Model3DList.h" />
     <ClInclude Include="ObjectRegister.h" />
+    <ClInclude Include="Random.h" />
+    <ClInclude Include="Reader.h" />
     <ClInclude Include="Render3D.h" />
     <ClInclude Include="Shader.h" />
     <ClInclude Include="Textur.h" />
@@ -265,6 +268,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClCompile Include="AlphaFeld.cpp" />
     <ClCompile Include="Animation.cpp" />
     <ClCompile Include="Animation3D.cpp" />
+    <ClCompile Include="AsynchronCall.cpp" />
     <ClCompile Include="AuswahlBox.cpp" />
     <ClCompile Include="Bild.cpp" />
     <ClCompile Include="Bildschirm.cpp" />
@@ -291,6 +295,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClCompile Include="Model2D.cpp" />
     <ClCompile Include="Model3D.cpp" />
     <ClCompile Include="Model3DList.cpp" />
+    <ClCompile Include="Random.cpp" />
     <ClCompile Include="Render3D.cpp" />
     <ClCompile Include="Shader.cpp" />
     <ClCompile Include="Textur.cpp" />

+ 15 - 0
Framework.vcxproj.filters

@@ -261,6 +261,15 @@
     <ClInclude Include="Critical.h">
       <Filter>Headerdateien\Framework\OS</Filter>
     </ClInclude>
+    <ClInclude Include="Reader.h">
+      <Filter>Headerdateien\Framework</Filter>
+    </ClInclude>
+    <ClInclude Include="AsynchronCall.h">
+      <Filter>Headerdateien\Framework\OS</Filter>
+    </ClInclude>
+    <ClInclude Include="Random.h">
+      <Filter>Headerdateien\Framework</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Maus.cpp">
@@ -416,5 +425,11 @@
     <ClCompile Include="Animation3D.cpp">
       <Filter>Quelldateien\Framework\Grafik\3D</Filter>
     </ClCompile>
+    <ClCompile Include="Random.cpp">
+      <Filter>Quelldateien\Framework</Filter>
+    </ClCompile>
+    <ClCompile Include="AsynchronCall.cpp">
+      <Filter>Quelldateien\Framework\OS</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 155 - 0
Random.cpp

@@ -0,0 +1,155 @@
+#include "Random.h"
+#include "Zeit.h"
+#include <iostream>
+
+using namespace Framework;
+
+RandomGenerator::RandomGenerator()
+{
+    int tmp[] = 
+    {
+        3,
+        -1726662223, 379960547, 1735697613, 1040273694, 1313901226,
+        1627687941, -179304937, -2073333483, 1780058412, -1989503057,
+        -615974602, 344556628, 939512070, -1249116260, 1507946756,
+        -812545463, 154635395, 1388815473, -1926676823, 525320961,
+        -1009028674, 968117788, -123449607, 1284210865, 435012392,
+        -2017506339, -911064859, -370259173, 1132637927, 1398500161,
+        -205601318,
+    };
+    memcpy( randtbl, tmp, 32 * 4 );
+    ref = 1;
+    unsafe_state = {
+        &randtbl[ 4 ],
+        &randtbl[ 1 ],
+        &randtbl[ 1 ],
+        3,
+        31,
+        3,
+        &randtbl[ 32 ]
+    };
+    offset = 0;
+    srand( (int)time( 0 ) );
+}
+
+// Destruktor
+RandomGenerator::~RandomGenerator()
+{
+}
+
+void RandomGenerator::srand( int seed )
+{
+    this->seed = seed;
+    int type;
+    int *state;
+    long int i;
+    int word;
+    int *dst;
+    int kc;
+
+    type = unsafe_state.rand_type;
+    if( (unsigned int)type >= 5 )
+        return;
+
+    state = unsafe_state.state;
+    if( seed == 0 )
+        seed = 1;
+    state[ 0 ] = seed;
+    if( type == 0 )
+        return;
+
+    dst = state;
+    word = seed;
+    kc = unsafe_state.rand_deg;
+    for( i = 1; i < kc; ++i )
+    {
+        long int hi = word / 127773;
+        long int lo = word % 127773;
+        word = 16807 * lo - 2836 * hi;
+        if( word < 0 )
+            word += 2147483647;
+        *++dst = word;
+    }
+
+    unsafe_state.fptr = &state[ unsafe_state.rand_sep ];
+    unsafe_state.rptr = &state[ 0 ];
+    kc *= 10;
+    while( --kc >= 0 )
+        rand();
+}
+
+void RandomGenerator::setSeed( __int64 seed )
+{
+    this->offset = 0;
+    int offset = (int)(seed >> 32);
+    srand( (int)seed );
+    offset -= this->offset;
+    while( offset-- )
+        rand();
+}
+
+double RandomGenerator::rand()
+{
+    offset++;
+    int *state;
+
+    state = unsafe_state.state;
+
+    if( unsafe_state.rand_type == 0 )
+    {
+        int val = state[ 0 ];
+        val = ( ( state[ 0 ] * 1103515245 ) + 12345 ) & 0x7fffffff;
+        state[ 0 ] = val;
+        return val / 2147483647.0;
+    }
+    else
+    {
+        int *fptr = unsafe_state.fptr;
+        int *rptr = unsafe_state.rptr;
+        int *end_ptr = unsafe_state.end_ptr;
+        int val;
+
+        val = *fptr += *rptr;
+        int result = ( val >> 1 ) & 0x7fffffff;
+        ++fptr;
+        if( fptr >= end_ptr )
+        {
+            fptr = state;
+            ++rptr;
+        }
+        else
+        {
+            ++rptr;
+            if( rptr >= end_ptr )
+                rptr = state;
+        }
+        unsafe_state.fptr = fptr;
+        unsafe_state.rptr = rptr;
+        double res = result / 2147483647.0;
+        return res;
+    }
+    return 0;
+}
+
+__int64 RandomGenerator::getSeed() const
+{
+    __int64 ret = ( (__int64)offset << 32 ) | seed;
+    return ret;
+}
+
+// Erhöht den Reference Counting Zähler.
+//  return: this.
+RandomGenerator *RandomGenerator::getThis()
+{
+    ref++;
+    return this;
+}
+
+// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
+//  return: 0.
+RandomGenerator *RandomGenerator::release()
+{
+    if( !--ref )
+        delete this;
+    return 0;
+}

+ 51 - 0
Random.h

@@ -0,0 +1,51 @@
+#pragma once
+
+#include "Betriebssystem.h"
+
+namespace Framework
+{
+    class Datei;
+
+    class RandomGenerator
+    {
+    private:
+        struct random_data
+        {
+            int *fptr;		/* Front pointer.  */
+            int *rptr;		/* Rear pointer.  */
+            int *state;		/* Array of state values.  */
+            int rand_type;		/* Type of random number generator.  */
+            int rand_deg;		/* Degree of random number generator.  */
+            int rand_sep;		/* Distance between front and rear.  */
+            int *end_ptr;		/* Pointer behind state table.  */
+        };
+
+        int randtbl[ 32 ];
+        random_data unsafe_state;
+        int seed;
+        int offset;
+        int ref;
+
+        void srand( int seed );
+
+    public:
+        // Konstruktor
+        // Erzeugt einen neuen Zufallsgenerator mit dem seed des Zeitpunktes des Erzeugens
+        __declspec( dllexport ) RandomGenerator();
+        // Destruktor
+        __declspec( dllexport ) ~RandomGenerator();
+        // Gibt eine Zufallszahl zwischen 0 und 1 zurück
+        __declspec( dllexport ) double rand();
+        // Initialisiert den Gennerator mit einem Seed.
+        // Diese methode sollte möglichst nur mit seeds verwendet werden, die von getSeed zurückgegeben wurden, da der aufruf sonnst sehr lange dauern kann
+        __declspec( dllexport ) void setSeed( __int64 seed );
+        // Gibt den aktuellen Seed zurück, mit dem alle weiteren Zufallszahlen vorherbestimmt werden können
+        __declspec( dllexport ) __int64 getSeed() const;
+        // Erhöht den Reference Counting Zähler.
+        //  return: this.
+        __declspec( dllexport ) RandomGenerator *getThis();
+        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
+        //  return: 0.
+        __declspec( dllexport ) RandomGenerator *release();
+    };
+}

+ 30 - 0
Reader.h

@@ -0,0 +1,30 @@
+#pragma once
+
+#include "Betriebssystem.h"
+
+namespace Framework
+{
+    class Text;
+
+    class Reader
+    {
+    public:
+        // Setzt die Position des Bytes, das als nächstes gelesen werden soll
+        //  pos: Der Index des Bytes
+        //  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;
+        // Ließt aus der Datei
+        //  bytes: Ein Array, der mit Bytes aus der Resource gefüllt werden soll
+        //  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;
+        // 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;
+    };
+}

+ 125 - 0
Text.cpp

@@ -170,6 +170,15 @@ void Text::append( int num )
     append( ss.str().c_str() );
 }
 
+// Hängt eine Zahl ans Ende Des Textes an
+//  num: Die Zahl, die in einen Text umgewandelt und am Ende angehängt werden soll
+void Text::append( __int64 num )
+{
+    std::stringstream ss;
+    ss << num;
+    append( ss.str().c_str() );
+}
+
 void Text::append( unsigned int num )
 {
     std::stringstream ss;
@@ -992,6 +1001,13 @@ Text &Text::operator+=( const int num )
     return *this;
 }
 
+// Hängt eine Zahl ans Ende des Textes an
+Text &Text::operator+=( const __int64 num )
+{
+    append( num );
+    return *this;
+}
+
 Text &Text::operator+=( const double num )
 {
     append( num );
@@ -1048,6 +1064,13 @@ Text::operator int() const
     return TextZuInt( txt, 10 );
 }
 
+Text::operator __int64() const
+{
+    if( txt[ 0 ] == '0' && txt[ 1 ] == 'x' )
+        return TextZuInt64( ( txt + 2 ), 16 );
+    return TextZuInt64( txt, 10 );
+}
+
 Text::operator double() const
 {
     if( txt[ 0 ] == '0' && txt[ 1 ] == 'x' )
@@ -1089,6 +1112,94 @@ bool Text::operator<( Text &t ) const
     return 0;
 }
 
+// Inhalt der TextReader Klasse
+// Konstructor
+//  txt: Der Text der gelesen werden soll. Er wird nicht kopiert sondern direkt gelesen.
+TextReader::TextReader( Text *txt )
+{
+    this->txt = txt;
+    lPos = 0;
+    ref = 1;
+}
+
+// Destructor
+TextReader::~TextReader()
+{
+    txt->release();
+}
+
+// Setzt die Position des Bytes, das als nächstes gelesen werden soll
+//  pos: Der Index des Bytes
+//  ende: 1, wenn der Index vom ende des Textes zählt. 0, wenn der Index vom Beginn des Textes zählt
+void TextReader::setLPosition( __int64 pos, bool ende )
+{
+    int l = txt->getLength();
+    lPos = ende ? l - pos : lPos;
+    if( lPos < 0 )
+        lPos = 0;
+    if( lPos > l )
+        lPos = l;
+}
+
+// Ließt aus der Datei
+//  bytes: Ein Array, der mit Bytes aus dem Text gefüllt werden soll
+//  len: Wie viele Bytes aus dem Text gelesen werden sollen
+void TextReader::lese( char *bytes, int len )
+{
+    int l = txt->getLength();
+    len = (int)MIN( l - lPos, len );
+    for( __int64 i = lPos; i < lPos + len; i++ )
+        bytes[ i - lPos ] = txt->getText()[ i ];
+}
+
+// Ließt die nächste zeile des Textes ein
+//  return: Die gelesene Zeile als Text mit zeilenumbruch
+Text *TextReader::leseZeile()
+{
+    if( istEnde() )
+        return 0;
+    Text *ret = new Text( "" );
+    __int64 len = txt->getLength();
+    for( char c = 0; c != '\n' && lPos < len; )
+    {
+        lese( &c, 1 );
+        if( c )
+            ret->append( (const char*)&c, 1 );
+    }
+    return ret;
+}
+
+// Prüft, ob die Resource vollständig gelesen wurde
+//  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+bool TextReader::istEnde() const
+{
+    return lPos >= txt->getLength();
+}
+
+// Gibt den Index des Bytes aus dem Text zurück, welches als nächstes gelesen werden würde
+// return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Lesezeigers
+__int64 TextReader::getLPosition() const
+{
+    return lPos;
+}
+
+// Erhöht den Reference Counting Zähler.
+//  return: this.
+TextReader *TextReader::getThis()
+{
+    ref++;
+    return this;
+}
+
+// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
+//  return: 0.
+TextReader *TextReader::release()
+{
+    if( !--ref )
+        delete this;
+    return 0;
+}
+
 // char* operationen
 int Framework::stringPositionVonChar( char *string, char c, int num ) // sucht die position des num-ten c-s in string, -1 bei nicht gefunden
 {
@@ -1323,6 +1434,20 @@ unsigned int Framework::TextZuInt( char *c, char **c_ende, int system )
     return (unsigned int)strtol( c, c_ende, system );
 }
 
+unsigned __int64 Framework::TextZuInt64( char *c, int system )
+{
+    if( system == 16 )
+        return strtoull( c, 0, system );
+    return (unsigned __int64)strtoll( c, 0, system );
+}
+
+unsigned __int64 Framework::TextZuInt64( char *c, char **c_ende, int system )
+{
+    if( system == 16 )
+        return strtoull( c, c_ende, system );
+    return (unsigned __int64)strtoll( c, c_ende, system );
+}
+
 double Framework::TextZuDouble( char *c ) // Konvertiert c zu double
 {
     return strtod( c, 0 );

+ 57 - 1
Text.h

@@ -1,7 +1,7 @@
 #ifndef Text_H
 #define Text_H
 
-#include "Betriebssystem.h"
+#include "Reader.h"
 
 namespace Framework
 {
@@ -67,6 +67,9 @@ namespace Framework
         // Hängt eine Zahl ans Ende Des Textes an
         //  num: Die Zahl, die in einen Text umgewandelt und am Ende angehängt werden soll
         __declspec( dllexport ) void append( int num );
+        // Hängt eine Zahl ans Ende Des Textes an
+        //  num: Die Zahl, die in einen Text umgewandelt und am Ende angehängt werden soll
+        __declspec( dllexport ) void append( __int64 num );
         // Hängt eine Zahl ohne Vorzeichenbit am Ende des Textes an
         //  num: Die Zahl, die in einen Text umgewandelt und am Ende angehängt werden soll
         __declspec( dllexport ) void append( unsigned int num );
@@ -267,6 +270,8 @@ namespace Framework
         __declspec( dllexport ) Text *release();
         // Hängt eine Zahl ans Ende des Textes an
         __declspec( dllexport ) Text &operator+=( const int num );
+        // Hängt eine Zahl ans Ende des Textes an
+        __declspec( dllexport ) Text &operator+=( const __int64 num );
         // Hängt eine Kommazahl ans Ende des Textes an
         __declspec( dllexport ) Text &operator+=( const double num );
         // Hängt eine Zeichenkette ans Ende des Textes an
@@ -285,6 +290,8 @@ namespace Framework
         __declspec( dllexport ) operator char*( ) const;
         // Konviertiert den Inhalt des Textes zu einer Zahl
         __declspec( dllexport ) operator int() const;
+        // Konviertiert den Inhalt des Textes zu einer Zahl
+        __declspec( dllexport ) operator __int64() const;
         // Konviertiert den Inhalt des Textes zu einer Kommazahl
         __declspec( dllexport ) operator double() const;
         // Prüft, ob der Inhalt des Textes nach alphabetischer Ordnung später kommt als der Inhalt eines anderen Textes
@@ -293,6 +300,44 @@ namespace Framework
         __declspec( dllexport ) bool operator<( Text &t ) const;
     };
 
+    class TextReader : public Reader
+    {
+    private:
+        Text *txt;
+        __int64 lPos;
+        int ref;
+
+    public:
+        // Konstructor
+        //  txt: Der Text der gelesen werden soll. Er wird nicht kopiert sondern direkt gelesen.
+        __declspec( dllexport ) TextReader( Text *txt );
+        // Destructor
+        __declspec( dllexport ) virtual ~TextReader();
+        // Setzt die Position des Bytes, das als nächstes gelesen werden soll
+        //  pos: Der Index des Bytes
+        //  ende: 1, wenn der Index vom ende des Textes zählt. 0, wenn der Index vom Beginn des Textes zählt
+        __declspec( dllexport ) void setLPosition( __int64 pos, bool ende ) override;
+        // Ließt aus der Datei
+        //  bytes: Ein Array, der mit Bytes aus dem Text gefüllt werden soll
+        //  len: Wie viele Bytes aus dem Text gelesen werden sollen
+        __declspec( dllexport ) void lese( char *bytes, int len ) override;
+        // Ließt die nächste zeile des Textes ein
+        //  return: Die gelesene Zeile als Text mit zeilenumbruch
+        __declspec( dllexport ) Text *leseZeile() override;
+        // Prüft, ob die Resource vollständig gelesen wurde
+        //  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+        __declspec( dllexport ) bool istEnde() const override;
+        // Gibt den Index des Bytes aus dem Text zurück, welches als nächstes gelesen werden würde
+        // return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Lesezeigers
+        __declspec( dllexport ) __int64 getLPosition() const;
+        // Erhöht den Reference Counting Zähler.
+        //  return: this.
+        __declspec( dllexport ) TextReader *getThis();
+        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
+        //  return: 0.
+        __declspec( dllexport ) TextReader *release();
+    };
+
     // Durchsucht eine Zeichenkette nach dem num-ten Vorkommen eines bestimmten Buchstabens
     //  string: Die zu durchsuchende Zeichenkette
     //  c: Der zu suchende Buchstabe
@@ -332,6 +377,17 @@ namespace Framework
     //  system: Die Basis der Zahl
     //  return: Die Zahl, die im Text stand
     __declspec( dllexport ) unsigned int TextZuInt( char *c, char **c_ende, int system );
+    // Konvertiert eine Zahl aus einer Zeichenkette in belibiger Basis zu einer Zahl
+    //  c: Die Zeichenkette, in der Die Zahl steht
+    //  system: Die Basis der Zahl
+    //  return: Die Zahl, die im Text stand
+    __declspec( dllexport ) unsigned __int64 TextZuInt64( char *c, int system );
+    // Konvertiert eine Zahl aus einer Zeichenkette in belibiger Basis zu einer Zahl
+    //  c: Die Zeichenkette, in der Die Zahl steht
+    //  c_ende: Wird duch die Funktion gesetzt und darf 0 sein. Zeigt auf das nächste Zeichen in der Zeichenkette, das nach der Zah steht
+    //  system: Die Basis der Zahl
+    //  return: Die Zahl, die im Text stand
+    __declspec( dllexport ) unsigned __int64 TextZuInt64( char *c, char **c_ende, int system );
     // Konvertiert eine Zeichenkette zu einem Double
     //  c: Die Zeichenkette, die konvertiert werden soll
     //  return: Das double, was in der Zeichenkette stand