package org.yamcs.utils;
import java.util.Arrays;
/**
* expandable double array
*
*
* @author nm
*
*/
public class DoubleArray {
public static int DEFAULT_CAPACITY = 10;
private double[] a;
private int length;
//caches the hashCode
private int hash;
/**
* Creates a sorted int array with a default initial capacity
*/
public DoubleArray() {
a = new double[DEFAULT_CAPACITY];
}
/**
* Creates an IntArray with a given initial capacity
*
* @param capacity
*/
public DoubleArray(int capacity) {
a = new double[capacity];
}
/**
* Creates the IntArray by copying all values from the input array and sorting them
*
* @param array
*/
private DoubleArray(double... array) {
length = array.length;
a = array;
}
/**
* add value to the array
*
* @param x
*/
public void add(double x) {
ensureCapacity(length+1);
a[length] = x;
length++;
}
public void add(int pos, double x) {
if(pos>length) throw new IndexOutOfBoundsException("Index: "+pos+" length: "+length);
ensureCapacity(length+1);
System.arraycopy(a, pos, a, pos + 1, length - pos);
a[pos] = x;
length++;
}
/**
* get element at position
* @param pos
* @return
*/
public double get(int pos) {
rangeCheck(pos);
return a[pos];
}
private void ensureCapacity(int minCapacity) {
if(minCapacity<=a.length) return;
int capacity = a.length;
int newCapacity = capacity + (capacity >> 1);
if(newCapacity<minCapacity) newCapacity = minCapacity;
a = Arrays.copyOf(a, newCapacity);
}
public boolean isEmpty() {
return a.length==0;
}
public double[] toArray() {
return Arrays.copyOf(a, length);
}
public int size() {
return length;
}
public void set(int pos, double x) {
rangeCheck(pos);
a[pos] = x;
}
private void rangeCheck(int pos) {
if(pos >= length) throw new IndexOutOfBoundsException("Index: "+pos+" length: "+length);
}
public String toString() {
StringBuilder b = new StringBuilder();
int n = length-1;
b.append('[');
for (int i = 0;; i++) {
b.append(a[i]);
if(i==n)
return b.append(']').toString();
b.append(", ");
}
}
@Override
public int hashCode() {
int h = hash;
if (h == 0 && length > 0) {
h = 1;
for (int i = 0; i < length; i++) {
long bits = Double.doubleToLongBits(a[i]);
h = 31 * h + (int)(bits ^ (bits >>> 32));
}
hash = h;
}
return h;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
DoubleArray other = (DoubleArray) obj;
if (length != other.length) return false;
for(int i=0; i<length; i++) {
if(a[i]!=other.a[i]) return false;
}
return true;
}
public static DoubleArray wrap(double[] doubles) {
return new DoubleArray(doubles);
}
public double[] array() {
return a;
}
}