Skip to content

Commit

Permalink
Helper method for when moving stuff about in an array, plus test
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@418607 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
Gagravarr committed Jul 2, 2006
1 parent 4864da5 commit 19894ff
Show file tree
Hide file tree
Showing 2 changed files with 348 additions and 1 deletion.
58 changes: 57 additions & 1 deletion src/java/org/apache/poi/util/ArrayUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,61 @@ public static void arraycopy(byte[] src, int src_position, byte[] dst, int dst_p
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
}
}
291 changes: 291 additions & 0 deletions src/testcases/org/apache/poi/util/TestArrayUtil.java
Original file line number Diff line number Diff line change
@@ -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
}
}
}

0 comments on commit 19894ff

Please sign in to comment.