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 65f47010f9653f9337b4cb0c1316454349b6bf33..6986d7a493070db902944d2bfefe2a2e33942e7e 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 5daa2fb8d91ebdfa2a2d89fd7c31da8b2276d240..861acd77b9d0fe8123e47db6545abb4c77d97a8b 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 0a74be19af6573cafed024f71c22b62fb1e0c3e6..b724d6fce008588314ea47c575ac7284f6d26dc2 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 833f9eeb04a5e636bdba3bfd32dfcfd87d58e59d..40c60fef379f2fbcf967c1f9460c58ecf69813c2 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 f7e28dbcf8fc572c0f41d45962901641ea72d684..69e7e076d2f19793ed2cb189b739c7610b6aebc2 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 77cb172a3702bbe74cb7d9780e9f767e4ba5cfce..7fea30fdd8bf69db3a64be1f3ed8ff126aaad8c6 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 0f100293eafc79e6eb59d26a9d076105f5caa625..085caffb57dc345ffbe1f6b966126b6efa52bd36 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 d9d36eea28c4d7ec7937015f86021d1a7b615486..122213b07fbfbde952571232a3b9ebc9c1e1b4a1 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 6bc4d870959e6288bc25f46e9b6432a5645ba02d..a20b743dd87687bab4aed3c1eca05818f058b3cf 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() {