5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.

Hasonló dokumentumok
Programozási nyelvek (ADA)

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

4. előadás Az Ada típusai és típuskonstrukciós eszközei, II. Rekordok és átlátszatlan típusok. A csomagok. Adatabsztrakció, egységbe zárás.

8. előadás Dinamikus memóriakezelés. Mutatók. Láncolt adatszerkezetek.

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

PROGRAMOZÁSI NYELVEK - ADA. GYAKORLAT JEGYZET

6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.

2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok

7. előadás Paraméterátadás. Paraméterek az Adában. Túlterhelés. Felüldefiniálás. Kifejezések.

Alprogramok, paraméterátadás

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Programozási nyelvek Java

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

C++ Standard Template Library (STL)

Programozási nyelvek Java

Generikus osztályok, gyűjtemények és algoritmusok

Programozás alapjai. 5. előadás

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Programozási technológia

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Kifejezések. Kozsik Tamás. December 11, 2016

Programozási nyelvek Java

JAVA PROGRAMOZÁS 2.ELŐADÁS

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

.Net adatstruktúrák. Készítette: Major Péter

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Bevezetés a programozásba 2

OOP: Java 8.Gy: Abstract osztályok, interfészek

Programozási nyelvek Java

3. előadás Típusrendszerek. Az Ada típusai és típuskonstrukciós eszközei, I.

Algoritmizálás és adatmodellezés tanítása 1. előadás

Collections. Összetett adatstruktúrák

és az instanceof operátor

Generikus Típusok, Kollekciók

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Java programozási nyelv 5. rész Osztályok III.

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Programozás II. 2. Dr. Iványi Péter

Bevezetés, a C++ osztályok. Pere László

Interfészek. PPT 2007/2008 tavasz.

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Fejlett programozási nyelvek C++ Iterátorok

Tervminták II. (Híd, Bejáró, Gyártófüggvény) Halmaz és bejárása Osztály-sablonok

Programozási nyelvek (ADA)

A Java és a C++ összehasonlítása

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

11) Statikus és dinamikus hatóköri szabályok. Statikus és dinamikus hatókör. értelmezzük

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Bevezetés a programozásba Előadás: A const

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Adatszerkezetek és algoritmusok

Osztályok. 4. gyakorlat

Programozási nyelvek I. (Az Ada) Kozsik Tamás

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java és web programozás

Objektumorientált programozás C# nyelven

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

JAVA PROGRAMOZÁS 3.ELŐADÁS

3. Gyakorlat Ismerkedés a Java nyelvvel

12. előadás Szinkronizációs feladatok (2). Védett egységek. Álvéletlenszámok. OOP az Adában.

ISA szimulátor objektum-orientált modell (C++)

Adatok, műveletek és vezérlés

Szoftvertechnológia 3. előadás. Objektumorientált tervezés: alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Web-technológia PHP-vel

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Informatika terméktervezőknek

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

Programozási nyelvek Java

Imperatív és procedurális programozás a Javában

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

C# osztályok. Krizsán Zoltán

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Challenge Accepted:C++ Standard Template Library

117. AA Megoldó Alfréd AA 117.

Java Server Pages - JSP. Web Technológiák. Java Server Pages - JSP. JSP lapok életciklusa

Delphi programozás IV.

Láncolt lista Bináris keresőfa Gráf Hasító táblázat. Programozás II. labor 2. rész (Adatszerkezetek)

Java II. I A Java programozási nyelv alapelemei

Változók élettartama

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Felhasználó által definiált adattípus

Java VII. Polimorfizmus a Java nyelvben

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Objektumelvű programozás

Már megismert fogalmak áttekintése

Oktatási segédlet 2014

Feldspar: Nyelv digitális jelfeldolgozáshoz

Java VII. Polimorfizmus a Java nyelvben

Java programozási nyelv 4. rész Osztályok II.

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Átírás:

5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.

Polimorfizmus Többalakúság Programozási nyelvek: több típussal való használhatóság Alprogram Adatszerkezet Változó Kifinomultabb típusrendszerek 2

A polimorfizmus fajtái Parametrikus polimorfizmus erről lesz most szó Altípusos polimorfizmus objektumelvű nyelvek általában öröklődés alapján Esetleges (ad-hoc) túlterhelés, típuskényszerítés 3

Parametrikus polimorfizmus Típussal való paraméterezés Sok nyelvben Modern funkcionális nyelvek (ML, ) Ada, C++, Java CLU, Eiffel stb. Generikus programozás 4

Generikus programozás Generic programming Algoritmusok és adatszerkezetek általános, típusfüggetlen leprogramozása Generikus rendezés, generikus verem Sablon: generic, template 5

Generikus felcserélés (C++) template <typename T> void swap( T& a, T& b ) { T c = a; a = b; b = c; } 6

Generikus felcserélés (Ada) generic type T is private; procedure Swap( A, B: in out T ); procedure Swap( A, B: in out T ) is C: T := A; begin A := B; B := C; end Swap; 7

Generikus verem (C++) template <typename Element> class Stack public: Stack ( int capacity ); void push ( const Element& e ); Element pop(); bool empty() const; // további műveletek private: // reprezentáció }; // műveletek megvalósítása 8

Generikus verem (Ada) generic type Element is private; package Stacks is type Stack( Capacity: Positive ) is limited private; procedure Push ( S: in out Stack; E: in Element ); procedure Pop ( S: in out Stack; E: out Element ); function Is_Empty ( S: Stack ) return Boolean;... -- további műveletek private... -- reprezentáció end Stacks; -- műveletek megvalósítása a csomag törzsében 9

Sablonok használata Bizonyos nyelvekben (Ada, C++) konkrét példányokat kell létrehozni belőlük A sablon csak példányosításra használható Más nyelvekben (funkcionális ny., Java) erre nincs szükség Mindig ugyanaz a kód hajtódik végre, nincs példányosítás 10

Példányosítás A sablon programegységekre alkalmazható művelet Alprogram programegység: hívható Csomag programegység: komponensei elérhetők Egy sablon alapján elkészít egy igazi programegységet Alprogramot, csomagot, osztályt Emiatt tekintjük a generikus programozást generatívnak 11

Generatív programozás Generative programming Program generálása programmal Egy speciális fajtája: a generikus programozás Egy másik fajtája: a template metaprogramming A C++ template nem csak generikus, hanem generatív programozást támogató eszköz is 12

Verem példányosítása (C++) Stack<int> stack(10); stack.push(4); stack.push(2); if (! stack.empty() ) { stack.pop(); } 13

Verem példányosítása (Ada) package Int_Stacks is new Stacks(Integer); S: Int_Stacks.Stack(10); E: Integer; Int_Stacks.Push( S, 4 ); Int_Stacks.Push( S, 2 ); if not Int_Stacks.Is_Empty( S ) then Int_Stacks.Pop( S, E ); end if; 14

Ha use-t használunk package Int_Stacks is new Stacks(Integer); use Int_Stacks; S: Stack(10); E: Integer; Push( S, 4 ); Push( S, 2 ); if not Is_Empty( S ) then Pop( S, E ); end if; 15

Felcserélés példányosítása (C++) Alprogramoknál implicit példányosítás Típuskikövetkeztetés alapján int x = 4, y = 2; double u = 1.2, v = 2.1; swap(x,y); swap(u,v); 16

Felcserélés példányosítása (Ada) procedure Int_Swap is new Swap(Integer); procedure Float_Swap is new Swap(Float); X: Integer := 4; Y: Integer := 2; U: Float := 1.2; V: Float := 2.1; Int_Swap(X,Y); Float_Swap(U,V); 17

Különbségek a példányosításban Alprogram Ada: explicit, C++: implicit Csomag/osztály Ada: önállóan áll, C++: on-the-fly Lusta példányosítás: C++ Egy sablonosztályból csak a használt alprogramok példányosulnak 18

Ada: programegység definiálása példányosítással Alprogramsablonból alprogram, csomagsablonból csomag hozható létre procedure Int_Swap is new Swap(Integer); package Int_Stacks is new Stacks(Integer); Ezekben a definíciókban nem adunk meg törzset (a törzs generálódik, makrószerűen) Beágyazva vagy könyvtári egységként 19

Példányosítás beágyazva with Ada.Text_IO; use Ada.Text_IO; procedure Colours is type Colour is (Red, Blue, Yellow); package Colour_IO is new Enumeration_IO(Colour); C: Colour; begin Colour_IO.Get( C ); Colour_IO.Put( C ); end Colours; 20

Példányosítás könyvtári egységként with Ada.Text_IO; package Ada.Integer_Text_IO is new Ada.Text_IO.Integer_IO(Integer); Egy fordítási egység Használat: with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; 21

Tipikus hiba a use kapcsán A sablon programegységek komponenseit nem lehet elérni A sablon csak példányosításra való Ezért nincs értelme (és tilos) use utasítást adni egy sablonra (pl. a use Stacks; helytelen) Sem csomagsablonra, sem alprogramsablonra Hasonlóan az alprogramokhoz Csomagsablonból létrehozott példányra már lehet use-t használni (pl. a use Int_Stacks; helyes) 22

Sablonok definiálása Sablon: egy programegység Példányosításra való programegység Felépítése: specifikáció és törzs Szintaktikusan szétváló Definiálható beágyazva és könyvtári egységként is Alprogramsablon és csomagsablon 23

Sablon specifikációja és törzse (1) generic type T is private; procedure Swap( A, B: in out T ); procedure Swap( A, B: in out T ) is C: T := A; begin A := B; B := C; end Swap; Mindig különálló, alprogramsablon esetén is! 24

Sablon specifikációja és törzse (2) generic type Element is private; package Stacks is end Stacks; package body Stacks is end Stacks; 25

Sablon könyvtári egység Két fordítási egység a specifikáció és a törzs Mind alprogram-, mind csomagsablon esetén Mint a csomag könyvtári egység GNAT:.ads és.adb forrásfájlok Gyakoribb, mint a beágyazás 26

Sablon definíciója beágyazva (1) package Ada.Text_IO is generic type Num is range <>; package Integer_IO is procedure Get ( Item : out Num; Width : in Field := 0 ); end Integer_IO; end Ada.Text_IO; 27

Sablon definíciója beágyazva (2) package body Ada.Text_IO is package body Integer_IO is procedure Get ( Item : out Num; Width : in Field := 0 ) is end Get; end Integer_IO; end Ada.Text_IO; 28

Sablon definíciója beágyazva (3) with Ada.Text_IO; package Ada.Integer_Text_IO is new Ada.Text_IO.Integer_IO(Integer); with Ada.Text_IO; use Ada.Text_IO; procedure Számos is package Pos_IO is new Integer_IO(Positive); begin Pos_IO.Put( 1024 ); end Számos; 29

Sablon specifikációjának tördelése generic type Element is private; package Stacks is type Stack ( Capacity: Positive ) is limited private; end Stacks; generic type T is private; procedure Swap( A, B: in out T ); 30

Sablonok formális paraméterei Típus C++ és Ada: objektum sablon osztály (C++), sablon csomag (Ada) Ada: alprogram 31

Sablon típusparamétere generic type T is private; Paraméter típus: átlátszatlan A sablonban nem ismerem a T-nek megfeleltetett aktuálisnak a szerkezetét 32

Átlátszatlan generic type Element is private; package Stacks is type Stack(Capacity: Positive) is limited private; private type Stack(Capacity: Positive) is ; end Stacks; A Stacksen belül A Stacksen kívül 33

Sablon objektumparamétere (C++) template <typename Element, int capacity> class Stack { public: Stack(); void push ( const Element& e ); }; Stack<int,10> s; 34

Sablon objektumparamétere (Ada) generic type Element is private; Capacity: Positive; package Stacks is type Stack is limited private; procedure Push ( S: in out Stack; E: in Element ); end Stacks; package Int_Stacks is new Stacks(Integer,10); S: Int_Stacks.Stack; 35

Sablonparaméter versus típus-/konstruktorparaméter generic package IStacks is type Element is private; new Stacks(Integer,10); Capacity: Positive; use IStacks; package Stacks is S1, S2: Stack; type Stack is limited private; package IStacks is new Stacks(Integer); generic use IStacks; type Element is private; S1: Stack(5); S2: Stack(10); package Stacks is type Stack(Capacity: Positive) is limited private; 36

Sablon kimenő objektumparamétere Az Adában a sablon objektumparamétere lehet in, out és in out módú is Olyan, mint az alprogramok paraméterei Alapértelmezett mód: in Legtöbbször in módút használunk 37

Sablon objektumparaméterének alapértelmezett értéke Csak bemenő paraméter esetén generic type Element is private; Capacity: Positive := 10; package Stacks is end Stacks; package I30_Stacks is new Stacks(Integer,30); package I10_Stacks is new Stacks(Integer); 38

Alprogrammal való paraméterezés Funkcionális nyelvekben magától értetődő Procedurális nyelvekben nehézkesebb Szintaktikus, szemantikus, hatékonysági kérdések Alprogram átadása alprogramnak Lokális alprogram? Csonk. (Modula-2) Csak globális alprogram: C, Ada 95 Alprogramra mutató mutató átadása (C++, Ada 95) Funktor (C++ szépen, Java nehézkesen) Sablon alprogramparaméterei: Ada 39

Ada sablonok alprogramparaméterei Sablon alprogramnak és sablon csomagnak A sablon példányosításakor adjuk meg az aktuális műveletet Nem annyira rugalmas, mint az alprogramnak alprogramot lehetőség Fordítás közben derül ki az aktuális, meglehetősen korai kötés Gyakran egy típus művelete a paraméter 40

Példa: maximumkeresés generic type T is private; with function "<" (A, B: T) return Boolean; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; 41

Tördelés és with generic type T is private; with function "<" (A, B: T) return Boolean; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; 42

Sablon alprogramparaméterének alapértelmezett értéke (triviális eset) generic type T is private; with function "<" (A, B: T) return Boolean is <>; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; 43

Sablon alprogramparaméterének használata with Maximum; procedure Max_Demo is function I_Max is new Maximum( Integer, "<" ); function I_Min is new Maximum( Integer, ">" ); function F_Max is new Maximum( Float ); end Max_Demo; 44

Ugyanez a C++ nyelvben template <typename T> T maximum( T a, T b ) { if ( a < b ) return b; else return a; } int m = maximum( 46*32, 64*23 ); // az aktuális: int 45

Különbségek első pillantásra A C++ nyelvben egyszerűbb: nincs a sablonnak alprogramparamétere Az Adában ugyanaz a sablon több feladat elvégzésére használható ha más paramétert adok meg 46

Sablonszerződés A sablon specifikációja megadja, hogy hogyan lehet a sablont használni Azaz hogyan lehet példányosítani A sablon specifikációja egy szerződés a sablon törzse és a példányosítás között Ha a példányosítás betartja a szerződést, akkor a sablonból generált kód helyes lesz 47

Függések A sablon specifikációja Példányosítás? Nem kell!! A sablon törzse 48

A szerződés kimondja: A sablon törzse nem használhat mást, csak amit a sablon specifikációja megenged neki A példányosításnak biztosítania kell mindent, amit a sablon specifikációja megkövetel tőle 49

A sablon törzse betartja generic type T is private; with function "<" (A, B: T) return Boolean is <>; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; legális 50

A példányosítás betartja with Maximum; procedure Max_Demo is function I_Max is new Maximum( Integer, "<" ); function I_Min is new Maximum( Integer, ">" ); function F_Max is new Maximum( Float ); end Max_Demo; 51

Milyen a szerződés a C++ nyelvben? A sablon specifikációja az egész definíció A belsejét is ismerni kell, hogy tudjuk, hogyan lehet példányosítani Ezért is írjuk az egészet fejállományba Az információ elrejtésének elve sérül Az olvashatóság rosszabb A bonyolultság nagyobb A módosítások bajt okozhatnak (lusta példányosítás) A fejlesztés nehezebb 52

A példánkban: template <typename T> T maximum( T a, T b ) { if ( a < b ) return b; else return a; } int m = maximum( 46*32, 64*23 ); // az aktuális: int 53

Taktika A sablon specifikációjában kérjünk olyan keveset a példányosítástól, amennyire csak lehet, de amivel még meg tudjuk írni a törzset Így nő a sablon újrafelhasználhatósága Ellenérv: hatékonyság, könnyebb használat 54

Hogyan kérjünk kevesebbet a példányosítástól? (1) with Maximum, Ada.Text_IO; procedure Max_Demo is function Smaller ( A, B: String ) return Boolean is end Smaller; -- fordítási hibát okoz: function S_Max is new Maximum( String, Smaller ); begin Put_Line( S_Max( "Hi", "Salut" ) ); end Max_Demo; 55

Nem teljesen definiált típust is megengedünk generic type T(<>) is private; Így már lehet az aktuális a String with function "<" (A, B: T) return Boolean is <>; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; 56

Az új szerződés értelmében: A példányosításkor választhatjuk az aktuális paramétert teljesen meghatározott, valamint nem teljesen meghatározott típusúnak is A sablon törzsében nem hozhatok létre objektumot ebből a típusból 57

Ha az aktuális lehet indefinit generic type T(<>) is private; procedure Swap( A, B: in out T ); procedure Swap( A, B: in out T ) is C: T := A; begin A := B; B := C; end Swap; Fordítási hiba 58

Hogyan kérjünk kevesebbet a példányosítástól? (2) with Maximum, Ada.Text_IO; procedure Max_Demo is type R is limited record end record; function Smaller ( A, B: R ) return Boolean is end Smaller; -- fordítási hibát okoz: function R_Max is new Maximum( R, Smaller ); end Max_Demo; 59

Korlátozott típust is megengedünk generic type T is limited private; Így már lehet az aktuális a korlátozott rekord (R) with function "<" (A, B: T) return Boolean is <>; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; 60

Ha az aktuális lehet korlátozott generic type T is limited private; procedure Swap( A, B: in out T ); procedure Swap( A, B: in out T ) is C: T := A; begin A := B; B := C; end Swap; Fordítási hiba 61

Összefoglalva A sablon alprogramparaméterei mellett Formális Aktuális Törzsben type T is private; type T(<>) is private; type T is limited private; type T(<>) is limited private definit nem korlátozott (in)definit nem korlátozott definit (nem) korlátozott (in)definit (nem) korlátozott obj. létrehozás := = /= := = /= obj. létrehozás 62

Korlátozott indefinit típust is megengedünk generic type T(<>) is limited private; with function "<" (A, B: T) return Boolean is <>; function Maximum ( A, B: T ) return T; function Maximum ( A, B: T ) return T is begin if A < B then return B; else return A; end if; end Maximum; 63

Példányosíthatom akár így is with Maximum, Stacks; procedure Max_Demo is package IStacks is new Stacks(Integer); use IStacks; function Smaller ( A, B: Stack ) return Boolean is begin if Is_Empty(B) then return False; else return Is_Empty(A) or else Top(A) < Top(B); end if; end Smaller; function S_Max is new Maximum( Stack, Smaller ); 64

Sablon típusparaméterei Átlátszatlan típus (private + műveletek) Könnyítés a példányosításon, szigorítás a sablontörzs lehetőségein: (<>), limited, tagged, abstract A típus szerkezetére tett megszorítás: típusosztály 65

Típusosztályok használata (1) generic type Element is private; type Index is (<>); type Vector is array (Index range <>) of Element; with function Op( A, B: Element ) return Element; Start: in Element; function Fold ( V: Vector ) return Element; 66

Típusosztályok használata (2) function Fold ( V: Vector ) return Element is Result: Element := Start; begin for I in V Range loop Result := Op( Result, V(I) ); end loop; return Result; end Fold; Szummázás programozási tétel 67

Típusosztályok használata (3) with Fold; procedure Fold_Demo is type T is array ( Integer range <> ) of Float; function Sum is new Fold( Float, Integer, T, "+", 0.0 ); function Prod is new Fold( Float, Integer, T, *", 1.0 ); end Fold_Demo; 68

Néhány fontos típusosztálymegjelölés Egész típus type T is range <>; Diszkrét típus type T is (<>); Moduló, lebegőpontos, fixpontos, decimális fixpontos Tömb, mutató, diszkriminánsos, származtatott, kiterjesztett 69

Mire jó a típusosztály A sablon törzsében használhatók a típusosztályra jellemző műveletek Diszkrét: lehet tömb indextípusa Tömb: indexelhető, van Range attribútuma A példányosításkor csak olyan aktuális paraméter választható Integer type T is array (Integer range <>) of Float 70

Ha a paraméter egy tömb típus Gyakran az elem- és az indextípus is paraméter Persze ilyenkor az indextípus (<>) vagy range <> Nem mindegy, hogy megszorított, vagy megszorítás nélküli indexelésű type T is (Index range <>) of Element; type T is (Index) of Element; nem feleltethetők meg egymásnak sem így, sem úgy Lehet többdimenzióst is 71

Kétdimenziós, lebegőpontos generic type Element is digits <>; type Index is (<>); type Matrix is array (Index range <>, Index range <>) of Element; package Matrix_Arithmetics is function "*" (A, B: Matrix ) return Matrix; end Matrix_Arithmetics; 72

Sablonok csomagparamétere generic with package Arithmetics is new Matrix_Arithmetics(<>); use Arithmetics; function Inverse( M: Matrix ) return Matrix; Példányosításnál az aktuális paraméter a Matrix_Arithmetics csomagsablonból létrehozott példány kell, hogy legyen 73

Sablon a sablonban generic package generic function end; Sablonok egymásba ágyazhatók 74

generic type Element is private; package Stacks is type Stack( Capacity: Positive ) is limited private; procedure Push( S: in out Stack; Item: in Element );... generic with procedure Process_Element( Item: in Element ); procedure For_Each( S: in Stack ); private type Vector is array( Natural range <> ) of Element; type Stack( Capacity: Positive ) is record Last: Natural := 0; Data: Vector(1..Capacity); end record; end Stacks; 75

package body Stacks is procedure Push( S: in out Stack; Item: in Element ) is begin S.Last := S.Last + 1; S.Data(S.Last) := Item; end Push;... procedure For_Each( S: in Stack ) is begin for I in S.Data'First.. S.Last loop Process_Element( S.Data(I) ); end loop; end For_Each; end Stacks; 76

with Stacks, Ada.Integer_Text_IO; procedure Stack_Demo is package IStacks is new Stacks(Integer); procedure Put_Int( Item: Integer ) is begin Ada.Integer_Text_IO.Put(Item,0); end Put_Int; procedure Put_Stack is new IStacks.For_Each(Put_Int); S: IStacks.Stack(100); begin IStacks.Push(S,3); IStacks.Push(S,66); IStacks.Push(S,91); Put_Stack(S); 77

Iterátor Adatszerkezet bejárása (ciklussal) Minden elemmel csinálni kell valamit Külső iterátor A ciklus a klienskódban van Az adatszerkezet-objektumtól független iterátorobjektum Belső iterátor A ciklus az adatszerkezet implementációján belül van Az elemeken végzendő művelettel paraméterezett művelet Stacks.For_Each 78

with Stacks; procedure Stack_Demo is package IStacks is new Stacks(Integer); use IStacks; function Multiplicity( S: Stack; Pattern: Integer ) return Natural is Counter: Natural := 0; procedure Compare( Item: in Integer ) is begin if Item = Pattern then Counter := Counter + 1; end if; end Compare; procedure Compare_All is new For_Each(Compare); begin Compare_All(S); return Counter; end Multiplicity; begin... end Stack_Demo; 79

Rekurzív alprogramsablon function Fold_R ( V: Vector ) return Element is begin if V Length = 0 then return Start; elsif V Length = 1 then return V(V First); else return Op( V(V First), Fold_R( V(Index Succ(V First).. V Last) ) ); end if; end Fold_R; Folding from the right 80

Egyke generic type Element is private; Max: in Positive := 1024; package Stack is procedure Push( X: in Element ); procedure Pop( X: out Element ); function Top return Element; function Is_Empty return Boolean; end Stack; 81

Lehet több is belőle with Stack; procedure Egyke_Demo is package V1 is new Stack(Integer, 10); package V2 is new Stack(Float); package V3 is new Stack(Float); begin V1.Push(3); V2.Push(3.0); V3.Push(V2.Top); end Egyke_Demo; Fordítási időben meghatározott számú verem létrehozására 82

Függelék: típusosztályok jelölése Diszkrét típus type T is (<>); Előjeles egész type T is range <>; Moduló típus type T is mod <>; Lebegőpontos type T is digits <>; Fixpontos type T is delta <>; Decimális fixpontos type T is delta <> digits <>; Korlátozott, indefinit, jelölt, osztályszintű, absztrakt, nem dinamikusra mutató Definit tömb, indefinit tömb, álneves elemű tömb, diszkriminánsos, mutató, konstansra mutató, származtatott, kiterjesztett 83