@SuppressWarnings("unchecked") public V get(Numberable key) { int i = key.getNumber(); if (i >= values.length) { return null; } return (V) values[i]; }
@SuppressWarnings("unchecked") @Override public Integer get(Object key) { return ((E) key).getNumber(); }
/** * Input object o should be added to this container previously. */ public long get(E o) { if (o == null) { return -1; } return o.getNumber(); }
@Override public long get(E o) { if (o == null) { return 0; } int ret = o.getNumber(); if (ret == 0) { throw new RuntimeException("unnumbered: " + o); } return ret; }
private final int findPosition(Numberable o) { int number = o.getNumber(); if (number == 0) { throw new RuntimeException("unnumbered"); } number = number & (array.length - 1); while (true) { if (array[number] == o) { return number; } if (array[number] == null) { return number; } number = (number + 1) & (array.length - 1); } }
private final int findPosition(Numberable o) { int number = o.getNumber(); if (number == 0) { throw new RuntimeException("unnumbered"); } number = number & (array.length - 1); while (true) { if (array[number] == o) { return number; } if (array[number] == null) { return number; } number = (number + 1) & (array.length - 1); } }
public void add(E o) { // We check if this object is already put into the set if (o.getNumber() != -1 && numberToObj[o.getNumber()] == o) { return; } numberToObj[lastNumber] = o; o.setNumber(lastNumber); objContainer.put(o, o); ++lastNumber; ++filledCells; if (lastNumber >= numberToObj.length) { Numberable[] newnto = new Numberable[numberToObj.length * 2]; System.arraycopy(numberToObj, 0, newnto, 0, numberToObj.length); numberToObj = newnto; } }
public boolean remove(E o) { int id = o.getNumber(); if (id < 0) { return false; } if (numberToObj[id] != o) { return false; } numberToObj[id] = null; o.setNumber(-1); --filledCells; return true; }
public boolean put(Numberable key, V value) { int number = key.getNumber(); if (number == 0) { throw new RuntimeException(String.format("oops, forgot to initialize. Object is of type %s, and looks like this: %s", key.getClass().getName(), key.toString())); } if (number >= values.length) { Object[] oldValues = values; values = new Object[universe.size() * 2 + 5]; System.arraycopy(oldValues, 0, values, 0, oldValues.length); } boolean ret = (values[number] != value); values[number] = value; return ret; }
@Override public boolean remove(E o) { if (o == null) { return false; } int num = o.getNumber(); if (num == 0) { return false; } if (freeNumbers == null) { freeNumbers = new BitSet(2 * num); } numberToObj[num] = null; o.setNumber(0); freeNumbers.set(num); return true; } }
public boolean contains(Numberable o) { if (array != null) { return array[findPosition(o)] != null; } else { int number = o.getNumber(); if (number == 0) { throw new RuntimeException("unnumbered"); } return bits.get(number); } }
@Override public synchronized void add(E o) { if (o.getNumber() != 0) { return; } // In case we removed entries from the numberer, we want to re-use the free space int chosenNumber = -1; if (freeNumbers != null) { int ns = freeNumbers.nextSetBit(0); if (ns != -1) { chosenNumber = ns; freeNumbers.clear(ns); } } if (chosenNumber == -1) { chosenNumber = ++lastNumber; } if (lastNumber >= numberToObj.length) { resize(numberToObj.length * 2); } numberToObj[lastNumber] = o; o.setNumber(lastNumber); }
private final void doubleSize() { int uniSize = universe.size(); if (array.length * 128 > uniSize) { bits = new BitVector(uniSize); Numberable[] oldArray = array; array = null; for (Numberable element : oldArray) { if (element != null) { bits.set(element.getNumber()); } } } else { Numberable[] oldArray = array; array = new Numberable[array.length * 2]; for (Numberable element : oldArray) { if (element != null) { array[findPosition(element)] = element; } } } }
public Object get( Numberable key ) { int i = key.getNumber(); if( i >= values.length ) return null; return values[ i ]; } public Iterator keyIterator() {
private final int findPosition( Numberable o ) { int number = o.getNumber(); if( number == 0 ) throw new RuntimeException( "unnumbered" ); number = number & (array.length-1); while(true) { if( array[number] == o ) return number; if( array[number] == null ) return number; number = (number+1) & (array.length-1); } } private final void doubleSize() {
public long get( E oo ) { if( oo == null ) return 0; Numberable o = (Numberable) oo; int ret = o.getNumber(); if( ret == 0 ) throw new RuntimeException( "unnumbered: "+o ); return ret; }
public long get( E oo ) { if( oo == null ) return 0; Numberable o = (Numberable) oo; int ret = o.getNumber(); if( ret == 0 ) throw new RuntimeException( "unnumbered: "+o ); return ret; }
public void add( E oo ) { Numberable o = (Numberable) oo; if( o.getNumber() != 0 ) return; ++lastNumber; if( lastNumber >= numberToObj.length ) { Numberable[] newnto = new Numberable[numberToObj.length*2]; System.arraycopy(numberToObj, 0, newnto, 0, numberToObj.length); numberToObj = newnto; } numberToObj[lastNumber] = o; o.setNumber( lastNumber ); }
public boolean contains( Numberable o ) { if( array != null ) { return array[ findPosition(o) ] != null; } else { int number = o.getNumber(); if( number == 0 ) throw new RuntimeException( "unnumbered" ); return bits.get( number ); } }