-- Chapter 30 - Program 5 generic type ACCESS_INT is access INTEGER; procedure Swap_Int_Data(Dat1, Dat2 : ACCESS_INT); procedure Swap_Int_Data(Dat1, Dat2 : ACCESS_INT) is Temp : ACCESS_INT := new INTEGER; begin Temp.all := Dat1.all; Dat1.all := Dat2.all; Dat2.all := Temp.all; end Swap_Int_Data; generic type ANY_TYPE is private; type ACCESS_ANY is access ANY_TYPE; procedure Swap_Any_Data(Dat1, Dat2 : ACCESS_ANY); procedure Swap_Any_Data(Dat1, Dat2 : ACCESS_ANY) is Temp : ACCESS_ANY := new ANY_TYPE; begin Temp.all := Dat1.all; Dat1.all := Dat2.all; Dat2.all := Temp.all; end Swap_Any_Data; with Ada.Text_IO, Swap_Int_Data, Swap_Any_Data; use Ada.Text_IO; procedure AccesGen is type ACCESS_INT is access INTEGER; Address1, Address2 : ACCESS_INT := new INTEGER; procedure Transpose_Integers is new Swap_Int_Data(ACCESS_INT); type NAME_ARRAY is array(1..6) of CHARACTER; type PERSONAL_STUFF is record Age : INTEGER; Grade : INTEGER; Name : NAME_ARRAY; end record; type PERSONAL_ACCESS is access PERSONAL_STUFF; Male_Student : PERSONAL_ACCESS := new PERSONAL_STUFF; Female_Student : PERSONAL_ACCESS := new PERSONAL_STUFF; type ACCESS_FLOAT is access FLOAT; Address_Float1 : ACCESS_FLOAT; Address_Float2 : ACCESS_FLOAT; procedure Transpose_Floats is new Swap_Any_Data(FLOAT, ACCESS_FLOAT); procedure Transpose_Records is new Swap_Any_Data(PERSONAL_STUFF, PERSONAL_ACCESS); procedure Transpose_Ints is new Swap_Any_Data(INTEGER, ACCESS_INT); begin Put_Line("Begin the generic access routine"); Address1.all := 23; Address2.all := 13 * Address1.all; Transpose_Integers(Address1, Address2); Transpose_Ints(Address1, Address2); Address_Float1 := new FLOAT; Address_Float2 := new FLOAT; Address_Float1.all := 3.141592; Address_Float2.all := 144.0; Transpose_Floats(Address_Float1, Address_Float2); Male_Student.all := (16, 11, "Johnny"); Female_Student.all := (15, 11, "Sandy "); Transpose_Records(Male_Student, Female_Student); end Accesgen; -- Result of execution -- Begin the generic access routine