package mikera.vectorz.impl;
import mikera.vectorz.AScalar;
import mikera.vectorz.Scalar;
import mikera.vectorz.util.ErrorMessages;
/**
* Immutable scalar class
*
* Conceptually equivalent to a wrapped Double value, but supports all the Vectorz
* interfaces and functionality as a scalar object.
*
* @author Mike
*
*/
public final class ImmutableScalar extends AScalar {
private static final long serialVersionUID = 5798046998232751158L;
public static final ImmutableScalar ONE = new ImmutableScalar(1.0);
public static final ImmutableScalar ZERO = new ImmutableScalar(0.0);
private final double value;
private ImmutableScalar(double value) {
this.value=value;
}
public static ImmutableScalar create(double value) {
if (value==0.0) return ZERO;
if (value==1.0) return ONE;
return new ImmutableScalar(value);
}
public static ImmutableScalar create(AScalar a) {
return create(a.get());
}
@Override
public boolean isMutable() {
return false;
}
@Override
public boolean isFullyMutable() {
return false;
}
@Override
public boolean isView() {
return false;
}
@Override
public double get() {
return value;
}
@Override
public void getElements(double[] dest, int offset) {
dest[offset] = value;
}
@Override
public void set(double value) {
throw (new UnsupportedOperationException(ErrorMessages.immutable(this)));
}
@Override
public AScalar exactClone() {
return new ImmutableScalar(value);
}
@Override
public Scalar mutable() {
return Scalar.create(value);
}
@Override
public AScalar sparse() {
return this;
}
@Override
public ImmutableScalar immutable() {
return this;
}
}