#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();
    };
}