#pragma once

#include "Reader.h"
#include "Writer.h"
#include "ReferenceCounter.h"

namespace Framework
{
    class InMemoryBuffer : public Reader, public Writer, public virtual ReferenceCounter
    {
    private:
        char **buffer;
        int readPos;
        int writePos;
        int numBuffers;
        int maxWritePos;

    public:
        DLLEXPORT InMemoryBuffer();
        DLLEXPORT ~InMemoryBuffer();
        //! 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;
        //! Schreibt in die Resource
        //! \param bytes Ein Array, der die Bytes enthält, welche in die Resource geschrieben werden soll
        //! \param len Wie viele Bytes in die Resource geschrieben werden sollen
        DLLEXPORT void schreibe( const 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;
        //! Setzt die Position des Bytes, das als nächstes geschrieben 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 setSPosition( __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 den Index des Bytes aus der Resource zurück, welches als nächstes geschrieben werden würde
        //! return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Schreibzeigers
        DLLEXPORT __int64 getSPosition() const override;
        //! Gibt die Anzahl der zu lesenden Bytes zurück
        DLLEXPORT __int64 getSize() const override;
    };
}