@Override public void clear() { long stamp = lock.writeLock(); try { data = copyOf( data, 0 ); } finally { optimisticStamp = lock.tryConvertToOptimisticRead( stamp ); } }
@Override public T set(int index, T element) { long stamp = lock.writeLock(); try { T old = data[index]; data[index] = element; return old; } finally { optimisticStamp = lock.tryConvertToOptimisticRead( stamp ); } }
@Override public boolean add(T element) { long stamp = lock.writeLock(); try { data = copyOf( data, data.length + 1 ); data[data.length - 1] = element; return true; } finally { optimisticStamp = lock.tryConvertToOptimisticRead( stamp ); } }
public T removeLast() { long stamp = lock.writeLock(); try { T element = data[data.length - 1]; data = copyOf( data, data.length - 1 ); return element; } finally { optimisticStamp = lock.tryConvertToOptimisticRead( stamp ); } }
@Override public boolean addAll(Collection<? extends T> c) { long stamp = lock.writeLock(); try { int oldSize = data.length; data = copyOf( data, oldSize + c.size() ); for ( T element : c ) { data[oldSize++] = element; } return true; } finally { optimisticStamp = lock.tryConvertToOptimisticRead( stamp ); } }
@Override public T remove(int index) { long stamp = lock.writeLock(); try { T old = data[index]; T[] array = copyOf( data, data.length - 1 ); if ( data.length - index - 1 != 0 ) { arraycopy( data, index + 1, array, index, data.length - index - 1 ); } data = array; return old; } finally { optimisticStamp = lock.tryConvertToOptimisticRead( stamp ); } }
@Override public boolean remove(Object element) { long stamp = lock.readLock(); try { boolean found = true; while ( found ) { T[] array = data; found = false; for ( int index = array.length - 1; index >= 0; index-- ) { if ( element == array[index] ) { found = true; long writeStamp = lock.tryConvertToWriteLock( stamp ); if ( writeStamp != 0 ) { stamp = writeStamp; T[] newData = copyOf( data, data.length - 1 ); arraycopy( data, index + 1, newData, index, data.length - index - 1 ); data = newData; return true; } else { break; } } } } return false; } finally { optimisticStamp = lock.tryConvertToOptimisticRead( stamp ); } }