/*
author:
	seth from http://www.bierdatenbank.de
tab size:
	2 (otherwise hardly readable!)
*/
#ifndef __seth_standard_h
#define __seth_standard_h

#include <ctime>

namespace seth_std{
	template<typename T>
	int sgn(T, int=0);							// liefer sgn(a, sgn(0)) (vorzeichenfunktion)
	int pow(int, int=2);						// liefer x^y x,y int, y>=0

	class mem_usage{								// speichernutzungs-informationen
	private:
		static int mem_in_use;				// momentan benutzter speicher
		static int max_mem_in_use;		// max. benutzter speicher
	public:
		mem_usage(){}
		static int get_max_mem();			// liefer max_mem_in_use
		static int mem_info(bool=1);	// speichernutzungs-informationen
		static int used_mem(int);			// speicher der benutzt wird
		static int released_mem(int);	// speicher der freigegeben wird
	};

	class chronometer{							// zeitmessung
	private:
		clock_t t_start, t_end;
	public:
		chronometer(){}
		void start_time();						// starte uhr
		void stop_time();							// stoppe uhr
		unsigned time_info(bool=1);		// zeit_mess_informationen
	};

	template<typename T>
	class punkt2d{									// punkt2d
	public:
		T x, y;																					// koordinaten
		punkt2d(){}																			// ctor
		punkt2d(T, T);																	// ctor
		punkt2d(const punkt2d<T>& source);							// copy-ctor
		punkt2d<T>& operator=(const punkt2d<T>&);				// operator= (punkt2d)
		punkt2d<T>& operator=(T);												// operator= (skalar)
		punkt2d<T>  operator-();												// unitaerer operator -pt
		punkt2d<T>  operator+(const punkt2d<T>&) const;	// pt+pt = pt
		punkt2d<T>& operator+=(const punkt2d<T>&);			// pt+=pt = pt
		punkt2d<T>  operator+(T) const;									// pt+s = pt (komponentenweise)
		punkt2d<T>& operator+=(T);											// pt+=s = pt
		punkt2d<T>  operator-(const punkt2d<T>&) const;	// pt-pt = pt
		punkt2d<T>& operator-=(const punkt2d<T>&);			// pt-=pt = pt
		punkt2d<T>  operator-(T) const;									// pt-s = pt (komponentenweise)
		punkt2d<T>& operator-=(T);											// pt-=s = pt
		punkt2d<T>  operator*(const punkt2d<T>&) const;	// pt*pt = pt (komponentenweise)
		punkt2d<T>& operator*=(const punkt2d<T>&);			// pt*=pt = pt
//	friend punkt2d operator*(T, const punkt2d<T>&);	// s*pt = pt (komponentenweise)
		punkt2d<T>  operator*(T) const;									// pt*s = pt (komponentenweise)
		punkt2d<T>& operator*=(T);											// pt*=s = pt
		punkt2d<T>  operator/(const punkt2d<T>&) const;	// pt/pt = pt (komponentenweise)
		punkt2d<T>& operator/=(const punkt2d<T>&);			// pt/=pt = pt
		punkt2d<T>  operator/(T) const;									// pt/s = pt (komponentenweise)
		punkt2d<T>& operator/=(T);											// pt/=s = pt
		bool operator==(const punkt2d<T>&) const;				// operator==
		bool operator!=(const punkt2d<T>&) const;				// operator!=
		bool operator< (const punkt2d<T>&) const;				// operator<
		bool operator<=(const punkt2d<T>&) const;				// operator<=
		bool operator> (const punkt2d<T>&) const;				// operator>
		bool operator>=(const punkt2d<T>&) const;				// operator>=
		bool operator==(T) const;												// operator== (skalar)
		bool operator!=(T) const;												// operator!= (skalar)
		bool operator< (T) const;												// operator<  (skalar)
		bool operator<=(T) const;												// operator<= (skalar)
		bool operator> (T) const;												// operator>  (skalar)
		bool operator>=(T) const;												// operator>= (skalar)
		punkt2d<T> abs() const;													// absolutbetrag
		T norm() const;																	// norm
		T norm2() const;																// norm*norm
		T skp(punkt2d<T>) const;												// standard-skalarprodukt
		void nrotate(int=1);														// drehe einen moore-nachbarschafts-vektor
	};
	template<typename T>
	punkt2d<T> fabs(const punkt2d<T>&);								// absolutbetrag
}
#endif


