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