package org.yamcs.utils;
import java.util.Arrays;
/**
* float array
*
*
* @author nm
*
*/
public class FloatArray {
public static int DEFAULT_CAPACITY = 10;
private float[] a;
private int length;
//caches the hashCode
private int hash;
/**
* Creates a sorted int array with a default initial capacity
*
*/
public FloatArray() {
a = new float[DEFAULT_CAPACITY];
}
/**
* Creates an IntArray with a given initial capacity
*
* @param capacity
*/
public FloatArray(int capacity) {
a = new float[capacity];
}
/**
* Creates the IntArray by copying all values from the input array and sorting them
*
* @param array
*/
private FloatArray(float... array) {
length = array.length;
a = array;
}
/**
* add value to the array
*
* @param x - value to be added
*/
public void add(float x) {
ensureCapacity(length+1);
a[length] = x;
length++;
}
public void add(int pos, float 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 float 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 float[] toArray() {
return Arrays.copyOf(a, length);
}
public int size() {
return length;
}
public void set(int pos, float 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++) {
h = 31 * h + Float.floatToRawIntBits(a[i]);
}
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;
FloatArray other = (FloatArray) 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 FloatArray wrap(float[] floats) {
return new FloatArray(floats);
}
public float[] array() {
return a;
}
}