From: Nick Burch Date: Sun, 2 Jul 2006 15:21:12 +0000 (+0000) Subject: Helper method for when moving stuff about in an array, plus test X-Git-Tag: REL_3_0_ALPHA3~80 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=557b4bb4fa899c1bc22b8430987473e146b92393;p=poi.git Helper method for when moving stuff about in an array, plus test git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@418607 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/util/ArrayUtil.java b/src/java/org/apache/poi/util/ArrayUtil.java index 1d05a5ff36..9de24f02df 100644 --- a/src/java/org/apache/poi/util/ArrayUtil.java +++ b/src/java/org/apache/poi/util/ArrayUtil.java @@ -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 index 0000000000..e2a531dd08 --- /dev/null +++ b/src/testcases/org/apache/poi/util/TestArrayUtil.java @@ -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