checkpoint harmony
[sbp.git] / src / edu / berkeley / sbp / util / FastSet.java
1 package edu.berkeley.sbp.util;
2 import java.util.*;
3
4 public /*final*/ class FastSet<T> implements Iterator<T>, Iterable<T> {
5
6     public static final int INITIAL_SIZE = 8;
7
8     private       Object[] array = null;
9     private       T        only  = null;
10     private       int      i     = -1;
11     private       int      size  = 0;
12
13     public Iterator<T> iterator() { i=0; return this; }
14     public void        remove()   { throw new Error(); }
15     public boolean     hasNext()  { return only==null ? i<size : i<1; }
16     public T           next()     { return only==null ? (T)array[i++] : (i++)==0 ? only : null; }
17     public T get(int i) {
18         if (i==0 && only!=null) return only;
19         if (array==null) return null;
20         return (T)array[i];
21     }
22
23     public FastSet() { }
24     public FastSet(T t) { only = t; }
25     public FastSet(Set<T> s) {
26         if (s.size()==1) { only = s.iterator().next(); return; }
27         array = new Object[s.size()];
28         for(T t : s) array[size++] = t;
29     }
30
31     public int size() { return only==null ? size : 1; }
32     private void grow() {
33         Object[] array2 = array==null ? new Object[INITIAL_SIZE] : new Object[array.length * 2];
34         if (array != null) System.arraycopy(array, 0, array2, 0, array.length);
35         array = array2;
36         if (only!=null) {
37             array[size++] = only;
38             only = null;
39         }
40     }
41     public void add(T t, boolean check) {
42         //if (check) for(Object o : this) if (o.equals(t)) return;
43         if (check) {
44             if (only==t) return;
45             if (array != null)
46                 for(int i=0; i<size; i++)
47                     if (array[i]==t) return;
48         }
49         add(t);
50     }
51     public void add(T t) {
52         if (array==null) {
53             if (only!=null) { only = t; return; }
54             grow();
55         } else if (size>=array.length-1) {
56             grow();
57         }
58         array[size++] = t;
59     }
60
61     public boolean contains(T t) {
62         if (t==only) return true;
63         if (array==null) return false;
64         for(Object o : array) if (o==t) return true;
65         return false;
66     }
67 }