#pragma once

#include "Reader.h"
#include "ReferenceCounter.h"
#include "Writer.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;
    };
} // namespace Framework