Example #1
0
Pista* Semaforo::passaCarro() {
	Carro* carro = pistaLocal->primeiro();
	int pistaEscolhida = calculaProbabilidade(carro);
	Pista* proxima = pistas->retornaDado(pistaEscolhida);
	if (!aberto) {
	    throw ExcecaoSinalVermelho();
	}
	if (!proxima->estaCheia(carro)) {
		pistaLocal->removeCarro();
		proxima->adicionaCarro(carro);
		return proxima;
	} 
	proxima = pistaLocal;
	return proxima;
}
/* Método passaCarro.
* Este método será responsável por fazer um carro passar pelo semáforo, adicionando-o em outra fila (outra pista) e
* removendo o mesmo da fila atual.
* @see FilaEnc::primeiro
* @see calculaProbabilidade
* @see estaCheia
* @see removeCarro
* @see adicionaCarro
* @exception ExcecaoSinalVermelho Se o sinal estiver vermelho o carro não poderá passar para outra pista.
* @return proxima Retornará qual será a próxima pista em que o carro estará.
*/
	Pista* passaCarro() {
		Carro* c = pistaLocal->primeiro();

		int pistaEscolhida = calculaProbabilidade(c);
		Pista* proxima = pistas->mostra(pistaEscolhida);
		if(isAberto()) {
			if (!proxima->estaCheia(c)) {
				pistaLocal->removeCarro();
				proxima->adicionaCarro(c);
				return proxima;
			} else {
				proxima = pistaLocal;
			}
		} else {
			throw ExcecaoSinalVermelho;
		}
		return proxima;
	}