Added method to change the size of a MutableArray. Added factory method to construct MeutableArray of specific size. These provide a O(n) way to initialize a MutableArray as shown by com.google.gwt.collections.MutableArrayBenchmarkTest Review at http://gwt-code-reviews.appspot.com/319801 git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7912 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/bikeshed/src/com/google/gwt/collections/CollectionFactory.java b/bikeshed/src/com/google/gwt/collections/CollectionFactory.java index c98e743..815751a 100644 --- a/bikeshed/src/com/google/gwt/collections/CollectionFactory.java +++ b/bikeshed/src/com/google/gwt/collections/CollectionFactory.java
@@ -23,5 +23,11 @@ public static <E> MutableArray<E> createMutableArray() { return new MutableArray<E>(); } + + public static <E> MutableArray<E> createMutableArray(int size, E fillValue) { + MutableArray<E> r = new MutableArray<E>(); + r.setSize(size, fillValue); + return r; + } }
diff --git a/bikeshed/src/com/google/gwt/collections/MutableArray.java b/bikeshed/src/com/google/gwt/collections/MutableArray.java index 3614a8c..c76cf48 100644 --- a/bikeshed/src/com/google/gwt/collections/MutableArray.java +++ b/bikeshed/src/com/google/gwt/collections/MutableArray.java
@@ -15,6 +15,8 @@ */ package com.google.gwt.collections; +import java.util.Arrays; + /** * An array whose content and length can change over time. * @@ -22,6 +24,7 @@ */ public class MutableArray<E> extends Array<E> { + // TODO: refactor the unchecked elems construction into a separate method // The elements in the array E[] elems; @@ -141,6 +144,46 @@ assert false : "index " + index + " in range [0, " + size() + "), but set(int,E) failed"; } } + + /** + * Changes the array size. If {@code newSize} is less than the current size, the array is + * truncated. If {@code newSize} is greater than the current size the array is grown and + * the new elements of the array filled up with {@code fillValue}. + */ + @SuppressWarnings("unchecked") + @LinearTime + public void setSize(int newSize, E fillValue) { + Assertions.assertNotFrozen(this); + assert newSize >= 0 : "expecting newSize >= 0, got " + newSize; + + int fillStart; + + if (newSize == size()) { + return; + } else if (newSize == 0) { + elems = null; + return; + } + + if (elems == null) { + fillStart = 0; + } else if (newSize < elems.length) { + // nothing to fill + fillStart = newSize; + } else { + fillStart = elems.length; + } + + E[] newElems = (E[]) new Object[newSize]; + + if (fillStart != 0) { + System.arraycopy(elems, 0, newElems, 0, fillStart); + } + + Arrays.fill(newElems, fillStart, newSize, fillValue); + + elems = newElems; + } @Override @ConstantTime
diff --git a/bikeshed/test/com/google/gwt/collections/ClientMutableArrayTest.java b/bikeshed/test/com/google/gwt/collections/ClientMutableArrayTest.java new file mode 100644 index 0000000..162a41e --- /dev/null +++ b/bikeshed/test/com/google/gwt/collections/ClientMutableArrayTest.java
@@ -0,0 +1,27 @@ +/* + * Copyright 2009 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.gwt.collections; + +/** + * Re-run {@link ObjectArrayTest} tests under GWT. + */ +public class ClientMutableArrayTest extends ObjectArrayTest { + @Override + public String getModuleName() { + return "com.google.gwt.collections.Collections"; + } + +}
diff --git a/bikeshed/test/com/google/gwt/collections/GwtImmutableArrayTest.java b/bikeshed/test/com/google/gwt/collections/GwtImmutableArrayTest.java new file mode 100644 index 0000000..d7a5f22 --- /dev/null +++ b/bikeshed/test/com/google/gwt/collections/GwtImmutableArrayTest.java
@@ -0,0 +1,27 @@ +/* + * Copyright 2009 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.gwt.collections; + +/** + * Re-run {@link ImmutableArrayTest} tests under GWT. + */ +public class GwtImmutableArrayTest extends ImmutableArrayTest { + @Override + public String getModuleName() { + return "com.google.gwt.collections.Collections"; + } + +}
diff --git a/bikeshed/test/com/google/gwt/collections/MutableArrayBenchmarkTest.java b/bikeshed/test/com/google/gwt/collections/MutableArrayBenchmarkTest.java new file mode 100644 index 0000000..9d59bfe --- /dev/null +++ b/bikeshed/test/com/google/gwt/collections/MutableArrayBenchmarkTest.java
@@ -0,0 +1,58 @@ +/* + * Copyright 2009 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.gwt.collections; + +import com.google.gwt.benchmarks.client.Benchmark; +import com.google.gwt.benchmarks.client.IntRange; +import com.google.gwt.benchmarks.client.Operator; +import com.google.gwt.benchmarks.client.RangeField; + +/** + * Benchmarks the performance of various MutableArray methods. + */ +public class MutableArrayBenchmarkTest extends Benchmark { + + final IntRange elemRange = new IntRange(0, 5000, Operator.ADD, 100); + + @Override + public String getModuleName() { + return "com.google.gwt.collections.Collections"; + } + + public void testAddGrowth() { + } + + public void testAddGrowth(@RangeField("elemRange") Integer numElements) { + MutableArray<Integer> ma = CollectionFactory.createMutableArray(); + + for (int i = 0; i < numElements; i++) { + ma.add(i); + } + } + + public void testSetSizeGrowth() { + } + + public void testSetSizeGrowth(@RangeField("elemRange") Integer numElements) { + MutableArray<Integer> ma = CollectionFactory.createMutableArray(); + + ma.setSize(numElements, null); + for (int i = 0; i < numElements; i++) { + ma.set(i, i); + } + } + +}
diff --git a/bikeshed/test/com/google/gwt/collections/ObjectArrayTest.java b/bikeshed/test/com/google/gwt/collections/ObjectArrayTest.java index ed63876..988ebc5 100644 --- a/bikeshed/test/com/google/gwt/collections/ObjectArrayTest.java +++ b/bikeshed/test/com/google/gwt/collections/ObjectArrayTest.java
@@ -265,5 +265,34 @@ Array<String> a = b; assertEquals(0, a.size()); } + + public void testSetSize() { + MutableArray<String> b = createMutableArray(); + + b.setSize(1, "fillValue"); + assertEquals(1, b.size()); + assertEquals("fillValue", b.get(0)); + + b.setSize(2, "anotherValue"); + assertEquals(2, b.size()); + assertEquals("fillValue", b.get(0)); + assertEquals("anotherValue", b.get(1)); + + b.setSize(1, null); + assertEquals(1, b.size()); + assertEquals("fillValue", b.get(0)); + + b.setSize(0, null); + assertEquals(0, b.size()); + assertEquals(null, b.elems); + } + + public void testCreateNonEmptyArray() { + MutableArray<String> b = createMutableArray(2, "apples"); + + assertEquals(2, b.size()); + assertEquals("apples", b.get(0)); + assertEquals("apples", b.get(1)); + } }