#pragma once

#include "Array.h"
#include "Critical.h"

namespace Framework
{
    class Textur; //! Textur.h

    //! Verwaltet alle geladenen Texturdaten, so dass mehrere Zeichnungen die
    //! selben Daten benutzen k�nnen
    class TexturList : public virtual ReferenceCounter
    {
    private:
        static int id;
        static Critical cs;
        RCArray<Textur>* textures;
        RCArray<Text>* names;

    public:
        //! Konstruktor
        TexturList();
        //! Destruktor
        ~TexturList();
        //! L�scht alle Texturen
        DLLEXPORT void leeren();
        //! F�gt der Liste eine Textur hinzu
        //! \param t Die Textur
        //! \param name Der name, unter dem die Textur in der Liste gespeichert
        //! wird
        DLLEXPORT bool addTextur(Textur* t, const char* name);
        //! Entfernt eine Textur aus der Liste
        //! \param name Der Name der Textur
        DLLEXPORT void removeTextur(const char* name);
        //! �berpr�ft, ob unter einem bestimmten Namen eine Textur abgespeichert
        //! wurde \param name Der Name \return true, wenn eine Textur mit dem
        //! Namen existiert
        DLLEXPORT bool hatTextur(const char* name) const;
        //! Gibt eine bestimmte Textur zur�ck
        //! \param name Der Name der Textur
        DLLEXPORT Textur* getTextur(const char* name) const;
        //! Gibt eine bestimmte Textur zur�ck
        //! \param id Die Id der Textur
        DLLEXPORT Textur* getTextur(int id) const;
        //! Gibt eine bestimmte Textur ohne erh�hten Reference Counter zur�ck
        //! \param name Der Name der Textur
        DLLEXPORT Textur* zTextur(const char* name) const;
        //! Gibt eine bestimmte Textur ohne erh�hten Reference Counter zur�ck
        //! \param id Die Id der Textur
        DLLEXPORT Textur* zTextur(int id) const;
        //! Initialisiert statische private member. Wird vom Framework
        //! automatisch aufgerufen.
        static void init();
        //! L�scht statische private member. Wird vom Framework automatisch
        //! aufgerufen.
        static void destroy();
    };
} // namespace Framework