package mikera.vectorz.impl; import java.io.ObjectStreamException; import mikera.arrayz.ISparse; import mikera.arrayz.impl.IDense; import mikera.vectorz.AVector; import mikera.vectorz.Vector; import mikera.vectorz.util.DoubleArrays; import mikera.vectorz.util.ErrorMessages; import mikera.vectorz.util.IntArrays; /** * Special singleton zero length vector class. * * Mainly for convenience when doing vector construction / appending etc. * * @author Mike */ public final class Vector0 extends APrimitiveVector implements IDense, ISparse { private static final long serialVersionUID = -8153360223054646075L; private Vector0() { } public static Vector0 of() { return INSTANCE; } public static Vector0 of(double... values) { if (values.length != 0) throw new IllegalArgumentException( "Vector0 cannot have components!"); return INSTANCE; } public static final Vector0 INSTANCE = new Vector0(); @Override public int length() { return 0; } @Override public double elementSum() { return 0.0; } @Override public double elementProduct() { return 1.0; } @Override public long nonZeroCount() { return 0; } @Override public int[] nonZeroIndices() { return IntArrays.EMPTY_INT_ARRAY; } @Override public double get(int i) { throw new IndexOutOfBoundsException( "Attempt to get on zero length vector!"); } @Override public void set(int i, double value) { throw new IndexOutOfBoundsException( "Attempt to set on zero length vector!"); } @Override public void addToArray(int offset, double[] array, int arrayOffset, int length) { // nothing to do } @Override public Vector0 clone() { return this; } @Override public boolean isMutable() { // i.e is immutable return false; } @Override public boolean isFullyMutable() { // i.e there are no immutable elements! return true; } @Override public int hashCode() { // 1 is hashcode for zero-length double array return 1; } @Override public boolean isZero() { return true; } @Override public boolean isRangeZero(int start, int length) { return true; } @Override public double magnitudeSquared() { return 0.0; } @Override public double magnitude() { return 0.0; } @Override public AVector join(AVector v) { return v; } @Override public Vector0 immutable() { return this; } @Override public Vector dense() { return Vector.EMPTY; } @Override public double[] toDoubleArray() { return DoubleArrays.EMPTY; } @Override public boolean equals(AVector v) { return v.length()==0; } @Override public boolean equalsArray(double[] data, int offset) { return true; } @Override public Vector0 subVector(int start, int length) { if ((start==0)&&(length==0)) return this; throw new IndexOutOfBoundsException(ErrorMessages.invalidRange(this, start, length)); } /** * readResolve method to ensure we always use the singleton */ private Object readResolve() throws ObjectStreamException { return INSTANCE; } @Override public Vector0 exactClone() { // immutable, so return self return this; } @Override public double dotProduct(double[] data, int offset) { return 0.0; } }