package ql.semantics.values;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
/**
* Created by bore on 16/02/15.
*/
public class DecValue extends Value<BigDecimal>
{
public DecValue(BigDecimal value)
{
super(value);
}
public Value add(Value v)
{
return v.addDecimal(this);
}
@Override
public Value addDecimal(DecValue value)
{
return new DecValue(value.getValue().add(this.getValue()));
}
@Override
public Value sub(Value v)
{
return v.subDecimal(this);
}
@Override
public Value subDecimal(DecValue v)
{
return new DecValue(v.getValue().subtract(this.getValue()));
}
@Override
public Value mul(Value v)
{
return v.mulDecimal(this);
}
@Override
public Value mulDecimal(DecValue v)
{
return new DecValue(v.getValue().multiply(this.getValue()));
}
@Override
public Value div(Value v)
{
return v.divDecimal(this);
}
@Override
public Value divDecimal(DecValue v)
{
return new DecValue(v.getValue().divide(this.getValue(), new MathContext(6, RoundingMode.FLOOR)));
}
@Override
public Value gt(Value v)
{
return v.gtDecimal(this);
}
@Override
public Value gtDecimal(DecValue v)
{
return new BoolValue(v.getValue().compareTo(this.getValue()) > 0);
}
@Override
public Value lt(Value v)
{
return v.ltDecimal(this);
}
@Override
public Value ltDecimal(DecValue v)
{
return new BoolValue(v.getValue().compareTo(this.getValue()) < 0);
}
@Override
public Value gtEqu(Value v)
{
return v.gtEquDecimal(this);
}
@Override
public Value gtEquDecimal(DecValue v)
{
return new BoolValue(v.getValue().compareTo(this.getValue()) >= 0);
}
@Override
public Value ltEqu(Value v)
{
return v.ltEquDecimal(this);
}
@Override
public Value ltEquDecimal(DecValue v)
{
return new BoolValue(v.getValue().compareTo(this.getValue()) <= 0);
}
@Override
public Value equ(Value v)
{
return v.equDecimal(this);
}
@Override
public Value equDecimal(DecValue v)
{
return new BoolValue(v.getValue().compareTo(this.getValue()) == 0);
}
@Override
public Value notEqu(Value v)
{
return v.notEquDecimal(this);
}
@Override
public Value notEquDecimal(DecValue v)
{
return new BoolValue(v.getValue().compareTo(this.getValue()) != 0);
}
@Override
public Value neg()
{
return this.negDecimal();
}
@Override
public Value negDecimal()
{
return new DecValue(this.getValue().negate());
}
@Override
public Value pos()
{
return this.posDecimal();
}
@Override
public Value posDecimal()
{
return new DecValue(this.getValue());
}
@Override
public Value promoteInt(IntValue v)
{
return new DecValue(new BigDecimal(v.toString()));
}
public <T> T accept (ValueVisitor<T> visitor)
{
return visitor.visit(this);
}
}