add source code that does not have location annotations.
[IRC.git] / Robust / JavaGrammar / Lex / FIFO.java
1 package Lex;
2
3 /** FIFO class.  This helps implement the lookahead we need for JSR-14.
4  * Copyright (C) 2002 C. Scott Ananian <cananian@alumni.princeton.edu>
5  * This program is released under the terms of the GPL; see the file
6  * COPYING for more details.  There is NO WARRANTY on this code.
7  */
8
9 class FIFO {
10   java_cup.runtime.Symbol[] backing = new java_cup.runtime.Symbol[10];
11   int start=0, end=0;
12   final Getter getter;
13   FIFO(Getter getter) { this.getter = getter; }
14   public boolean isEmpty() { return start==end; }
15   private boolean isFull() {
16     return start==end+1 || (start==0 && end==backing.length-1);
17   }
18   private int size() {
19     return ((end<start)?end+backing.length:end)-start;
20   }
21   public void put(java_cup.runtime.Symbol o) {
22     if (isFull()) {
23       java_cup.runtime.Symbol[] nbacking =
24         new java_cup.runtime.Symbol[backing.length*2];
25       System.arraycopy(backing, start, nbacking, 0, backing.length-start);
26       System.arraycopy(backing, 0, nbacking, backing.length-start, start);
27       start = 0;
28       end = backing.length-1;
29       backing = nbacking;
30     }
31     ASSERT(!isFull());
32     backing[end++] = o;
33     if (end == backing.length)
34       end = 0;
35     ASSERT(!isEmpty());
36   }
37   public java_cup.runtime.Symbol get() throws java.io.IOException {
38     if (isEmpty())
39       put(getter.next());
40     ASSERT(!isEmpty());
41     java_cup.runtime.Symbol o = backing[start++];
42     if (start == backing.length)
43       start = 0;
44     ASSERT(!isFull());
45     return o;
46   }
47   public java_cup.runtime.Symbol peek(int i) throws java.io.IOException {
48     while (i >= size())
49       put(getter.next());
50     int index = start+i;
51     if (index >= backing.length) index -= backing.length;
52     ASSERT(0<= index && index < backing.length);
53     return backing[index];
54   }
55   abstract static class Getter {
56     abstract java_cup.runtime.Symbol next()
57       throws java.io.IOException;
58   }
59   private static void ASSERT(boolean b) {
60     if (!b) throw new RuntimeException();
61   }
62 }
63         
64