From a7e2682da99e99afd0c14879173087d16038b4bf Mon Sep 17 00:00:00 2001 From: brinn <brinn> Date: Sat, 28 Jan 2012 23:38:10 +0000 Subject: [PATCH] Fix method incNumberOfHyperRows() when the capacity was 0 and method size() when there where unused hyper-rows. Add method capacity() to find the current capacity. Make method incNumberOfHyperRows() and decNumberOfHyperRows() return the new number of hyper rows. SVN: 24306 --- .../cisd/base/mdarray/MDAbstractArray.java | 28 ++++++++++++++++--- .../systemsx/cisd/base/mdarray/MDArray.java | 6 +++- .../cisd/base/mdarray/MDByteArray.java | 10 +++++-- .../cisd/base/mdarray/MDDoubleArray.java | 10 +++++-- .../cisd/base/mdarray/MDFloatArray.java | 10 +++++-- .../cisd/base/mdarray/MDIntArray.java | 10 +++++-- .../cisd/base/mdarray/MDLongArray.java | 10 +++++-- .../cisd/base/mdarray/MDShortArray.java | 10 +++++-- .../cisd/base/mdarray/MDArrayTests.java | 20 +++++++++++++ 9 files changed, 91 insertions(+), 23 deletions(-) diff --git a/base/source/java/ch/systemsx/cisd/base/mdarray/MDAbstractArray.java b/base/source/java/ch/systemsx/cisd/base/mdarray/MDAbstractArray.java index 65f47010f96..6986d7a4930 100644 --- a/base/source/java/ch/systemsx/cisd/base/mdarray/MDAbstractArray.java +++ b/base/source/java/ch/systemsx/cisd/base/mdarray/MDAbstractArray.java @@ -40,6 +40,8 @@ public abstract class MDAbstractArray<T> implements Serializable protected int hyperRowLength; protected int capacityHyperRows; + + protected int size; protected MDAbstractArray(int[] dimensions, int arrayLength, int capacityHyperRows) { @@ -50,6 +52,7 @@ public abstract class MDAbstractArray<T> implements Serializable if (hyperRowLength == 0) { this.capacityHyperRows = 0; + this.size = 0; } else { if (arrayLength % hyperRowLength != 0) @@ -60,6 +63,7 @@ public abstract class MDAbstractArray<T> implements Serializable this.capacityHyperRows = (capacityHyperRows > 0) ? capacityHyperRows : Math.max(dimensions[0], arrayLength / hyperRowLength); + this.size = dimensions[0] * hyperRowLength; } } @@ -116,7 +120,10 @@ public abstract class MDAbstractArray<T> implements Serializable /** * Returns the number of elements in the array. */ - public abstract int size(); + public int size() + { + return size; + } /** * Return an object which has the same value as the element of the array specified by @@ -144,25 +151,38 @@ public abstract class MDAbstractArray<T> implements Serializable protected abstract void adaptCapacityHyperRows(); + /** + * Returns the capacity of elements in the array. + */ + public abstract int capacity(); + /** * Increase the number of hyper-rows by <var>count</var>. Doubles the capacity if needed. + * + * @return The new number of rows. */ - public void incNumberOfHyperRows(int count) + public int incNumberOfHyperRows(int count) { dimensions[0] += count; if (dimensions[0] > capacityHyperRows) { - capacityHyperRows *= 2; + capacityHyperRows = Math.max(capacityHyperRows * 2, dimensions[0]); adaptCapacityHyperRows(); } + size += count * hyperRowLength; + return dimensions[0]; } /** * Decrease the number of hyper-rows by <var>count</var>. + * + * @return The new number of rows. */ - public void decNumberOfHyperRows(int count) + public int decNumberOfHyperRows(int count) { dimensions[0] -= count; + size -= count * hyperRowLength; + return dimensions[0]; } /** diff --git a/base/source/java/ch/systemsx/cisd/base/mdarray/MDArray.java b/base/source/java/ch/systemsx/cisd/base/mdarray/MDArray.java index 5daa2fb8d91..861acd77b9d 100644 --- a/base/source/java/ch/systemsx/cisd/base/mdarray/MDArray.java +++ b/base/source/java/ch/systemsx/cisd/base/mdarray/MDArray.java @@ -132,7 +132,7 @@ public class MDArray<T> extends MDAbstractArray<T> } @Override - public int size() + public int capacity() { return flattenedArray.length; } @@ -331,6 +331,10 @@ public class MDArray<T> extends MDAbstractArray<T> { this.capacityHyperRows = dimensions[0]; } + if (size == 0) + { + this.size = hyperRowLength * dimensions[0]; + } } } diff --git a/base/source/java/ch/systemsx/cisd/base/mdarray/MDByteArray.java b/base/source/java/ch/systemsx/cisd/base/mdarray/MDByteArray.java index 0a74be19af6..b724d6fce00 100644 --- a/base/source/java/ch/systemsx/cisd/base/mdarray/MDByteArray.java +++ b/base/source/java/ch/systemsx/cisd/base/mdarray/MDByteArray.java @@ -145,8 +145,8 @@ public final class MDByteArray extends MDAbstractArray<Byte> final int sizeX = dimensions[0]; final int sizeY = dimensions[1]; - int size = getLength(dimensions, 0); - this.flattenedArray = new byte[size]; + int length = getLength(dimensions, 0); + this.flattenedArray = new byte[length]; for (int i = 0; i < sizeX; ++i) { System.arraycopy(matrix[i], 0, flattenedArray, i * sizeY, sizeY); @@ -162,7 +162,7 @@ public final class MDByteArray extends MDAbstractArray<Byte> } @Override - public int size() + public int capacity() { return flattenedArray.length; } @@ -355,6 +355,10 @@ public final class MDByteArray extends MDAbstractArray<Byte> { this.capacityHyperRows = dimensions[0]; } + if (size == 0) + { + this.size = hyperRowLength * dimensions[0]; + } } } diff --git a/base/source/java/ch/systemsx/cisd/base/mdarray/MDDoubleArray.java b/base/source/java/ch/systemsx/cisd/base/mdarray/MDDoubleArray.java index 833f9eeb04a..40c60fef379 100644 --- a/base/source/java/ch/systemsx/cisd/base/mdarray/MDDoubleArray.java +++ b/base/source/java/ch/systemsx/cisd/base/mdarray/MDDoubleArray.java @@ -145,8 +145,8 @@ public final class MDDoubleArray extends MDAbstractArray<Double> final int sizeX = dimensions[0]; final int sizeY = dimensions[1]; - int size = getLength(dimensions, 0); - this.flattenedArray = new double[size]; + int length = getLength(dimensions, 0); + this.flattenedArray = new double[length]; for (int i = 0; i < sizeX; ++i) { System.arraycopy(matrix[i], 0, flattenedArray, i * sizeY, sizeY); @@ -162,7 +162,7 @@ public final class MDDoubleArray extends MDAbstractArray<Double> } @Override - public int size() + public int capacity() { return flattenedArray.length; } @@ -355,6 +355,10 @@ public final class MDDoubleArray extends MDAbstractArray<Double> { this.capacityHyperRows = dimensions[0]; } + if (size == 0) + { + this.size = hyperRowLength * dimensions[0]; + } } } diff --git a/base/source/java/ch/systemsx/cisd/base/mdarray/MDFloatArray.java b/base/source/java/ch/systemsx/cisd/base/mdarray/MDFloatArray.java index f7e28dbcf8f..69e7e076d2f 100644 --- a/base/source/java/ch/systemsx/cisd/base/mdarray/MDFloatArray.java +++ b/base/source/java/ch/systemsx/cisd/base/mdarray/MDFloatArray.java @@ -145,8 +145,8 @@ public final class MDFloatArray extends MDAbstractArray<Float> final int sizeX = dimensions[0]; final int sizeY = dimensions[1]; - int size = getLength(dimensions, 0); - this.flattenedArray = new float[size]; + int length = getLength(dimensions, 0); + this.flattenedArray = new float[length]; for (int i = 0; i < sizeX; ++i) { System.arraycopy(matrix[i], 0, flattenedArray, i * sizeY, sizeY); @@ -162,7 +162,7 @@ public final class MDFloatArray extends MDAbstractArray<Float> } @Override - public int size() + public int capacity() { return flattenedArray.length; } @@ -355,6 +355,10 @@ public final class MDFloatArray extends MDAbstractArray<Float> { this.capacityHyperRows = dimensions[0]; } + if (size == 0) + { + this.size = hyperRowLength * dimensions[0]; + } } } diff --git a/base/source/java/ch/systemsx/cisd/base/mdarray/MDIntArray.java b/base/source/java/ch/systemsx/cisd/base/mdarray/MDIntArray.java index 77cb172a370..7fea30fdd8b 100644 --- a/base/source/java/ch/systemsx/cisd/base/mdarray/MDIntArray.java +++ b/base/source/java/ch/systemsx/cisd/base/mdarray/MDIntArray.java @@ -145,8 +145,8 @@ public final class MDIntArray extends MDAbstractArray<Integer> final int sizeX = dimensions[0]; final int sizeY = dimensions[1]; - int size = getLength(dimensions, 0); - this.flattenedArray = new int[size]; + int length = getLength(dimensions, 0); + this.flattenedArray = new int[length]; for (int i = 0; i < sizeX; ++i) { System.arraycopy(matrix[i], 0, flattenedArray, i * sizeY, sizeY); @@ -162,7 +162,7 @@ public final class MDIntArray extends MDAbstractArray<Integer> } @Override - public int size() + public int capacity() { return flattenedArray.length; } @@ -355,6 +355,10 @@ public final class MDIntArray extends MDAbstractArray<Integer> { this.capacityHyperRows = dimensions[0]; } + if (size == 0) + { + this.size = hyperRowLength * dimensions[0]; + } } } diff --git a/base/source/java/ch/systemsx/cisd/base/mdarray/MDLongArray.java b/base/source/java/ch/systemsx/cisd/base/mdarray/MDLongArray.java index 0f100293eaf..085caffb57d 100644 --- a/base/source/java/ch/systemsx/cisd/base/mdarray/MDLongArray.java +++ b/base/source/java/ch/systemsx/cisd/base/mdarray/MDLongArray.java @@ -145,8 +145,8 @@ public final class MDLongArray extends MDAbstractArray<Long> final int sizeX = dimensions[0]; final int sizeY = dimensions[1]; - int size = getLength(dimensions, 0); - this.flattenedArray = new long[size]; + int length = getLength(dimensions, 0); + this.flattenedArray = new long[length]; for (int i = 0; i < sizeX; ++i) { System.arraycopy(matrix[i], 0, flattenedArray, i * sizeY, sizeY); @@ -162,7 +162,7 @@ public final class MDLongArray extends MDAbstractArray<Long> } @Override - public int size() + public int capacity() { return flattenedArray.length; } @@ -355,6 +355,10 @@ public final class MDLongArray extends MDAbstractArray<Long> { this.capacityHyperRows = dimensions[0]; } + if (size == 0) + { + this.size = hyperRowLength * dimensions[0]; + } } } diff --git a/base/source/java/ch/systemsx/cisd/base/mdarray/MDShortArray.java b/base/source/java/ch/systemsx/cisd/base/mdarray/MDShortArray.java index d9d36eea28c..122213b07fb 100644 --- a/base/source/java/ch/systemsx/cisd/base/mdarray/MDShortArray.java +++ b/base/source/java/ch/systemsx/cisd/base/mdarray/MDShortArray.java @@ -145,8 +145,8 @@ public final class MDShortArray extends MDAbstractArray<Short> final int sizeX = dimensions[0]; final int sizeY = dimensions[1]; - int size = getLength(dimensions, 0); - this.flattenedArray = new short[size]; + int length = getLength(dimensions, 0); + this.flattenedArray = new short[length]; for (int i = 0; i < sizeX; ++i) { System.arraycopy(matrix[i], 0, flattenedArray, i * sizeY, sizeY); @@ -162,7 +162,7 @@ public final class MDShortArray extends MDAbstractArray<Short> } @Override - public int size() + public int capacity() { return flattenedArray.length; } @@ -355,6 +355,10 @@ public final class MDShortArray extends MDAbstractArray<Short> { this.capacityHyperRows = dimensions[0]; } + if (size == 0) + { + this.size = hyperRowLength * dimensions[0]; + } } } diff --git a/base/sourceTest/java/ch/systemsx/cisd/base/mdarray/MDArrayTests.java b/base/sourceTest/java/ch/systemsx/cisd/base/mdarray/MDArrayTests.java index 6bc4d870959..a20b743dd87 100644 --- a/base/sourceTest/java/ch/systemsx/cisd/base/mdarray/MDArrayTests.java +++ b/base/sourceTest/java/ch/systemsx/cisd/base/mdarray/MDArrayTests.java @@ -61,6 +61,12 @@ public class MDArrayTests return 0; } + @Override + public int capacity() + { + return 0; + } + @Override public Object getAsFlatArray() { @@ -229,6 +235,20 @@ public class MDArrayTests assertEquals(8, arr.get(3, 1)); } + @Test + public void testChangeHyperRowCountIntArrayFromZero() + { + final MDIntArray arr = new MDIntArray(new int[] { 0 }); + assertEquals(0, arr.size(0)); + arr.incNumberOfHyperRows(1); + assertEquals(1, arr.size(0)); + arr.set(17, 0); + assertEquals(17, arr.get(0)); + arr.incNumberOfHyperRows(1); + arr.incNumberOfHyperRows(1); + assertEquals(3, arr.size()); + } + @Test public void testChangeHyperRowCountTArray() { -- GitLab