package com.bergerkiller.bukkit.common.bases.mutable;
import com.bergerkiller.bukkit.common.utils.MathUtil;
public abstract class DoubleAbstract {
/**
* Gets the value
*
* @return value
*/
public abstract double get();
/**
* Sets the value
*
* @param value to set to
* @return this instance
*/
public abstract DoubleAbstract set(double value);
public double squared() {
final double value = get();
return value * value;
}
public double abs() {
return Math.abs(get());
}
/**
* Gets the block coordinate of this value (floor)
*
* @return Block coordinate
*/
public int block() {
return getFloor();
}
/**
* Sets the value to 0.0
*
* @return this instance
*/
public DoubleAbstract setZero() {
return set(0.0);
}
public int getFloor() {
return MathUtil.floor(get());
}
public int chunk() {
return MathUtil.toChunk(get());
}
public DoubleAbstract clamp(double limit) {
return set(getClamped(limit));
}
public DoubleAbstract clamp(double min, double max) {
return set(getClamped(min, max));
}
public double getClamped(double limit) {
return MathUtil.clamp(get(), limit);
}
public double getClamped(double min, double max) {
return MathUtil.clamp(get(), min, max);
}
public DoubleAbstract add(double value) {
return set(get() + value);
}
public DoubleAbstract subtract(double value) {
return set(get() - value);
}
public DoubleAbstract multiply(double value) {
return set(get() * value);
}
public DoubleAbstract divide(double value) {
return set(get() / value);
}
public DoubleAbstract fixNaN() {
return set(MathUtil.fixNaN(get()));
}
public DoubleAbstract fixNaN(double def) {
return set(MathUtil.fixNaN(get(), def));
}
public boolean equals(double value) {
return get() == value;
}
@Override
public boolean equals(Object value) {
if (value instanceof Number) {
return equals(((Number) value).doubleValue());
} else if (value instanceof DoubleAbstract) {
return equals(((DoubleAbstract) value).get());
} else {
return false;
}
}
@Override
public String toString() {
return Double.toString(get());
}
}