package yacs.domain;

import java.util.*;

/**
 * <p>Klasse zur Repräsentation einer finiten Integer-Domäne.</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 NumericFDDomain extends Domain {

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

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

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

  /**
   * Fügt die übergebene Liste zu den Elementen der Domäne hinzu. Die Liste muss
   * <code>Integer</code>-Objekte enthalten.
   * @param domain List
   */
  private void addAll(List domain) {
    Iterator it = domain.iterator();
    while (it.hasNext()) {
      this.add(new NumericFDElement((Integer)it.next()));
    }
  }

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

  /**
   * Konstruktor -- Instantiiert eine Domäne mit numerischen FD-Elementen.
   */
  public NumericFDDomain() {
    super();
  }

  /**
   * Konstruktor -- Die Domäne wird mit einem Wert (hier: <code>Integer</code>)
   * instantiiert.
   * @param value Integer
   */
  public NumericFDDomain(Integer value) {
    this();
    this.add(new NumericFDElement(value));
  }

  /**
   * Konstruktor -- Die Domäne wird mit einem Wert (hier: <code>int</code>)
   * instantiiert.
   * @param value int
   */
  public NumericFDDomain(int value) {
    this(new Integer(value));
  }

  /**
   * Konstruktor -- Erlaubt die vereinfachte Instantiierung einer FD-Domäne
   * mit einem Wertebereich "von" (<code>startValue</code>) - "bis"
   * (<code>endValue</code>).
   */
  public NumericFDDomain(int startValue, int endValue) {
    super();
    this.add(startValue, endValue);
  }

  /**
   * Vereinfacht das Hinzufügen von Elementen zu Domäne, indem lediglich ein
   * <code>Integer</code>-Objekt übergeben werden muss. Liefert
   * <code>true</code> zurück, wenn dies erfolgreich war, <code>false</code>
   * wenn nicht (Wert bereits vorhanden).
   * @param value Integer
   * @return boolean
   */
  public boolean add(Integer value) {
    return this.add(new NumericFDElement(value));
  }

  /**
   * Vereinfacht das Hinzufügen von Elementen zu Domäne, indem lediglich ein
   * <code>int</code>-Wert übergeben werden muss. Liefert <code>true</code>
   * zurück, wenn dies erfolgreich war, <code>false</code> wenn nicht (Wert
   * bereits vorhanden).
   * @param value int
   * @return boolean
   */
  public boolean add(int value) {
    return this.add(new NumericFDElement(value));
  }

  /**
   * Der Domäne wird ein Bereich "von" (<code>startValue</code>) - "bis"
   * (<code>endValue</code>) hinzugefügt.
   * @param startValue int
   * @param endValue int
   */
  public void add(int startValue, int endValue) {
    for (int i = startValue; i <= endValue; i++) {
      this.add(new NumericFDElement(i));
    }
  }

  /**
   * Vereinfachte Abfragemöglichkeit, ob ein Element mit einem bestimmten
   * <code>int</code>-Wert in der Domäne enthalten ist.
   * @param value int
   * @return boolean
   */
  public boolean contains(int value) {
    //return this.containsValue(new Integer(value));
    return this.domain.containsValue(new Integer(value));
  }

}
