/* * Genoogle: Similar DNA Sequences Searching Engine and Tools. (http://genoogle.pih.bio.br) * Copyright (C) 2008,2009 Felipe Fernandes Albrecht (felipe.albrecht@gmail.com) * * For further information check the LICENSE file. */ package bio.pih.genoogle.util; import java.util.Arrays; /** * Array of primitive long which has growing capability. Useful for large arrays of arrays. * * @author Felipe Albrecht */ public class LongArray { private static long[] EMPTY_ARRAY = new long[0]; private long[] finalArray; private long[] actualBlock; private int actualBockPos; private static final int DEFAULT_INITIAL_SIZE = 5; /** * Minimum quantity of memory used by each instance of this class. */ public static final int MINIMUM_MEMORY_USED = 8 /* class instance */ + 8 /* final arrayArray */ + 8 /* actualBlock */ + 4 /* actualBlockPos */ + 8 * DEFAULT_INITIAL_SIZE; /* array */ /** * Constructor that gives the block size. */ public LongArray() { this.finalArray = null; this.actualBlock = null; this.actualBockPos = 0; } /** * Add a new value into the array * * @param value */ public void add(long value) { ensureCapacity(); actualBlock[actualBockPos++] = value; } private void ensureCapacity() { if (actualBockPos == DEFAULT_INITIAL_SIZE) { getArray(); } if (actualBlock == null) { actualBlock = new long[DEFAULT_INITIAL_SIZE]; actualBockPos = 0; } } /** * Get the data as a long array. It returns the internal array reference, do not a copy, for * performance reasons. It is also used to compress the buckets into a unique array. * * @return the array, without empty fields. */ public long[] getArray() { // Special case: no data was added from begin or after the last getArray() if (actualBockPos == 0) { if (finalArray == null) { return EMPTY_ARRAY; } return finalArray; } int size = 0; if (finalArray != null) { size += finalArray.length; } size += actualBockPos; long[] o = new long[size]; int pos = 0; if (finalArray != null) { System.arraycopy(finalArray, 0, o, 0, finalArray.length); pos = finalArray.length; } System.arraycopy(actualBlock, 0, o, pos, actualBockPos); actualBockPos = 0; actualBlock = null; finalArray = o; return finalArray; } /** * Sort the array */ public void sort() { getArray(); if (finalArray != null) { Arrays.sort(finalArray); } } @Override public String toString() { getArray(); return Arrays.toString(finalArray); } /** * @return the length of the data */ public int length() { return getArray().length; } /** * Saving space. Do not create a new LongArray neither a new actualBlock. */ public void reset() { actualBockPos = 0; finalArray = null; } /** * test * TODO: move to a junit. */ public static void mainX(String[] args) { LongArray longArray = new LongArray(); longArray.add(1); longArray.add(2); longArray.add(3); for (long i : longArray.getArray()) System.out.print(i + " "); System.out.println(); longArray.add(2); longArray.add(5); longArray.add(3); for (long i : longArray.getArray()) System.out.print(i + " "); System.out.println(); longArray.add(4); for (long i : longArray.getArray()) System.out.print(i + " "); System.out.println(); longArray.add(30); longArray.add(40); longArray.add(50); longArray.add(60); longArray.add(70); longArray.add(80); for (long i : longArray.getArray()) System.out.print(i + " "); System.out.println(); longArray.add(15); longArray.add(21); for (long i : longArray.getArray()) System.out.print(i + " "); System.out.println(); longArray.add(6); longArray.add(6); longArray.add(6); longArray.add(6); longArray.add(7); longArray.add(9); longArray.add(1); longArray.add(2); longArray.add(3); longArray.add(2); longArray.add(5); longArray.add(3); longArray.add(4); for (long i : longArray.getArray()) System.out.print(i + " "); System.out.println(); longArray.add(15); longArray.add(6); longArray.add(6); longArray.add(6); longArray.add(6); longArray.add(7); longArray.add(9); for (long i : longArray.getArray()) System.out.print(i + " "); System.out.println(); longArray.add(6); longArray.add(6); longArray.add(6); longArray.add(6); longArray.add(7); longArray.add(9); longArray.add(7); longArray.add(6); longArray.add(11); for (long i : longArray.getArray()) System.out.print(i + " "); System.out.println(); } }