/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.backend.java.lib.types;
import java.math.BigInteger;
import org.apfloat.Apint;
import org.apfloat.Aprational;
/**
* Implementation of an ABS rational
*
* @author Rudi Schlatte
*
* Based on ABSInteger by Jan Schäfer
*/
public class ABSRational extends ABSBuiltInDataType {
public static final ABSRational ZERO = new ABSRational(Aprational.ZERO);
public static final ABSRational ONE = new ABSRational(Aprational.ONE);
protected Aprational value;
private ABSRational(Aprational r) {
super("");
this.value = r;
}
protected ABSRational() {
super("");
}
public ABSRational add(ABSRational i) {
return fromBigInt(this.value.add(i.value));
}
public ABSRational subtract(ABSRational i) {
return fromBigInt(this.value.subtract(i.value));
}
public ABSRational multiply(ABSRational i) {
return fromBigInt(this.value.multiply(i.value));
}
public ABSRational divide(ABSRational i) {
return fromBigInt(this.value.divide(i.value));
}
public ABSRational mod(ABSRational i) {
return fromBigInt(this.value.mod(i.value));
}
public ABSRational negate() {
return fromBigInt(this.value.negate());
}
@Override
public ABSBool eq(ABSValue o) {
if (o == null) return ABSBool.FALSE;
if (!(o instanceof ABSRational)) return ABSBool.FALSE;
ABSRational oi = (ABSRational) o;
return ABSBool.fromBoolean(oi.value.compareTo(this.value) == 0);
}
public ABSBool gt(ABSValue o) {
if (o == null)
return ABSBool.FALSE;
if (!(o instanceof ABSRational)) return ABSBool.FALSE;
ABSRational oi = (ABSRational) o;
return ABSBool.fromBoolean(this.value.compareTo(oi.value) > 0);
}
public ABSBool lt(ABSValue o) {
if (o == null) return ABSBool.FALSE;
if (!(o instanceof ABSRational)) return ABSBool.FALSE;
ABSRational oi = (ABSRational) o;
return ABSBool.fromBoolean(this.value.compareTo(oi.value) < 0);
}
public ABSBool gtEq(ABSValue o) {
return this.eq(o).or(this.gt(o));
}
public ABSBool ltEq(ABSValue o) {
return this.eq(o).or(this.lt(o));
}
public static ABSRational fromBigInt(BigInteger i) {
return new ABSRational(new Apint(i));
}
public static ABSRational fromBigInt(Aprational i) {
return new ABSRational(i);
}
public static ABSRational fromString(String value) {
return new ABSRational(new Aprational(value));
}
public static ABSRational fromInt(int i) {
switch (i) {
case 0:
return ZERO;
case 1:
return ONE;
default:
return fromBigInt(new Apint(i));
}
}
public static ABSRational fromLong(long l) {
if (l == 0) return ZERO;
if (l == 1) return ONE;
return fromBigInt(new Apint(l));
}
public int toInt() {
return value.intValue();
}
@Override
public String toString() {
return value.toString();
}
public ABSInteger truncate() {
return ABSInteger.fromBigInt(value.truncate());
}
public ABSInteger numerator() {
return ABSInteger.fromBigInt(value.numerator());
}
public ABSInteger denominator() {
return ABSInteger.fromBigInt(value.denominator());
}
}