]> source.dussan.org Git - poi.git/commitdiff
Helper method for when moving stuff about in an array, plus test
authorNick Burch <nick@apache.org>
Sun, 2 Jul 2006 15:21:12 +0000 (15:21 +0000)
committerNick Burch <nick@apache.org>
Sun, 2 Jul 2006 15:21:12 +0000 (15:21 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@418607 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/util/ArrayUtil.java
src/testcases/org/apache/poi/util/TestArrayUtil.java [new file with mode: 0644]

index 1d05a5ff3649e4c3a21149370c8e44fe4f31f51a..9de24f02dfae77fb13949ac11d881142ff08f0eb 100644 (file)
@@ -47,5 +47,61 @@ public class ArrayUtil
         System.arraycopy( src, src_position, dst, dst_position, length);
     }
 
-
+    /**
+     * Moves a number of entries in an array to another point in the array,
+     *  shifting those inbetween as required.
+     * @param array The array to alter
+     * @param moveFrom The (0 based) index of the first entry to move
+     * @param moveTo The (0 based) index of the positition to move to
+     * @param numToMove The number of entries to move
+     */
+    public static void arrayMoveWithin(Object[] array, int moveFrom, int moveTo, int numToMove) {
+       // If we're not asked to do anything, return now
+       if(numToMove <= 0) { return; }
+       if(moveFrom == moveTo) { return; }
+       
+       // Check that the values supplied are valid
+       if(moveFrom < 0 || moveFrom >= array.length) {
+               throw new IllegalArgumentException("The moveFrom must be a valid array index");
+       }
+       if(moveTo < 0 || moveTo >= array.length) {
+               throw new IllegalArgumentException("The moveTo must be a valid array index");
+       }
+       if(moveFrom+numToMove > array.length) {
+               throw new IllegalArgumentException("Asked to move more entries than the array has");
+       }
+       if(moveTo+numToMove > array.length) {
+               throw new IllegalArgumentException("Asked to move to a position that doesn't have enough space");
+       }
+       
+       // Grab the bit to move 
+       Object[] toMove = new Object[numToMove];
+       System.arraycopy(array, moveFrom, toMove, 0, numToMove);
+       
+       // Grab the bit to be shifted
+       Object[] toShift;
+       int shiftTo;
+       if(moveFrom > moveTo) {
+               // Moving to an earlier point in the array
+               // Grab everything between the two points
+               toShift = new Object[(moveFrom-moveTo)];
+               System.arraycopy(array, moveTo, toShift, 0, toShift.length);
+               shiftTo = moveTo + numToMove;
+       } else {
+               // Moving to a later point in the array
+               // Grab everything from after the toMove block, to the new point
+               toShift = new Object[(moveTo-moveFrom)];
+               System.arraycopy(array, moveFrom+numToMove, toShift, 0, toShift.length);
+               shiftTo = moveFrom;
+       }
+       
+       // Copy the moved block to its new location
+       System.arraycopy(toMove, 0, array, moveTo, toMove.length);
+       
+       // And copy the shifted block to the shifted location
+       System.arraycopy(toShift, 0, array, shiftTo, toShift.length);
+       
+       
+       // We're done - array will now have everything moved as required
+    }
 }
diff --git a/src/testcases/org/apache/poi/util/TestArrayUtil.java b/src/testcases/org/apache/poi/util/TestArrayUtil.java
new file mode 100644 (file)
index 0000000..e2a531d
--- /dev/null
@@ -0,0 +1,291 @@
+
+/* ====================================================================
+   Copyright 2002-2004   Apache Software Foundation
+
+   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 org.apache.poi.util;
+
+import junit.framework.*;
+
+/**
+ * Unit test for ArrayUtil
+ *
+ * @author Nick Burch
+ */
+public class TestArrayUtil extends TestCase
+{
+       /**
+        * Test to ensure that our own arraycopy behaves as it should do
+        */
+       public void testarraycopy() {
+               byte[] bytes = new byte[] { 0x01, 0x02, 0x03, 0x04 };
+               
+               // Test copy whole thing
+               byte[] dest = new byte[4];
+               ArrayUtil.arraycopy(bytes, 0, dest, 0, 4);
+               
+               assertEquals(dest.length, bytes.length);
+               for(int i=0; i<dest.length; i++) {
+                       assertEquals(bytes[i], dest[i]);
+               }
+               
+               // ToDo - test exceptions are as expected
+       }
+       
+       
+       /**
+        * Helper for testArrayMoveWithin 
+        */
+       private Integer[] getIntsList() { 
+               return new Integer[] {
+                               new Integer(0),
+                               new Integer(1),
+                               new Integer(2),
+                               new Integer(3),
+                               new Integer(4),
+                               new Integer(5),
+                               new Integer(6),
+                               new Integer(7),
+                               new Integer(8),
+                               new Integer(9)
+               };
+       }
+       
+       /**
+        * Test to ensure that arrayMoveWithin works as expected
+        */
+       public void testArrayMoveWithin() {
+               Integer[] ints = getIntsList();
+               
+               assertEquals(new Integer(0), ints[0]);
+               assertEquals(new Integer(1), ints[1]);
+               assertEquals(new Integer(2), ints[2]);
+               assertEquals(new Integer(3), ints[3]);
+               assertEquals(new Integer(4), ints[4]);
+               assertEquals(new Integer(5), ints[5]);
+               assertEquals(new Integer(6), ints[6]);
+               assertEquals(new Integer(7), ints[7]);
+               assertEquals(new Integer(8), ints[8]);
+               assertEquals(new Integer(9), ints[9]);
+               
+               
+               //
+               // Moving to a later point in the array
+               //
+               
+               // Shift 1 back
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 4, 8, 1);
+               assertEquals(new Integer(0), ints[0]);
+               assertEquals(new Integer(1), ints[1]);
+               assertEquals(new Integer(2), ints[2]);
+               assertEquals(new Integer(3), ints[3]);
+               assertEquals(new Integer(5), ints[4]);
+               assertEquals(new Integer(6), ints[5]);
+               assertEquals(new Integer(7), ints[6]);
+               assertEquals(new Integer(8), ints[7]);
+               assertEquals(new Integer(4), ints[8]);
+               assertEquals(new Integer(9), ints[9]);
+               
+               // Shift front 1 back
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 0, 7, 1);
+               assertEquals(new Integer(1), ints[0]);
+               assertEquals(new Integer(2), ints[1]);
+               assertEquals(new Integer(3), ints[2]);
+               assertEquals(new Integer(4), ints[3]);
+               assertEquals(new Integer(5), ints[4]);
+               assertEquals(new Integer(6), ints[5]);
+               assertEquals(new Integer(7), ints[6]);
+               assertEquals(new Integer(0), ints[7]);
+               assertEquals(new Integer(8), ints[8]);
+               assertEquals(new Integer(9), ints[9]);
+               
+               // Shift 1 to end
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 4, 9, 1);
+               assertEquals(new Integer(0), ints[0]);
+               assertEquals(new Integer(1), ints[1]);
+               assertEquals(new Integer(2), ints[2]);
+               assertEquals(new Integer(3), ints[3]);
+               assertEquals(new Integer(5), ints[4]);
+               assertEquals(new Integer(6), ints[5]);
+               assertEquals(new Integer(7), ints[6]);
+               assertEquals(new Integer(8), ints[7]);
+               assertEquals(new Integer(9), ints[8]);
+               assertEquals(new Integer(4), ints[9]);
+
+                               
+               //
+               // Moving to an earlier point in the array
+               //
+               
+               // Shift 1 forward
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 8, 3, 1);
+               assertEquals(new Integer(0), ints[0]);
+               assertEquals(new Integer(1), ints[1]);
+               assertEquals(new Integer(2), ints[2]);
+               assertEquals(new Integer(8), ints[3]);
+               assertEquals(new Integer(3), ints[4]);
+               assertEquals(new Integer(4), ints[5]);
+               assertEquals(new Integer(5), ints[6]);
+               assertEquals(new Integer(6), ints[7]);
+               assertEquals(new Integer(7), ints[8]);
+               assertEquals(new Integer(9), ints[9]);
+               
+               // Shift end 1 forward
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 9, 2, 1);
+               assertEquals(new Integer(0), ints[0]);
+               assertEquals(new Integer(1), ints[1]);
+               assertEquals(new Integer(9), ints[2]);
+               assertEquals(new Integer(2), ints[3]);
+               assertEquals(new Integer(3), ints[4]);
+               assertEquals(new Integer(4), ints[5]);
+               assertEquals(new Integer(5), ints[6]);
+               assertEquals(new Integer(6), ints[7]);
+               assertEquals(new Integer(7), ints[8]);
+               assertEquals(new Integer(8), ints[9]);
+               
+               // Shift 1 to front
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 5, 0, 1);
+               assertEquals(new Integer(5), ints[0]);
+               assertEquals(new Integer(0), ints[1]);
+               assertEquals(new Integer(1), ints[2]);
+               assertEquals(new Integer(2), ints[3]);
+               assertEquals(new Integer(3), ints[4]);
+               assertEquals(new Integer(4), ints[5]);
+               assertEquals(new Integer(6), ints[6]);
+               assertEquals(new Integer(7), ints[7]);
+               assertEquals(new Integer(8), ints[8]);
+               assertEquals(new Integer(9), ints[9]);
+
+               
+               //
+               // Moving many to a later point in the array
+               //
+               
+               // Shift 3 back
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 2, 6, 3);
+               assertEquals(new Integer(0), ints[0]);
+               assertEquals(new Integer(1), ints[1]);
+               assertEquals(new Integer(5), ints[2]);
+               assertEquals(new Integer(6), ints[3]);
+               assertEquals(new Integer(7), ints[4]);
+               assertEquals(new Integer(8), ints[5]);
+               assertEquals(new Integer(2), ints[6]);
+               assertEquals(new Integer(3), ints[7]);
+               assertEquals(new Integer(4), ints[8]);
+               assertEquals(new Integer(9), ints[9]);
+               
+               // Shift 3 to back
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 2, 7, 3);
+               assertEquals(new Integer(0), ints[0]);
+               assertEquals(new Integer(1), ints[1]);
+               assertEquals(new Integer(5), ints[2]);
+               assertEquals(new Integer(6), ints[3]);
+               assertEquals(new Integer(7), ints[4]);
+               assertEquals(new Integer(8), ints[5]);
+               assertEquals(new Integer(9), ints[6]);
+               assertEquals(new Integer(2), ints[7]);
+               assertEquals(new Integer(3), ints[8]);
+               assertEquals(new Integer(4), ints[9]);
+               
+               // Shift from 3 front
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 0, 5, 3);
+               assertEquals(new Integer(3), ints[0]);
+               assertEquals(new Integer(4), ints[1]);
+               assertEquals(new Integer(5), ints[2]);
+               assertEquals(new Integer(6), ints[3]);
+               assertEquals(new Integer(7), ints[4]);
+               assertEquals(new Integer(0), ints[5]);
+               assertEquals(new Integer(1), ints[6]);
+               assertEquals(new Integer(2), ints[7]);
+               assertEquals(new Integer(8), ints[8]);
+               assertEquals(new Integer(9), ints[9]);
+               
+               
+               //
+               // Moving many to an earlier point in the array
+               //
+               
+               // Shift 3 forward
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 6, 2, 3);
+               assertEquals(new Integer(0), ints[0]);
+               assertEquals(new Integer(1), ints[1]);
+               assertEquals(new Integer(6), ints[2]);
+               assertEquals(new Integer(7), ints[3]);
+               assertEquals(new Integer(8), ints[4]);
+               assertEquals(new Integer(2), ints[5]);
+               assertEquals(new Integer(3), ints[6]);
+               assertEquals(new Integer(4), ints[7]);
+               assertEquals(new Integer(5), ints[8]);
+               assertEquals(new Integer(9), ints[9]);
+               
+               // Shift 3 to front
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 6, 0, 3);
+               assertEquals(new Integer(6), ints[0]);
+               assertEquals(new Integer(7), ints[1]);
+               assertEquals(new Integer(8), ints[2]);
+               assertEquals(new Integer(0), ints[3]);
+               assertEquals(new Integer(1), ints[4]);
+               assertEquals(new Integer(2), ints[5]);
+               assertEquals(new Integer(3), ints[6]);
+               assertEquals(new Integer(4), ints[7]);
+               assertEquals(new Integer(5), ints[8]);
+               assertEquals(new Integer(9), ints[9]);
+               
+               // Shift from 3 back
+               ints = getIntsList();
+               ArrayUtil.arrayMoveWithin(ints, 7, 3, 3);
+               assertEquals(new Integer(0), ints[0]);
+               assertEquals(new Integer(1), ints[1]);
+               assertEquals(new Integer(2), ints[2]);
+               assertEquals(new Integer(7), ints[3]);
+               assertEquals(new Integer(8), ints[4]);
+               assertEquals(new Integer(9), ints[5]);
+               assertEquals(new Integer(3), ints[6]);
+               assertEquals(new Integer(4), ints[7]);
+               assertEquals(new Integer(5), ints[8]);
+               assertEquals(new Integer(6), ints[9]);
+               
+               
+               // Check can't shift more than we have
+               try {
+                       ints = getIntsList();
+                       ArrayUtil.arrayMoveWithin(ints, 7, 3, 5);
+                       fail();
+               } catch(IllegalArgumentException e) {
+                       // Good, we don't have 5 from 7 onwards
+               }
+               
+               // Check can't shift where would overshoot
+               try {
+                       ints = getIntsList();
+                       ArrayUtil.arrayMoveWithin(ints, 2, 7, 5);
+                       fail();
+               } catch(IllegalArgumentException e) {
+                       // Good, we can't fit 5 in starting at 7
+               }
+       }
+}
+