public void putFloat(float newValue) { super.put(newValue); }
public void putBoolean(boolean newValue) { super.put(newValue); }
public void putLong(long newValue) { super.put(newValue); }
public void putDouble(double newValue) { super.put(newValue); }
public void putByte(byte newValue) { super.put(newValue); }
public void putInt(int newValue) { super.put(newValue); }
public void putChar(char newValue) { super.put(newValue); }
public void putShort(short newValue) { super.put(newValue); }
public VBox(E initial) { inplace = new InplaceWrite<E>(); put(initial); }
@Override @Atomic(canFail = false) public void clear() { entries.put((Cons<E>) Cons.empty()); size.putInt(0); }
protected void removeCons(Cons<?> cons) { Cons<E> oldElems = entries.get(); Cons<E> newElems = oldElems.removeCons(cons); if (oldElems != newElems) { entries.put(newElems); size.dec(); } }
@Override @Atomic(speculativeReadOnly = false) public void clear() { // Let the GC do its job array.put(new VArray<E>(array().length)); size.putInt(0); }
private E removeExisting(Cons<E> frontElems) { E result = frontElems.first(); frontElems = frontElems.rest(); if (frontElems.isEmpty()) { frontElems = rear.get().reverse(); if (!frontElems.isEmpty()) { // only clear the rear if it had anything rear.put((Cons<E>) Cons.empty()); } } front.put(frontElems); size.dec(); return result; }
@Override @Atomic(canFail = false) public boolean add(E o) { Cons<E> oldElems = entries.get(); Cons<E> newElems = adjoin(oldElems, o); if (oldElems == newElems) { return false; } else { entries.put(newElems); size.inc(); return true; } }
@Override @Atomic(canFail = false) public boolean addAll(Collection<? extends E> c) { Cons<E> prev = entries.get(); int added = 0; for (E o : c) { Cons<E> next = adjoin(prev, o); if (prev != next) { added++; prev = next; } } if (added > 0) { entries.put(prev); size.inc(added); } return added > 0; }
@Override @Atomic(canFail = false) public boolean removeAll(Collection<?> c) { Cons<E> prev = entries.get(); int removed = 0; for (Object o : c) { Cons<E> next = prev.removeFirst(o); if (prev != next) { removed++; prev = next; } } if (removed > 0) { entries.put(prev); size.dec(removed); } return removed > 0; }
@Override public void remove() { if (previous == null) { throw new IllegalStateException(); } else { VLinkedSet.this.removeCons(previous); previous = null; } } }
private void resize(int newCapacity) { // To resize the array, we create a new one and copy over the elements from the old one // As this operation is very time-sensitive, this implementation uses inside knowledge of // VArray to go faster int size = size(); VArray<E> oldVArray = array(); VArray<E> newVArray = new VArray<E>(newCapacity); // Get the AtomicReferenceArray from the underlying VArray AtomicReferenceArray<E> realArray = newVArray.values; // Copy elements over for (int i = 0; i < size; i++) { realArray.lazySet(i, oldVArray.get(i)); } // Update VBox this.array.put(newVArray); }