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; |