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

with Ada.text_io, Ada.Strings.Unbounded, ustrings, tablasrecolocacion;
use Ada.text_io, Ada.Strings.Unbounded, ustrings;
package aeropuertos is
	
	type rdestino;
	type listadestinos is access rdestino;
	type rdestino is 
		record
			nombre:ustring;
			sig:listadestinos;
		end record;	
	
	type aeropuerto is limited private; 

function h(nom:ustring;m:integer) return integer;
--hash por método de la división con módulo m

procedure crear(l:in listadestinos;a:out aeropuerto);
--Post: a:=crea(l)

procedure abrir(a:in out aeropuerto;l:in listadestinos);
--Pre: a.abiertas<P and a=a0
--Post: a:=abre(a0,l)

procedure asignarPista(a:in out aeropuerto;v:in ustring;d:in ustring);
--Pre: v no existe en a and d está en a.losdest and a=a0
--Post: a:=asignaPista(a0,v,d)

procedure despegar(a:in out aeropuerto;n:in integer);
--Pre: n<=a.abiertas and a.laspistas(n).numvuelos<>0 and a=a0
--Post: a:=despega(a0,n)

function cuantosDelante(a:aeropuerto;v:ustring) return integer;
--Pre: v existe en a
--Post: devuelve cuántosDelante(a,v)

private

max:constant:=293;-- depende del número de destinos (eldoble, primo)
max2:constant:=293;-- depende del número de vuelos (eldoble, primo)
P:constant:=30;--número de pistas

type rpista;
type ptpista is access rpista;		
type rpista is
	record
		valor: integer;
		sig: ptpista;
	end record;		

-- clave destino, valor pistas para ese
-- destino		
package mitabla is new
	tablasrecolocacion(ustring, ptpista, max, h);
use mitabla;

type rvuelo;
type ptvuelo is access rvuelo;
type rvuelo is 
	record
		nombre: ustring; -- nombre del vuelo
		pista: integer;
		posicion: integer; -- número en la cola
		sig: ptvuelo; -- siguiente en la cola
	end record;

package mitabla2 is new
	tablasrecolocacion(ustring,ptvuelo, max2, h);

use mitabla2;



type pista is
	record
		numvuelos: integer;
		primcola, ultcola: ptvuelo;
	end record;
	
type vpistas is array(integer range 1..P) of pista;
type aeropuerto is 
	record
		losdest: mitabla.tabla;
		losvuelos: mitabla2.tabla;
		nabiertas: integer;
		laspistas: vpistas;
	end record;	 		
end aeropuertos;	


syntax highlighted by Code2HTML, v. 0.9.1