/**
  * Creates a new array with from copying oldA and removing 'length' entries at position pos. The
  * old array is returned to the pool.
  *
  * @param oldA old array
  * @param dstPos destination
  * @param length length
  * @return new array
  */
 public static long[] arrayRemove(long[] oldA, int dstPos, int length) {
   long[] ret = arrayCreate(oldA.length - length);
   arraycopy(oldA, 0, ret, 0, dstPos);
   arraycopy(oldA, dstPos + length, ret, dstPos, ret.length - dstPos);
   POOL.offer(oldA);
   return ret;
 }
 /**
  * Reads a long array from a stream.
  *
  * @param in input stream
  * @return the long array.
  * @throws IOException if reading fails
  */
 public static long[] read(ObjectInput in) throws IOException {
   int size = in.readInt();
   long[] ret = POOL.getArray(size);
   for (int i = 0; i < size; i++) {
     ret[i] = in.readLong();
   }
   return ret;
 }
 /**
  * Creates a new array with from copying oldA and inserting insertA at position pos. The old array
  * is returned to the pool.
  *
  * @param oldA old array
  * @param insertA array to insert
  * @param dstPos destination position
  * @return new array
  */
 public static long[] insertArray(long[] oldA, long[] insertA, int dstPos) {
   long[] ret = arrayCreate(oldA.length + insertA.length);
   arraycopy(oldA, 0, ret, 0, dstPos);
   arraycopy(insertA, 0, ret, dstPos, insertA.length);
   arraycopy(oldA, dstPos, ret, dstPos + insertA.length, oldA.length - dstPos);
   POOL.offer(oldA);
   return ret;
 }
 /**
  * Replaces an array with another array. The replaced array is returned to the pool.
  *
  * @param oldA old array
  * @param newA new array
  * @return new array
  */
 public static long[] arrayReplace(long[] oldA, long[] newA) {
   if (oldA != null) {
     POOL.offer(oldA);
   }
   return newA;
 }
 /**
  * Create an array.
  *
  * @param size size
  * @return a new array
  */
 public static long[] arrayCreate(int size) {
   return POOL.getArray(calcArraySize(size));
 }