#include "Vrednost.h"

	Vrednost* Broj::Plus (Vrednost* v)
	{
		return v->PlusBroj(this);
	}

	Vrednost* Broj::PlusSkup(Skup* s)
	{
		return s->PlusBroj(this);
	}
	
	Vrednost* Broj::PlusBroj(Broj* b)
	{
		return new Broj(_broj + b->_broj);
	}


	Vrednost* Broj::Puta (Vrednost* v)
	{
		return v->PutaBroj(this);
	}

	Vrednost* Broj::PutaSkup(Skup* s)
	{
		return s->PutaBroj(this);
	}
	
	Vrednost* Broj::PutaBroj(Broj* b)
	{
		return new Broj(_broj * b->_broj);
	}


	Vrednost* Skup::Plus(Vrednost* v)
	{
		return v->PlusSkup(this);
	}

	Vrednost* Skup::PlusSkup(Skup* s)
	{
		set<int>* unija = new set<int>();
		set_union(_skup->begin(), _skup->end(), s->_skup->begin(), s->_skup->end(), inserter(*unija, unija->begin()));
		return new Skup(unija);  
	}

	Vrednost* Skup::PlusBroj(Broj* b)
	{	set<int>* novi = new set<int>();
		set<int>::iterator i;
		for (i = _skup->begin(); i != _skup->end(); i++)
			novi->insert(*i + b->GetBroj());
		return new Skup(novi); 
	}



	Vrednost* Skup::Puta(Vrednost* v)
	{
		return v->PutaSkup(this);
	}

	Vrednost* Skup::PutaSkup(Skup* s)
	{
		set<int>* presek = new set<int>();
		set_intersection(_skup->begin(), _skup->end(), s->_skup->begin(), s->_skup->end(), inserter(*presek, presek->begin()));
		return new Skup(presek);  
	}

	Vrednost* Skup::PutaBroj(Broj* b)
	{	set<int>* novi = new set<int>();
		set<int>::iterator i;
		for (i = _skup->begin(); i != _skup->end(); i++)
			novi->insert(*i * b->GetBroj());
		return new Skup(novi); 
	}



