#ifndef _promniz_h_
#define _promniz_h_
#include "niz.h"
#include "promniz.h"
template<typename T, int U>
class PromNiz : public Niz<T, U> {
	void pisi(ostream& it) {
		Niz<T, U>::pisi(it);
	}
public:
	explicit PromNiz(const int& k = 5) : Niz<T, U>(k) {}
	PromNiz(const PromNiz& n) : Niz<T, U>(n) {}
	PromNiz& operator = (const Niz<T, U>& n);
	~PromNiz() {}
	// povecanje i smanjenje Niz<T, U>::kapaciteta
	void operator - (const int& brMes);
	void operator + (const int& brMes);

	// dodavanje podatka na niz
	PromNiz& operator += (T pod);

	// dodavanje niza na kraj niza
	PromNiz& operator += (PromNiz& n);
};

/***************** Definicije metoda *****************/
// Operator = preopterecen, primer kada je na desnoj strani
//znaka = Niz<T> a na levoj PromNiz<T>
template<typename T, int U>

PromNiz<T, U>& PromNiz<T, U>::operator = (const Niz<T, U>& n) {
	if (this != &n) {
		Niz<T, U>::brisi();
		Niz<T, U>::kopiraj(n);
	}
	return *this;
}

// Smanjenje kapaciteta niza
template<typename T, int U>
void PromNiz<T, U>::operator - (const int& brMes) {
	if (Niz<T, U>::kap - brMes <= 0)
		throw GKapacitet();
	Niz<T, U>::brPod = ((Niz<T, U>::kap -= brMes) > Niz<T, U>::brPod ?
						 Niz<T, U>::brPod : Niz<T, U>::kap);
	T* novNiz = new T[Niz<T, U>::kap];
	for (int i = 0; i < Niz<T, U>::brPod; i++)
		novNiz[i] = Niz<T, U>::niz[i];
	delete[] Niz<T, U>::niz;
	Niz<T, U>::niz = novNiz;
}

// Povecanje kapaciteta niza
template<typename T, int U>
void PromNiz<T, U>::operator + (const int& brMes) {
	T* novNiz = new T[Niz<T, U>::kap += brMes];
	for (int i = 0; i < Niz<T, U>::brPod; i++)
		novNiz[i] = Niz<T, U>::niz[i];
	delete[] Niz<T, U>::niz;
	Niz<T, U>::niz = novNiz;
}

// Dodavanje podatka na kraj niza uz povecanje kapaciteta po potrebi
template<typename T, int U>
PromNiz<T, U>& PromNiz<T, U>::operator += (T pod) {
	if (Niz<T, U>::brPod == Niz<T, U>::kap)
		*this + 1;
	Niz<T, U>::niz[Niz<T, U>::brPod++] = pod;
	return *this;
}

// Dodavanje niza na kraj niza uz povecanje kapaciteta po potrebi
template<typename T, int U>
PromNiz<T, U>& PromNiz<T, U>::operator +=(PromNiz<T, U>& n) {
	if (Niz<T, U>::kap - Niz<T, U>::brPod < n.getBrPod())
		*this + (n.getBrPod() - Niz<T, U>::kap + Niz<T, U>::brPod + 1);
	for (int i = Niz<T, U>::brPod, j = 0; i < Niz<T, U>::brPod + n.getBrPod(); i++)
		Niz<T, U>::niz[i] = n[j++];
	Niz<T, U>::brPod += n.getBrPod();
	return *this;
}
#endif