package yacs.parser;

import yacs.domain.*;

import java.util.*;

/**
 * <p>Klasse zur Repräsentation einer Konstante innerhalb einer rekursiven
 * Struktur zur Repräsentation eines algebraischen Constraint-Problems
 * (Dokumentation siehe <code>Expression</code>).</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 Constant extends Expression {

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

  /** Die Belegung dieser Konstante. */
  private DomainElement element;

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

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

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

  /**
   * Konstruktor -- Instantiierung der Konstante mit ihrer Belegung.
   * @param element DomainElement
   */
  public Constant(DomainElement element) {
    this.element = element;
  }

  /**
   * Konstruktor -- Aus Gründen der Vereinfachung kann zur Instantiierung auch
   * ein <code>Integer</code>-Objekt angegeben werden. Das benötigte
   * <code>DomainElement</code> bzw. <code>NumericFDElement</code> wird
   * entsprechend erzeugt.
   * @param value Integer
   */
  public Constant(Integer value) {
    this(new NumericFDElement(value));
  }

  /**
   * Konstruktor -- Aus Gründen der Vereinfachung kann zur Instantiierung auch
   * lediglich ein <code>int</code>-Wert angegeben werden. Das benötigte
   * <code>DomainElement</code> bzw. <code>NumericFDElement</code> wird
   * entsprechend erzeugt.
   * @param value int
   */
  public Constant(int value) {
    this(new NumericFDElement(value));
  }

  /**
   * Konstruktor -- Aus Gründen der Vereinfachung können zur Instantiierung auch
   * zwei <code>Double</code>-Objekte als untere und obere Schranke eines
   * Intervalls angegeben werden. Das benötigte <code>DomainElement</code>
   * bzw. <code>IntervalDomainElement</code> wird entsprechend erzeugt.
   * @param lo double
   * @param hi double
   */
  public Constant(Double lo, Double hi) {
    this(new IntervalDomainElement(lo,hi));
  }

  /**
   * Konstruktor -- Aus Gründen der Vereinfachung können zur Instantiierung auch
   * lediglich zwei <code>double</code>-Werte als untere und obere Schranke
   * eines Intervalls angegeben werden. Das benötigte <code>DomainElement</code>
   * bzw. <code>IntervalDomainElement</code> wird entsprechend erzeugt.
   * @param lo double
   * @param hi double
   */
  public Constant(double lo, double hi) {
    this(new IntervalDomainElement(lo,hi));
  }

  public boolean setDomain(String variableName, Domain domain) {
    return false;
  }

  public Domain getDomain(String variableName) {
    return null;
  }

  public List getVariables() {
    return new LinkedList();
  }

  public List getUnsetVariables() {
    return this.getVariables();
  }

  public boolean unsetVariablesLeft() {
      return false;
  }

  public boolean set(String variableName, DomainElement element) {
    return false;
  }

  public DomainElement get(String variableName) {
    return null;
  }

  public boolean satisfiable() {
    return true;
  }

  public DomainElement evaluate() {
    return this.element;
  }

  public List getPrimitiveExpressions() {
    return new LinkedList();
  }

  public Variable getVariableReference(String variableName) {
    return null;
  }

  public boolean containsVariable(String variableName) {
    return false;
  }

  public boolean hasFalseDomain() {
    return false;
  }

  public boolean hasValuationDomain() {
    return true;
  }

  public boolean setValuationDomain() {
    return true;
  }

  public void singletons() {}

  public int count(String variableName) {
    return 0;
  }

  public void init() {}

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

}
