-- $Id: prodcons.gnat,v 1.0 2003/06/11 12:10:00 dada Exp $
-- http://dada.perl.it/shootout/
-- Ada 95 code by C.C.
with Ada.Strings.Fixed, Ada.Command_Line, Text_IO;
procedure ProdCons is
type Data_Type is new Integer;
End_Of_Data : constant Data_Type := Data_Type'First;
protected Queue is
entry Put (Data : Data_Type);
entry Get (Data_Out : out Data_Type);
private
Count : Natural := 0;
Buffer : Data_Type;
end Queue;
protected body Queue is
entry Put (Data : Data_Type)
when Count = 0 is
begin
Buffer := Data;
Count := Count + 1;
end Put;
entry Get (Data_Out : out Data_Type)
when Count /= 0 is
begin
Data_Out := Buffer;
Count := Count - 1;
end Get;
end Queue;
Produced, Consumed : Natural := 0;
task type Producer_Task (N : Natural);
task type Consumer_Task (N : Natural);
task body Producer_Task is
begin
for Data_K in 1 .. Data_Type (N) loop
Queue.Put (Data => Data_K);
Produced := Produced + 1;
end loop;
Queue.Put (Data => End_Of_Data);
end Producer_Task;
task body Consumer_Task is
Data : Data_Type;
begin
loop
Queue.Get (Data_Out => Data);
exit when Data = End_Of_Data;
Consumed := Consumed + 1;
end loop;
end Consumer_Task;
function L_Trim (Source : String; Side : Ada.Strings.Trim_End :=
Ada.Strings.Left) return String renames Ada.Strings.Fixed.Trim;
N : Natural := 0;
begin
begin
N := Natural'Value (Ada.Command_Line.Argument (1));
exception
when Constraint_Error => null;
end;
declare
Producer : Producer_Task (N => N);
Consumer : Consumer_Task (N => N);
begin
null;
end;
Text_IO.Put_Line (L_Trim (Natural'Image (Produced)) &
Natural'Image (Consumed));
end ProdCons;