#include <new.h>
#include "wyjatki.h"

#ifndef _WEKTOR_H
#define _WEKTOR_H

const int max_rozmiar = 20;

template <class T>
class Wektor
{
protected:
	int ile_elemntow;
	int rozmiar_tablicy;
	T* tablica_elemntow;
public:

	Wektor(int r=max_rozmiar);
	Wektor(const Wektor &);
	T &operator[](int i);
	void Dodaj(const T&);
	void UsunOstatni(){ if(ile_elemntow > 0) ile_elemntow-- ; };
	int Rozmiar(){return rozmiar_tablicy; };
	int IleElementow(){return ile_elemntow; };
	void Wyczysc(){ ile_elemntow = 0;};
	void ZwiekszRozmiar(int r);
	~Wektor(){ delete [] tablica_elemntow; };

};

template <class T>
Wektor<T>::Wektor(int r):rozmiar_tablicy(r),ile_elemntow(0)
{ 
		if (r<0) throw Wyjatek("Rozmiar nie moze byc mienjszy od zera.");
		tablica_elemntow =  new(std::nothrow) T[rozmiar_tablicy]; 
		if(tablica_elemntow == 0) throw BrakPamieci();
}

template <class T>
T& Wektor<T>::operator [](int ind)
{
	if(ind <0 || ind >=ile_elemntow) throw ZlyIndeksWektora(ind,"Wyjatek - zly indeks.");
	return tablica_elemntow[ind]; 
}

template <class T>
void Wektor<T>::ZwiekszRozmiar(int n)
{
	if(n<=ile_elemntow) return;
	T* tmp =  new(std::nothrow) T[n];
	if(tmp==0) throw BrakPamieci("Zabraklo pamieci w metodzie ZwiekszRozmiar().");
	rozmiar_tablicy = n;
	for(int i=0;i<ile_elemntow;i++) tmp[i]=tablica_elemntow[i];
	delete [] tablica_elemntow;
	tablica_elemntow = tmp;
}

template <class T>
void Wektor<T>::Dodaj(const T& w)
{
	if(ile_elemntow == rozmiar_tablicy) ZwiekszRozmiar(2*rozmiar_tablicy);
	tablica_elemntow[ile_elemntow]=w;
	ile_elemntow++;
}

template<class T>
Wektor<T>::Wektor(const Wektor& w):rozmiar_tablicy(w.rozmiar_tablicy),ile_elemntow(w.ile_elemntow)
{
	tablica_elemntow= new T[rozmiar_tablicy];
	for(int i=0;i<ile_elemntow;i++) tablica_elemntow[i]=w.tablica_elemntow[i];
}

#endif