1 19 20 package soot.util; 21 import java.util.*; 22 23 27 28 public class ArrayNumberer implements IterableNumberer { 29 Numberable[] numberToObj = new Numberable[1024]; 30 int lastNumber = 0; 31 32 public void add( Object oo ) { 33 Numberable o = (Numberable) oo; 34 if( o.getNumber() != 0 ) return; 35 ++lastNumber; 36 if( lastNumber >= numberToObj.length ) { 37 Numberable[] newnto = new Numberable[numberToObj.length*2]; 38 System.arraycopy(numberToObj, 0, newnto, 0, numberToObj.length); 39 numberToObj = newnto; 40 } 41 numberToObj[lastNumber] = o; 42 o.setNumber( lastNumber ); 43 } 44 45 public long get( Object oo ) { 46 if( oo == null ) return 0; 47 Numberable o = (Numberable) oo; 48 int ret = o.getNumber(); 49 if( ret == 0 ) throw new RuntimeException ( "unnumbered: "+o ); 50 return ret; 51 } 52 53 public Object get( long number ) { 54 if( number == 0 ) return null; 55 Object ret = numberToObj[(int) number]; 56 if( ret == null ) throw new RuntimeException ( "no object with number "+number ); 57 return ret; 58 } 59 60 public int size() { return lastNumber; } 61 62 public Iterator iterator() { 63 return new NumbererIterator(); 64 } 65 66 final class NumbererIterator implements Iterator { 67 int cur = 1; 68 public final boolean hasNext() { 69 return cur < numberToObj.length && numberToObj[cur] != null; 70 } 71 public final Object next() { 72 if( !hasNext() ) throw new NoSuchElementException(); 73 return numberToObj[cur++]; 74 } 75 public final void remove() { 76 throw new UnsupportedOperationException (); 77 } 78 } 79 } 80 | Popular Tags |