#include <iostream>
#include <string>
#include <queue>

using namespace std;
class Veiculo
{
public:
	int comprimento; //em metros
	double velocidade; //em metros/seg
	Veiculo(int c, double v): comprimento(c), velocidade(v){}
};

class ViaSemaforizada
{	
	queue<Veiculo> veiculos;
	int tempoDeVerde;
	int tempoParaProximo(Veiculo v);
	/*Este membro-dado foi incluido para facilitar o calculo do fluxo de saturacao*/
	int veiculosPorTempoDeVerde;
	/*...*/
public:
	void setTempoDeVerde(int tempo){tempoDeVerde = tempo;}
	void adicionarVeiculo(Veiculo v);
	void abrirSemaforo();
	double densidadeInstantanea();
	double fluxoSaturacao();
	void print(){ for(int i=0;i<veiculos.size();i++) cout << "."; cout << endl; }
};

int ViaSemaforizada::tempoParaProximo(Veiculo v)
{
	return static_cast<int>(v.comprimento/veiculos.front().velocidade);
}

void ViaSemaforizada::adicionarVeiculo(Veiculo v)
{
	veiculos.push(v);
}

void ViaSemaforizada::abrirSemaforo()
{
	if(veiculos.empty()) return;
	int temporizador = 0;
	/*Esta linha foi incluida para facilitar o calculo do fluxo de saturacao*/
	veiculosPorTempoDeVerde = 0;
	/*...*/
	for(int i = 0; i < tempoDeVerde; i++)
	{
		if(temporizador == 0)
		{
			Veiculo v = veiculos.front();
			veiculos.pop();
			temporizador = tempoParaProximo(v);
			/*Esta linha foi incluida para facilitar o calculo do fluxo de saturacao*/
			veiculosPorTempoDeVerde++;
			/*...*/
		}
		else temporizador--;
		print();
	}
}
double ViaSemaforizada::densidadeInstantanea()
{
	queue<Veiculo> temp = veiculos;
	double tamanhoDaFila = 0;
	for(int i = 0; i < temp.size(); i++)
	{
		Veiculo v = temp.front(); temp.pop();
		tamanhoDaFila += v.comprimento;
	}
	//densidade em Veiculos/Km
	return (veiculos.size()/tamanhoDaFila)*1000; 
}
double ViaSemaforizada::fluxoSaturacao()
{
	//fluxo de saturacao em Veiculos/hora
	return (veiculosPorTempoDeVerde*3600.0)/tempoDeVerde; 
}

int main()
{
	ViaSemaforizada via;
	via.setTempoDeVerde(20);
	via.adicionarVeiculo(Veiculo(7, 1.39)); //velocidade aproximada 5Km/h
	via.adicionarVeiculo(Veiculo(7, 1.39));
	via.adicionarVeiculo(Veiculo(7, 1.39));
	via.adicionarVeiculo(Veiculo(7, 1.39));
	via.adicionarVeiculo(Veiculo(7, 1.39));
	via.adicionarVeiculo(Veiculo(7, 1.39));
	cout << via.densidadeInstantanea() << endl;
	via.print();
	via.abrirSemaforo();
	cout << via.densidadeInstantanea() << endl;
	cout << via.fluxoSaturacao() << endl;

}

