-- AUTOR: Elvira Mayordomo Cámara
-- PROYECTO: módulo de implementación del
-- TAD aeropuertos solución del ejercicio 9 de
-- tablas hash
-- FICHERO: aeropuertos.adb
-- FECHA: 7-1-04

with ustrings, Ada.Strings.Unbounded, unchecked_deallocation;
use ustrings, Ada.Strings.Unbounded;
package body aeropuertos is

procedure disponer is new unchecked_deallocation(rvuelo,ptvuelo);

function h(nom:ustring;m:integer) return integer is
--hash por método de la división con módulo m
res:integer;
begin
	res:=0;
	for i in 1..length(nom) loop
		res:=res+character'pos(Element(nom,i));
	end loop;
	return res mod m;	
end h;

procedure crear(l:in listadestinos;a:out aeropuerto) is
--Post: a:=crea(l)
begin
	tablavacia(a.losdest);
	tablavacia(a.losvuelos);
	a.nabiertas:=0;
end crear;

procedure abrir(a:in out aeropuerto;l:in listadestinos) is
--Pre: a.nabiertas<P and a=a0
--Post: a:=abre(a0,l)
l2:listadestinos;
aux:ptpista;
begin
	a.nabiertas:=a.nabiertas+1;
	a.laspistas(a.nabiertas):=(0,null,null);
	l2:=l;
	while l2/=null loop
		if esta(a.losdest,l2.nombre) then
			aux:=consultar(a.losdest,l2.nombre);
			aux:=new rpista'(a.nabiertas,aux);
		else	
			aux:=new rpista'(a.nabiertas,null);
		end if;
		modificar(a.losdest,l2.nombre,aux);
		l2:=l2.sig;
	end loop;						
end abrir;

procedure asignarPista(a:in out aeropuerto;v:in ustring;d:in ustring) is
--Pre: v no existe en a and d está en a.losdest and a=a0
--Post: a:=asignaPista(a0,v,d)
masvacia:integer;
p:ptpista;
begin
	p:=consultar(a.losdest,d);
	masvacia:=p.valor;
	while p/=null loop
		if
a.laspistas(p.valor).numvuelos<a.laspistas(masvacia).numvuelos then
			masvacia:=p.valor;
		end if;	
		p:=p.sig;
	end loop;

a.laspistas(masvacia).numvuelos:=a.laspistas(masvacia).numvuelos+1;
	if a.laspistas(masvacia).numvuelos=1 then
		a.laspistas(masvacia).primcola:=new
		rvuelo'(v,masvacia,1,null);
		a.laspistas(masvacia).ultcola:=a.laspistas(masvacia).primcola;
	else	
		a.laspistas(masvacia).ultcola.sig:=new

rvuelo'(v,masvacia,a.laspistas(masvacia).numvuelos,null);
		a.laspistas(masvacia).ultcola:=a.laspistas(masvacia).ultcola.sig;
	end if;

modificar(a.losvuelos,v,a.laspistas(masvacia).ultcola);
end asignarPista;

procedure despegar(a:in out aeropuerto;n:in integer) is
--Pre: n<=a.nabiertas and a.laspistas(n).numvuelos<>0 and a=a0
--Post: a:=despega(a0,n)
p:ptvuelo;
begin
	p:=a.laspistas(n).primcola;
	a.laspistas(n).primcola:=a.laspistas(n).primcola.sig;
	a.laspistas(n).numvuelos:=a.laspistas(n).numvuelos-1;
	if a.laspistas(n).numvuelos=0 then a.laspistas(n).ultcola:=null; end if;
	borrar(a.losvuelos,p.nombre);
	disponer(p);
end despegar;

function cuantosDelante(a:aeropuerto;v:ustring) return integer is
--Pre: v existe en a
--Post: devuelve cuántosDelante(a,v)
j,p:integer;
begin
	j:=consultar(a.losvuelos,v).posicion;
	p:=consultar(a.losvuelos,v).pista;
	return(j-a.laspistas(p).primcola.posicion);
end cuantosDelante;

end aeropuertos;	


syntax highlighted by Code2HTML, v. 0.9.1