/** * 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 integer * * @author Jan Schäfer * */ public class ABSInteger extends ABSRational { public static final ABSInteger ZERO = new ABSInteger(Apint.ZERO); public static final ABSInteger ONE = new ABSInteger(Apint.ONE); private ABSInteger(Aprational i) { super(); this.value = i; } public ABSInteger add(ABSInteger i) { return fromBigInt(this.value.add(i.value)); } public ABSInteger subtract(ABSInteger i) { return fromBigInt(this.value.subtract(i.value)); } public ABSInteger multiply(ABSInteger i) { return fromBigInt(this.value.multiply(i.value)); } public ABSRational divide(ABSInteger i) { return ABSRational.fromBigInt(this.value).divide(i); } public ABSInteger mod(ABSInteger i) { return fromBigInt(this.value.mod(i.value)); } public ABSInteger negate() { return fromBigInt(this.value.negate()); } public static ABSInteger fromBigInt(BigInteger i) { return new ABSInteger(new Aprational(i)); } public static ABSInteger fromBigInt(Aprational i) { return new ABSInteger(i); } public static ABSInteger fromString(String value) { return fromBigInt(new Apint(value)); } public static ABSInteger fromInt(int i) { switch (i) { case 0: return ZERO; case 1: return ONE; default: return fromBigInt(new Apint(i)); } } public static ABSInteger 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 BigInteger getBigInteger() { return value.truncate().toBigInteger(); } @Override public ABSInteger truncate() { return this; } @Override public ABSInteger numerator() { return this; } @Override public ABSInteger denominator() { return ONE; } }