home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / ada_1 / Examples_ada_sieve_pump < prev    next >
Encoding:
Text File  |  1994-10-14  |  1.4 KB  |  68 lines

  1. -- ++
  2. -- An implementation of the Sieve of Erastosthenes, a standard benchmark.
  3. -- This is a rather heavyweight implementation, since each prime number
  4. -- creates a new task. However, it illustrates the use of dynamic tasks.
  5. -- --
  6.  
  7. with Text_IO;
  8. procedure Sieve_Pump is
  9.  
  10.    package Integer_IO is new Text_IO.Integer_IO ( Integer );
  11.  
  12. task type Pump is
  13.    -- determine if Num is prime and display it on the console if it is
  14.    entry Insert ( Num : Integer );
  15. end Pump;
  16.  
  17. type A_Pump is access Pump;
  18.  
  19. function Make_Pump return A_Pump is
  20. begin
  21.    return new Pump;
  22. end Make_Pump;
  23.  
  24. task body Pump is
  25.  
  26.    Next_Task : A_Pump := Null;
  27.    My_Number : Integer;
  28.  
  29. begin
  30.  
  31.    accept Insert ( Num : Integer ) do
  32.       My_Number := Num;
  33.    end Insert;
  34.    Integer_IO.Put ( My_Number );
  35.    Text_IO.New_Line;
  36.  
  37.    loop
  38.       accept Insert ( Num : Integer ) do
  39.       
  40.          -- is Num divisible by our prime number ?
  41.          if Num mod My_Number /= 0 then
  42.       
  43.             -- create the next task if it hasn't been created yet.
  44.             if Next_Task = Null then
  45.                Next_Task := Make_Pump;
  46.             end if;
  47.             
  48.             -- send the new number onto the next task
  49.             Next_Task.Insert ( Num );
  50.  
  51.          end if;
  52.  
  53.       end Insert;
  54.    end loop;
  55.    
  56. end Pump;
  57.  
  58. begin
  59.  
  60.    declare
  61.       The_Pump : Pump;
  62.    begin
  63.       for I in 2 .. 8191 loop
  64.          The_Pump.Insert ( I );
  65.       end loop;
  66.    end;
  67.    
  68. end Sieve_Pump;