package de.invesdwin.util.math.decimal.internal.impl;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import javax.annotation.concurrent.ThreadSafe;
import org.apache.commons.math3.dfp.Dfp;
import de.invesdwin.util.math.BigDecimals;
import de.invesdwin.util.math.decimal.ADecimal;
import de.invesdwin.util.math.decimal.Decimal;
@ThreadSafe
public class BigDecimalDecimalImpl extends ADecimalImpl<BigDecimalDecimalImpl, BigDecimal> {
public BigDecimalDecimalImpl(final BigDecimal value, final BigDecimal defaultRoundedValue) {
super(value, defaultRoundedValue);
}
@Override
public boolean isZero() {
return getDefaultRoundedValue().compareTo(BigDecimal.ZERO) == 0;
}
@Override
public boolean isPositive() {
return getDefaultRoundedValue().compareTo(BigDecimal.ZERO) >= 0;
}
@Override
public String internalToString() {
return getDefaultRoundedValue().toPlainString();
}
@Override
protected int internalCompareTo(final ADecimal<?> decimalOther) {
return getDefaultRoundedValue().compareTo(BigDecimalDecimalImplFactory.toBigDecimal(decimalOther.round()));
}
@Override
public int intValue() {
return getDefaultRoundedValue().intValue();
}
@Override
public long longValue() {
return getDefaultRoundedValue().longValue();
}
@Override
public float floatValue() {
return getDefaultRoundedValue().floatValue();
}
@Override
public double doubleValue() {
return getDefaultRoundedValue().doubleValue();
}
@Override
public double doubleValueRaw() {
return getValue().doubleValue();
}
@Override
public byte byteValue() {
return getDefaultRoundedValue().byteValue();
}
@Override
public short shortValue() {
return getDefaultRoundedValue().shortValue();
}
@Override
public BigDecimalDecimalImpl abs() {
return newValueCopy(getValue().abs());
}
@Override
public BigDecimalDecimalImpl scaleByPowerOfTen(final int n) {
return newValueCopy(getValue().scaleByPowerOfTen(n));
}
@Override
public BigDecimalDecimalImpl root(final Number n) {
final double doubleValue = getValue().doubleValue();
return newValueCopy(new DoubleDecimalImpl(doubleValue, doubleValue).root(n).bigDecimalValue());
}
@Override
public BigDecimalDecimalImpl root(final ADecimal<?> n) {
return null;
}
@Override
public BigDecimalDecimalImpl sqrt() {
final double doubleValue = getValue().doubleValue();
return newValueCopy(new DoubleDecimalImpl(doubleValue, doubleValue).sqrt().bigDecimalValue());
}
@Override
public BigDecimalDecimalImpl log() {
final double doubleValue = getValue().doubleValue();
return newValueCopy(new DoubleDecimalImpl(doubleValue, doubleValue).log().bigDecimalValue());
}
@Override
public BigDecimalDecimalImpl exp() {
final double doubleValue = getValue().doubleValue();
return newValueCopy(new DoubleDecimalImpl(doubleValue, doubleValue).exp().bigDecimalValue());
}
@Override
public BigDecimalDecimalImpl log10() {
final double doubleValue = getValue().doubleValue();
return newValueCopy(new DoubleDecimalImpl(doubleValue, doubleValue).log10().bigDecimalValue());
}
@Override
public BigDecimalDecimalImpl exp10() {
final double doubleValue = getValue().doubleValue();
return newValueCopy(new DoubleDecimalImpl(doubleValue, doubleValue).exp10().bigDecimalValue());
}
@Override
public BigDecimalDecimalImpl cos() {
final double doubleValue = getValue().doubleValue();
return newValueCopy(new DoubleDecimalImpl(doubleValue, doubleValue).cos().bigDecimalValue());
}
@Override
public BigDecimalDecimalImpl sin() {
final double doubleValue = getValue().doubleValue();
return newValueCopy(new DoubleDecimalImpl(doubleValue, doubleValue).sin().bigDecimalValue());
}
@Override
public BigDecimalDecimalImpl pow(final Number exponent) {
final double doubleValue = getValue().doubleValue();
return newValueCopy(new DoubleDecimalImpl(doubleValue, doubleValue).pow(exponent).bigDecimalValue());
}
@Override
public BigDecimalDecimalImpl pow(final ADecimal<?> exponent) {
return pow(exponent.doubleValueRaw());
}
@Override
public BigDecimalDecimalImpl subtract(final ADecimal<?> subtrahend) {
return newValueCopy(getValue().subtract(subtrahend.bigDecimalValue(), BigDecimals.DEFAULT_MATH_CONTEXT));
}
@Override
public BigDecimalDecimalImpl add(final ADecimal<?> augend) {
return newValueCopy(getValue().add(augend.bigDecimalValue(), BigDecimals.DEFAULT_MATH_CONTEXT));
}
@Override
public BigDecimalDecimalImpl multiply(final Number multiplicant) {
return newValueCopy(getValue().multiply(BigDecimalDecimalImplFactory.toBigDecimal(multiplicant),
BigDecimals.DEFAULT_MATH_CONTEXT)).round(Decimal.DEFAULT_ROUNDING_SCALE, Decimal.DEFAULT_ROUNDING_MODE);
}
@Override
public BigDecimalDecimalImpl multiply(final ADecimal<?> multiplicant) {
return newValueCopy(getValue().multiply(multiplicant.bigDecimalValue(), BigDecimals.DEFAULT_MATH_CONTEXT));
}
@Override
public BigDecimalDecimalImpl divide(final Number divisor) {
return newValueCopy(getValue().divide(BigDecimalDecimalImplFactory.toBigDecimal(divisor),
BigDecimals.DEFAULT_MATH_CONTEXT));
}
@Override
public BigDecimalDecimalImpl divide(final ADecimal<?> divisor) {
return newValueCopy(getValue().divide(divisor.bigDecimalValue(), BigDecimals.DEFAULT_MATH_CONTEXT));
}
@Override
public BigDecimalDecimalImpl remainder(final Number divisor) {
return newValueCopy(getValue().remainder(BigDecimalDecimalImplFactory.toBigDecimal(divisor),
BigDecimals.DEFAULT_MATH_CONTEXT));
}
@Override
public BigDecimalDecimalImpl remainder(final ADecimal<?> divisor) {
return newValueCopy(getValue().remainder(divisor.bigDecimalValue(), BigDecimals.DEFAULT_MATH_CONTEXT));
}
@Override
public BigDecimal bigDecimalValue() {
return getDefaultRoundedValue();
}
@Override
public BigInteger bigIntegerValue() {
return getDefaultRoundedValue().toBigInteger();
}
@Override
protected BigDecimal internalRound(final BigDecimal value, final int scale, final RoundingMode roundingMode) {
return value.setScale(scale, roundingMode);
}
@Override
public Dfp dfpValue() {
return DfpDecimalImplFactory.toDfp(getDefaultRoundedValue());
}
@Override
public Number numberValue() {
return getDefaultRoundedValue();
}
@Override
protected BigDecimal getZero() {
return BigDecimal.ZERO;
}
@Override
protected BigDecimalDecimalImpl newValueCopy(final BigDecimal value, final BigDecimal defaultRoundedValue) {
return new BigDecimalDecimalImpl(value, defaultRoundedValue);
}
@Override
protected BigDecimalDecimalImpl getGenericThis() {
return this;
}
}