with Ada.Streams; use Ada.Streams; package body Opt41_Pkg is type Wstream is new Root_Stream_Type with record S : Unbounded_String; end record; procedure Read (Stream : in out Wstream; Item : out Stream_Element_Array; Last : out Stream_Element_Offset) is null; procedure Write (Stream : in out Wstream; Item : Stream_Element_Array) is begin for J in Item'Range loop Append (Stream.S, Character'Val (Item (J))); end loop; end Write; function Rec_Write (R : Rec) return Unbounded_String is S : aliased Wstream; begin Rec'Output (S'Access, R); return S.S; end Rec_Write; type Rstream is new Root_Stream_Type with record S : String_Access; Idx : Integer := 1; end record; procedure Write (Stream : in out Rstream; Item : Stream_Element_Array) is null; procedure Read (Stream : in out Rstream; Item : out Stream_Element_Array; Last : out Stream_Element_Offset) is begin Last := Stream_Element_Offset'Min (Item'Last, Item'First + Stream_Element_Offset (Stream.S'Last - Stream.Idx)); for I in Item'First .. Last loop Item (I) := Stream_Element (Character'Pos (Stream.S (Stream.Idx))); Stream.Idx := Stream.Idx + 1; end loop; end Read; function Rec_Read (Str : String_Access) return Rec is S : aliased Rstream; begin S.S := Str; return Rec'Input (S'Access); end Rec_Read; end Opt41_Pkg;