34 lines
1.3 KiB
Ada
34 lines
1.3 KiB
Ada
package body Bit_Streams is
|
|
procedure Finalize (Stream : in out Bit_Stream) is
|
|
begin
|
|
if Stream.Write_Count > 0 then
|
|
Stream.Output (1) := Stream.Output (1) * 2**(Stream_Element'Size - Stream.Write_Count);
|
|
Stream.Channel.Write (Stream.Output);
|
|
end if;
|
|
end Finalize;
|
|
procedure Read (Stream : in out Bit_Stream; Data : out Bit_Array) is
|
|
Last : Stream_Element_Offset;
|
|
begin
|
|
for Index in Data'Range loop
|
|
if Stream.Read_Count = 0 then
|
|
Stream.Channel.Read (Stream.Input, Last);
|
|
Stream.Read_Count := Stream_Element'Size;
|
|
end if;
|
|
Data (Index) := Bit (Stream.Input (1) / 2**(Stream_Element'Size - 1));
|
|
Stream.Input (1) := Stream.Input (1) * 2;
|
|
Stream.Read_Count := Stream.Read_Count - 1;
|
|
end loop;
|
|
end Read;
|
|
procedure Write (Stream : in out Bit_Stream; Data : Bit_Array) is
|
|
begin
|
|
for Index in Data'Range loop
|
|
if Stream.Write_Count = Stream_Element'Size then
|
|
Stream.Channel.Write (Stream.Output);
|
|
Stream.Write_Count := 0;
|
|
end if;
|
|
Stream.Output (1) := Stream.Output (1) * 2 or Stream_Element (Data (Index));
|
|
Stream.Write_Count := Stream.Write_Count + 1;
|
|
end loop;
|
|
end Write;
|
|
end Bit_Streams;
|