#ifndef Text_H
#define Text_H

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

namespace Framework
{
	class Text; // aus dieser Datei
	class TextArray; // aus dieser Datei

	class Text // Ein ersatz für string ( nur zur übung ) char[]
	{
	private:
		char *txt;
		int ref;

	public:
		// Kostruktor 
		Text();
		Text( const char *txt );
		// Destruktor 
		~Text();
		// nicht constant 
		void setText( const char *t ); // ersetzt den Text
		void setText( const char *t, int l ); // ersetzt den Text
		void setText( Text *t );
		void anhängen( const char *t ); // hängt an den Text an
		void anhängen( const char *t, int l ); // hängt an den Text an
		void anhängen( Text *t );
		void anhängen( int num ); // hängt num an den Text an
		void anhängen( unsigned int num );
		void einfügen( int p, char c ); // Fügt an stelle p ein
		void einfügen( int p, const char *t );
		void einfügen( int p, Text *t );
		void ersetzen( int p1, int p2, const char *t ); // Ersetzt den Text von p1 bis p2 ( p2 bleibt da )
		void ersetzen( int p1, int p2, Text *t );
		void ersetzen( char c1, char c2 ); // ersetzt jedes c1 durch c2
		void ersetzen( const char *t1, const char *t2 ); // ersetzt jedes t1 durch t2
		void ersetzen( Text *t1, const char *t2 );
		void ersetzen( const char *t1, Text *t2 );
		void ersetzen( Text *t1, Text *t2 );
		void ersetzen( int i, char c1, char c2 ); // ersetzt das i-te c1 durch c2
		void ersetzen( int i, const char *t1, const char *t2 ); // ersetzt das i-te t1 durch t2
		void ersetzen( int i, Text *t1, const char *t2 );
		void ersetzen( int i, const char *t1, Text *t2 );
		void ersetzen( int i, Text *t1, Text *t2 );
		void füllText( char c, int län ); // setzt den Text zu so vielen c wie län groß ist
		void löschen( int p ); // löscht p
		void löschen( int p1, int p2 ); // löscht von p1 zu p2 ( p2 bleibt da )
		void löschen( char c ); // löscht jetes c
		void löschen( const char *t ); // löscht jetes t
		void löschen( Text *t );
		void löschen( int i, char c ); // löscht das i-te c
		void löschen( int i, const char *t ); // löscht das i-te t
		void löschen( int i, Text *t );
		// constant 
		int getLänge() const; // gibt die Text länge zurück
		int getLKick( int pos );
		int getOKick( int pos );
		int getRKick( int pos );
		int getUKick( int pos );
		bool hat( Text *t ) const; // enthält der Text t
		bool hat( const char *t ) const;
		bool hat( char c ) const; // enthält c
		bool istGleich( const char *t ) const; // prüft ob det Text gleich t ist
		bool istGleich( Text *t ) const; // enthält c
		char *getText() const; // gibt Text zurück
		int anzahlVon( char c ) const; // gibt die Anzahl von c im Text zurück
		int anzahlVon( const char *t ) const; // gibt die Anzahl von t im Text zurück
		int anzahlVon( Text *t ) const;
		int positionVon( char c ) const; // gibt die Position des ersten c zurück
		int positionVon( const char *t ) const; // gibt die Position des ersten t zurück
		int positionVon( Text *t ) const;
		int positionVon( char c, int i ) const; // gibt die Position des i-ten c zurück
		int positionVon( const char *t, int i ) const; // gibt die Position des i-ten t zurück
		int positionVon( Text *t, int i ) const;
		Text *getTeilText( int p1, int p2 ) const; // gibt den Text von p1 bis p2 zurück
		Text *getTeilText( int p ) const; // gibt den Text von p bis zum Ende zurück
		// Reference Counting
		Text *getThis();
		Text *release();
	};

	class TextArray
	{
	private:
		Text *This;
		TextArray *next;
		int index;

	public:
		// konstruktor 
		TextArray();
		// destruktor 
		~TextArray();
		// nicht constant 
		void addText( Text *txt ); // fügt einen Text hinzu
		void addText( const char *txt );
		bool löscheText( Text *txt, bool eins ); // löscht einen Text
		bool löscheText( unsigned char *txt, bool eins );
		bool löscheText( int index, bool eins );
		void setNext0(); // setzt den next Zeiger auf null
		void setIndex( int i ); // setzt den index
		// constant 
		Text *getText( int index ) const; // gibt den i-ten Text zurück
		Text *zText( int index ) const;
		TextArray *getNext() const; // gibt den next Zeiger zurück
		Text *getThis() const; // gibt den This zeiger zurück
	};

	// Andere Funktionen 
	void ZuWCharT( const char *txt, wchar_t *res ); // wandelt in wchar_t um
	void ZuChar( const wchar_t *txt, char *res ); // wandelt in char um
	char KleinOrGroß( char c, bool groß ); // wandelt c in Klein - oder Großbuchstabe um
	bool istSchreibbar( unsigned char zeichen ); // prüft, ob zeichen ein Schreibbarer Buchstabe ist
	unsigned int TextZuInt( char *c, int system ); // Konvertiert c zu int
	unsigned int TextZuInt( char *c, char **c_ende, int system );
	char *convert( char *txt, int *error, int *l ); // konvertiert den Text
	char *deConvert( char *txt ); // dekonvertiert den Text
	int textLänge( const char *txt ); // gibt die Länge von txt zurück
}
#endif