http://www.adaconcept.com/programs/metros_szimulacio/metros_szimulacio_elemei.ads
-- Nehany fontos megjegyzes:
-- a megvalositas soran meg nem hasznalunk gyerekcsomagokat (, majd a halado programoknal :) )
-- Egy taszk a szulo (programegyseg) deklarácios reszenek kiertekelese utan, a szulo elso utasitasa elott, vagy az allokator kiertekelesekor indul el
-- Minden entry-hez kell lennie legalabb egy accept utasitasnak a taszk torzseben
-- Minden entry kulon varakozasi sorral rendelkezik, amelybe a hivok beallhatnak (szamukat az entry 'Count attributumaval kerdezhetjuk le, amennyiben szuksegunk van ra)
-- Az accept utasitas blokkol!, (select eseten az egyik nyitott agra erkezo hivas elfogadasaig)
-- ( Tovabbi fontos attributumok: 'Callable , 'Terminated )


package metros_szimulacio_elemei is

   Metrok_szama : constant positive := 2;                                                     -- a szimulacioban resztvevo metrok szama

   type M_string is access string;

   package Peronfal is

      -- Biztonsagkritikus rendszerekben gyakran hasznalt trukk: "interface jellegu" biztonsagi megoldas
      -- azert generikus, mert igy a Peronfal hasznaloja veletlenul nem tudja meghivni, csak, ha peldanyositja a hivas elott,
      -- (igy pl. nehezebb gepelesi hiba miatt hibas funkcionalitast leprogramozni)
      -- A generikus eljaras a kovetkezo hivast tartalmazza:
      --    Fal.Utasok_szerelvenyre_engedesenek_megtiltasa;                                   -- az ilyen kommentek nehezitik a kesobbi karbantartast
      generic
      procedure Utasok_szerelvenyre_engedesenek_megtiltasa;


      -- az elozo megoldas egy valtozata amelyben a Peronfal_taszk-ot ket fuggetlen taszk-ra valsztjuk szet ( + beagyazas ), a kommunikacio a ket taszk kozott egy privat vedett egysegen keresztul tortenik
      package Utas is
         task Peronfal_taszk is
            entry Metrora_var(varakozo_utas_neve : M_string);                                 -- ennek az entry-nek a varakozasi soraba allnak majd be az utasok
         end Peronfal_taszk;
      end Utas;


      package Szerelveny is
         task Peronfal_taszk is
            entry Szerelveny_beall_az_allomasra(varakozo_szerelveny_szama : M_string);        --| ezeknek az entry-knek a varakozasi soraiba allnak majd be a szerelvenyek
            entry Szerelveny_elhagyja_az_allomast(varakozo_szerelveny_szama : M_string);      --|
         end Peronfal_taszk;
      end Szerelveny;



   private

      type peronfal_allapotok is (ajtok_zarva, ajtok_nyitva);

      protected Fal is

         -- Az "aktualis_peronfal_allapot" valtozo ertekenek lekerdezesere szolgalo fuggveny
         function Allapot return peronfal_allapotok;

         -- Az "utasok_szerelvenyre_engedese_engedelyezett" valtozo ertekenek lekerdezesere szolgalo fuggveny
         function Engedhetok_utasok_a_szerelvenyre return boolean;

         -- Az "aktualis_peronfal_allapot" valtozo erteket "ajtok_zarva" allapotra allitja, ha az "ajtok_nyitva" allapotban van
         entry Ajtot_zar;

         -- Az "aktualis_peronfal_allapot" valtozo erteket "ajtok_nyitva" allapotra allitja, ha az "utasok_szerelvenyre_engedese_engedelyezett" (= true) es az "ajtok_zarva" allapotban van
         entry Ajtot_nyit;

         -- Az "utasok_szerelvenyre_engedese_engedelyezett" valtozo erteket hamisra allitja
         procedure Utasok_szerelvenyre_engedesenek_megtiltasa;

      private
         utasok_szerelvenyre_engedese_engedelyezett : boolean := true;
         aktualis_peronfal_allapot : peronfal_allapotok := ajtok_zarva;
      end Fal;


   end Peronfal;


   package Szerelvenyek is

      task type Metro_taszk_tipus(szerelveny_szam : M_string);                                -- csak taszk tipus-nak lehet diszkriminansa / parametere

      type M_Metro is access Metro_taszk_tipus;                                               -- mutato tipus gyujtotipusa egy taszk tipus

      type metrok is array(positive range <>) of M_Metro;

   private
      type metro_allapotok is (egyeb, allomason_varakozik, halad);                            -- egyeb pl. garazsban all...


   end Szerelvenyek;


   package Emberek is

      task type Utas(utas_nev : M_string);

      type M_Utas is access Utas;                                                             -- mutato tipus gyujtotipusa egy taszk tipus

      task Turelmetlen_utas;                                                                  -- nincsen parametere, nem tipus

   end Emberek;

   metroszerelvenyek : Szerelvenyek.metrok(1..Metrok_szama);

 private


    -- Szemafor megvalositasa taszk-tipussal, szamlaloval
   task type Szemafor_taszk_tipus(atengedheto_metrok_szama : natural) is
      entry P;   -- Dijkstra utan...
      entry V;   -- Dijkstra utan...
   end Szemafor_taszk_tipus;

   Szemafor : Szemafor_taszk_tipus(Metrok_szama);                                             -- probaljuk ki mi torteneik, ha ide 0 -at irunk Metrok_szama helyett



end metros_szimulacio_elemei;