circular_queue.sa
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:1k
源码类别:

编译器/解释器

开发平台:

Others

  1. class CIRCULAR_QUEUE{T} is
  2.    private attr buffer: AREF{T};
  3.    private  attr offset        : INT;
  4.    readonly attr num_entries   : INT;
  5.    create( min_size : INT ) : SAME is
  6.       size_min : INT := size_min.max(2); -- make min_size at least 2
  7.       -- find first power of 2 >= to requested size
  8.       size : INT := 2;
  9.       loop while!( size < min_size );
  10.  size := size * 2;
  11.       end;
  12.       res : SAME := new;
  13.       res.buffer := #AREF{T}( size );
  14.       res.offset := 0;
  15.       res.num_entries := 0;
  16.       return res;
  17.    end;
  18.   
  19.    append( t : T ) is
  20.       if num_entries = buffer.asize 
  21.       then
  22.  expand;
  23.       end;
  24.       buffer[ ( offset + num_entries ).mod( buffer.asize ) ] := t;
  25.       num_entries := num_entries + 1;
  26.    end;
  27.    aget( index : INT ) : T is
  28.       assert( index < buffer.asize );
  29.       return buffer[ ( offset + index ).mod( buffer.asize ) ];
  30.    end;
  31.    expand is
  32.       -- copy
  33.       new_buffer : AREF{T} := #AREF{T}( buffer.asize * 2 );
  34.       i : INT := 0;
  35.       loop while!( i < buffer.asize );
  36.  new_buffer[i] := aget( i );
  37.  i := i + 1;
  38.       end;
  39.       -- reinitialize
  40.       buffer := new_buffer;
  41.       offset := 0;
  42.    end;
  43.    remove_first is 
  44.       offset := ( offset + 1 ).mod( buffer.asize );
  45.       num_entries := num_entries - 1;
  46.    end;
  47. end;