The Contents of Limited Types Passed as "in" Parameters
can be modified using the following technique:
with Ada.Text_IO; use Ada.Text_IO;
procedure Rosen_Trick is
   type T;
   type Relay_Type (Reference : access T) is limited null record;
   type T is limited
      record
         Relay : Relay_Type (T'Access);
         Data  : Natural := 0;
      end record;
   function Next (X : in T) return Integer is
      Data : Natural renames X.Relay.Reference.Data;
   begin
      Data := Data+1;
      return Data;
   end Next;
   Test_T : T;
begin
   for N in 1 .. 10 loop
      Put_Line(Integer'Image(Next(Test_T)));
   end loop;
end Rosen_Trick;
 |