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;
	}
}

 

Ads help maintain this website.