#pragma once

#include <iostream>

#include "Betriebssystem.h"

namespace Framework
{
    class Text;

    class StreamWriter
    {
    public:
        //! 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
        virtual void schreibe(const char* bytes, int len) = 0;
        //! Prüft, ob die Resource vollständig geschrieben wurde
        //!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
        virtual bool istEnde() const = 0;
    };

    class Writer : public StreamWriter
    {
    public:
        //! 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
        virtual void setSPosition(__int64 pos, bool ende) = 0;
        //! 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
        virtual __int64 getSPosition() const = 0;
        //! Gibt die Anzahl der zu schreibenden Bytes zurück
        virtual __int64 getSize() const = 0;
    };

    class OStreamWriter : public StreamWriter
    {
    private:
        std::ostream& out;

    public:
        __declspec(dllexport) OStreamWriter(std::ostream& out);
        __declspec(dllexport) void schreibe(
            const char* bytes, int len) override;
        __declspec(dllexport) bool istEnde() const override;
    };
} // namespace Framework