-- Chapter 21 - Programming exercise 1 -- This package uses a data structure composed of three INTEGER -- variables. It allow the user to add two structures, component -- by component, or subtract component by component. Provision is -- also made to build a structure from three numbers, or decompose -- a structure into its components. package Three is type DATA_STRUCTURE is private; function "+"(Data1, Data2 : DATA_STRUCTURE) return DATA_STRUCTURE; function "-"(Data1, Data2 : DATA_STRUCTURE) return DATA_STRUCTURE; function Build_Structure(Val1, Val2, Val3 : INTEGER) return DATA_STRUCTURE; procedure Decompose(Data1 : DATA_STRUCTURE; Val1, Val2, Val3 : out INTEGER); function Compare_Sum(Data1, Data2 : DATA_STRUCTURE) return BOOLEAN; private type DATA_STRUCTURE is record Value1 : INTEGER; Value2 : INTEGER; Value3 : INTEGER; end record; end Three; package body Three is function "+"(Data1, Data2 : DATA_STRUCTURE) return DATA_STRUCTURE is Temp : DATA_STRUCTURE; begin Temp.Value1 := Data1.Value1 + Data2.Value1; Temp.Value2 := Data1.Value2 + Data2.Value2; Temp.Value3 := Data1.Value3 + Data2.Value3; return Temp; end "+"; function "-"(Data1, Data2 : DATA_STRUCTURE) return DATA_STRUCTURE is Temp : DATA_STRUCTURE; begin Temp.Value1 := Data1.Value1 - Data2.Value1; Temp.Value2 := Data1.Value2 - Data2.Value2; Temp.Value3 := Data1.Value3 - Data2.Value3; return Temp; end "-"; function Build_Structure(Val1, Val2, Val3 : INTEGER) return DATA_STRUCTURE is Temp : DATA_STRUCTURE; begin Temp.Value1 := Val1; Temp.Value2 := Val2; Temp.Value3 := Val3; return Temp; end Build_Structure; procedure Decompose(Data1 : DATA_STRUCTURE; Val1, Val2, Val3 : out INTEGER) is begin Val1 := Data1.Value1; Val2 := Data1.Value2; Val3 := Data1.Value3; end Decompose; function Compare_Sum(Data1, Data2 : DATA_STRUCTURE) return BOOLEAN is begin return (Data1.Value1 + Data1.Value2 + Data1.Value3) = (Data2.Value1 + Data2.Value2 + Data2.Value3); end Compare_Sum; end Three; -- This program exercises the package Three as an illustration. with Ada.Text_IO; use Ada.Text_IO; with Three; use Three; procedure CH21_1 is My_Data, Extra_Data : DATA_STRUCTURE; Temp : DATA_STRUCTURE; begin My_Data := Build_Structure(3,7,13); Extra_Data := Build_Structure(-4,77,0); My_Data := My_Data + Extra_Data; if My_Data /= Extra_Data then Put_Line("The two structures are not equal."); end if; My_Data := Extra_Data; if My_Data = Extra_Data then Put_Line("The two structures are equal now."); end if; -- The following line is illegal with the private type. -- My_Data.Value1 := My_Data.Value1 + 13; Temp := Build_Structure(13,0,0); My_Data := My_Data + Temp; if not Compare_Sum(My_Data, Temp) then Put_Line("My_Data and Temp are not equal."); end if; My_Data := Build_Structure(1,9,3); if Compare_Sum(My_Data, Temp) then Put_Line("My_Data and Temp are equal."); end if; end CH21_1; -- Result of execution -- The two structures are not equal. -- The two structures are equal now. -- My_Data and Temp are not equal. -- My_Data and Temp are equal.