-- Demonstrates using a record type as a parameter

with Ada.Integer_Text_IO; use  Ada.Integer_Text_IO;
with Ada.Text_IO;         use  Ada.Text_IO;

procedure paramRecords is

   type Pair is record        
      x: Integer;            
      y: Integer;
   end record;

   procedure putPair(p: Pair) is
   begin
      put(p.x); 
      put(p.y);
      new_line;
   end putPair;

   -- In out parameter pair
   procedure swapPair(p1, p2: in out Pair) is
       temp: constant Pair := p1;
   begin
       p1 := p2;
       p2 := temp;
   end swapPair;

   -- Does this swap differ from the other?
   -- Would they differ if this were java?
   procedure swapPairElements(p1, p2: in out Pair) is
       tempx: constant Integer := p1.x;
       tempy: constant Integer := p1.y;
   begin
       p1.x := p2.x;
       p1.y := p2.y;

       p2.x := tempx;
       p2.y := tempy;
   end swapPairElements;

   p1: Pair := (1, 2);                
   p2: Pair := (3, 4);              

begin
   putPair(p1);
   putPair(p2);
   new_line;

   swapPair(p1, p2);

   putPair(p1);
   putPair(p2);
   new_line;

   swapPairElements(p1, p2);

   putPair(p1);
   putPair(p2);

end paramRecords;
-- Output
--          1          2
--          3          4
--
--          3          4
--          1          2
--
--          1          2
--          3          4