package yacs.domain;

/**
 * <p>Klasse zur Repräsentation von einzelnen Elementen für numerische finite
 * Domänen. Der Wert eines Elements wird durch eine Instanz der Klasse
 * <code>Integer</code> zum Ausdruck gebracht.</p>
 *
 * <p>Copyright (C) 2005  Wolfgang Runte
 * <br><br>
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * <br><br>
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * <br><br>
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
 * USA</p>
 *
 * @author Wolfgang Runte (woru@tzi.org)
 * @version YACS 0.1.1
 */
public class NumericFDElement extends DomainElement {

// ********** private attributs **********

  /** Der Wert dieses Elements. */
  private Integer value;

// ********** public attributs **********

// ********** private methods **********

// ********** public methods **********

  /**
   * Konstruktor -- Benötigt ein <code>Integer</code>-Objekt zur Instantiierung.
   * @param value Integer
   */
  public NumericFDElement(Integer value) {
    this.value = value;
  }

  /**
   * Konstruktor -- Aus Gründen der Vereinfachung kann zur Instantiierung auch
   * lediglich ein <code>int</code>-Wert angegeben werden.
   * @param value int
   */
  public NumericFDElement(int value) {
    this(new Integer(value));
  }

  public Object getValue() {
    return value;
  }

  public DomainElement plus(DomainElement param) {
    return new NumericFDElement(this.value.intValue() + ((Integer)param.getValue()).intValue());
  }

  public DomainElement minus(DomainElement param) {
    return new NumericFDElement(this.value.intValue() - ((Integer)param.getValue()).intValue());
  }

  public DomainElement times(DomainElement param) {
    return new NumericFDElement(this.value.intValue() * ((Integer)param.getValue()).intValue());
  }

  public DomainElement divide(DomainElement param) {
    return new NumericFDElement(this.value.intValue() / ((Integer)param.getValue()).intValue());
  }

  public DomainElement uminus() {
    return new NumericFDElement(0 - this.value.intValue());
  }

  public boolean equals(DomainElement param) {
    return this.value.intValue() == ((Integer)param.getValue()).intValue();
  }

  public boolean notEquals(DomainElement param) {
    return this.value.intValue() != ((Integer)param.getValue()).intValue();
  }

  public boolean greaterAs(DomainElement param) {
    return this.value.intValue() > ((Integer)param.getValue()).intValue();
  }

  public boolean lowerAs(DomainElement param) {
    return this.value.intValue() < ((Integer)param.getValue()).intValue();
  }

  public boolean greaterEqualAs(DomainElement param) {
    return this.value.intValue() >= ((Integer)param.getValue()).intValue();
  }

  public boolean lowerEqualAs(DomainElement param) {
    return this.value.intValue() <= ((Integer)param.getValue()).intValue();
  }

  public String toString() {
    return this.value.toString();
  }

}
