#include "wektor.h"
#include "wyjatki.h"
#include <iostream>
#include <cstdlib>
#include <algorithm>

using namespace std;

int main()
{


	Wektor<int> liczby;
	cout << "Tworze pusty wektor" << endl;
	cout << "Rozmiar " << liczby.Rozmiar() << " elementow " << liczby.IleElementow() << endl;

	cout << "\nTworze pusty wektor o  rozmiarze 100" << endl;
	Wektor<double> liczby2(100);
	cout << "Rozmiar " << liczby2.Rozmiar() << " elementow " << liczby2.IleElementow() << endl;

	cout << "\nDodaje 50 liczb do wektora" << endl;
	for(int i=0;i<50;i++)
	{
		liczby.Dodaj(i);
		cout << "Wektor= ";
		for(int j=0;j<liczby.IleElementow();j++) cout << liczby[j] << " ";
		cout << endl;
		cout << "Rozmiar " << liczby.Rozmiar() << " elementow " << liczby.IleElementow() << endl;
	}

	cout << "\nKopiuje elementy do nowego wektora" << endl;
	Wektor<int> wektor2=liczby;
	cout << "Wektor= ";
	for(int j=0;j<liczby.IleElementow();j++) cout << liczby[j] << " ";
	cout << endl;
	cout << "Rozmiar " << liczby.Rozmiar() << " elementow " << liczby.IleElementow() << endl;

	cout << "\nUsuwam wszystko z wektora" << endl;
	while(liczby.IleElementow()>0)
	{
		liczby.Usun();
		cout << "Wektor= ";
		for(int j=0;j<liczby.IleElementow();j++) cout << liczby[j] << " ";
		cout << endl;
		cout << "Rozmiar " << liczby.Rozmiar() << " elementow " << liczby.IleElementow() << endl;

	}


	/* Losowanie Lotto */

	    liczby.Wyczysc();

		for(int i=1;i<=49;i++) liczby.Dodaj(i);

		cout << "Zawartosc komory losujacej\n";
		Wektor<int>::iterator it;
		for(it=liczby.begin();it!=liczby .end();it++) cout << *it << " ";
		cout << endl;

		srand(time(NULL));

		cout << "Random shuffle (losowanie numerow lotto)\n";
		random_shuffle(liczby.begin(),liczby.end());
		for(it=liczby.begin();it!=liczby.begin()+6;it++) cout << *it << " ";
		cout << endl;


	/* TEST SYTUACJI WYJATKOWYCH  */

	char *komunikat="\nUruchom wyjatkowa sytuacje:\n\t1 - zly indeks\n\t2 - zla inicjalizacja konstruktora\n\t3 - przepelnienie pamieci\n\t4 - inny wyjatek\n\t5 - bez sytuacji wyjatkowych\n\t0 - koniec\n";
	
	int wybor=-1;
	cout << "Program testujacy rzucanie wyjatkow.\n";
	while(wybor)
	{
		try
		{
			cout << komunikat; 
			cin >> wybor;
		
			switch(wybor)
			{
				case 1 :
				{
					Wektor<int> wektor1;
					
					wektor1[-10]=1;
					break;
				}
				case 2:
				{
					Wektor<char> wektor2(-2);
					wektor2.Dodaj('a');
					break;
				}
				case 3:
				{
					int rozmiar=1;
					while(1)
					{
						cout << "Rozmiar: " << rozmiar << " kB" << endl;
						Wektor<char> c(rozmiar*1024);		// w koncu zabraknie pamieci
						rozmiar*=2;
					}
					break;
				}
				case 4:
				{
					int x=5;
					throw x;
					break;
				}
				case 5:
				case 0:
					break;
				default:
					cout << "A co to za numer?\n";
			}

			cout << "Nie wystapil zaden wyjatek" << endl;
		}
		catch(BrakPamieci &w)
		{
			cout << "Zlapalem wyjatek typu: BrakPamieci" << endl;
			cout << w.Komunikat();
		}
		catch(ZlyIndeksWektora &w)
		{
			cout << "Zlapalem wyjatek typu: ZlyIndeksWektora" << endl;
			cout << w.Komunikat();
		}
		catch(Wyjatek &w)
		{
			cout << "Zlapalem wyjatek typu: Wyjatek" << endl;
			cout << w.Komunikat();
		}
		catch(...)
		{
			cout << "Wystapil niezidentyfikowany wyjatek\n";
		}
	}

}
