changeset 7544:575749b77035

restore lambda bits lost in jsr166 merge Contributed-by: akhil.arora@oracle.com
author mduigou
date Wed, 27 Feb 2013 16:50:35 -0800
parents dbb23cb1711d
children af323ffe1aa7
files src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java test/java/util/CollectionExtensionMethods/testlibrary/CollectionAsserts.java
diffstat 2 files changed, 92 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java	Wed Feb 27 16:47:51 2013 -0800
+++ b/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java	Wed Feb 27 16:50:35 2013 -0800
@@ -46,7 +46,9 @@
 package java.util.concurrent;
 import java.util.AbstractList;
 import java.util.Arrays;
+import java.util.BitSet;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.List;
@@ -56,6 +58,9 @@
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+import java.util.function.UnaryOperator;
 import java.util.stream.Stream;
 import java.util.stream.Streams;
 
@@ -1388,4 +1393,83 @@
             throw new Error(e);
         }
     }
+
+    @SuppressWarnings("unchecked")
+    public void forEach(Consumer<? super E> consumer) {
+        final Object[] elements = getArray();
+        for (final Object element : elements) {
+            consumer.accept((E) element);
+        }
+    }
+
+    @Override
+    public void sort(Comparator<? super E> c) {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            @SuppressWarnings("unchecked")
+            E[] elements = (E[]) getArray();
+            E[] newElements = Arrays.copyOf(elements, elements.length);
+            Arrays.sort(newElements, c);
+            setArray(newElements);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    @Override
+    public boolean removeAll(Predicate<? super E> filter) {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            @SuppressWarnings("unchecked")
+            final E[] elements = (E[]) getArray();
+
+            // figure out which elements are to be removed
+            // any exception thrown from the filter predicate at this stage
+            // will leave the collection unmodified
+            final BitSet removeSet = new BitSet(elements.length);
+            for (int i=0; i < elements.length; i++) {
+                final E element = elements[i];
+                if (filter.test(element)) {
+                    removeSet.set(i);
+                }
+            }
+
+            // copy surviving elements into a new array
+            final boolean anyToRemove = (removeSet != null) && !removeSet.isEmpty();
+            if (anyToRemove) {
+                final int newSize = elements.length - removeSet.cardinality();
+                final Object[] newElements = new Object[newSize];
+                for (int i=0, j=0; (i < elements.length) && (j < newSize); i++, j++) {
+                    i = removeSet.nextClearBit(i);
+                    newElements[j] = elements[i];
+                }
+                setArray(newElements);
+            }
+
+            return anyToRemove;
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    @Override
+    public void replaceAll(UnaryOperator<E> operator) {
+        final ReentrantLock lock = this.lock;
+        lock.lock();
+        try {
+            @SuppressWarnings("unchecked")
+            final E[] elements = (E[]) getArray();
+            final int len = elements.length;
+            @SuppressWarnings("unchecked")
+            final E[] newElements = (E[]) new Object[len];
+            for (int i=0; i < len; i++) {
+                newElements[i] = operator.apply(elements[i]);
+            }
+            setArray(newElements);
+        } finally {
+            lock.unlock();
+        }
+    }
 }
--- a/test/java/util/CollectionExtensionMethods/testlibrary/CollectionAsserts.java	Wed Feb 27 16:47:51 2013 -0800
+++ b/test/java/util/CollectionExtensionMethods/testlibrary/CollectionAsserts.java	Wed Feb 27 16:50:35 2013 -0800
@@ -23,7 +23,15 @@
  * questions.
  */
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;