/*
* xtc - The eXTensible Compiler
* Copyright (C) 2004-2007 Robert Grimm
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
package xtc.parser;
import java.util.ArrayList;
import java.util.List;
import xtc.type.Type;
/**
* Element to set the semantic value to a list.
*
* @author Robert Grimm
* @version $Revision: 1.7 $
*/
public class ProperListValue extends ListValue {
/** The type of the proper list. */
public Type type;
/** The list of bindings for the elements. */
public List<Binding> elements;
/** The optional binding for the tail. */
public Binding tail;
/**
* Create a new singleton list value.
*
* @param type The type.
* @param element The binding for the single element.
*/
public ProperListValue(Type type, Binding element) {
this.type = type;
this.elements = new ArrayList<Binding>(1);
this.elements.add(element);
this.tail = null;
}
/**
* Create a new list value.
*
* @param type The type.
* @param element The binding for the single element.
* @param tail The binding for the tail.
*/
public ProperListValue(Type type, Binding element, Binding tail) {
this.type = type;
this.elements = new ArrayList<Binding>(1);
this.elements.add(element);
this.tail = tail;
}
/**
* Create a new proper list value.
*
* @param type The type.
* @param elements The elements.
* @param tail The tail.
*/
public ProperListValue(Type type, List<Binding> elements, Binding tail) {
this.type = type;
this.elements = elements;
this.tail = tail;
}
public Tag tag() {
return Tag.PROPER_LIST_VALUE;
}
public int hashCode() {
int hash = null == tail ? 0 : tail.hashCode();
hash = 13 * hash + elements.hashCode();
hash = 13 * hash + type.hashCode();
return hash;
}
public boolean equals(Object o) {
if (this == o) return true;
if (! (o instanceof ProperListValue)) return false;
ProperListValue other = (ProperListValue)o;
if (! type.equals(other.type)) return false;
if (! elements.equals(other.elements)) return false;
return null == tail ? null == other.tail : tail.equals(other.tail);
}
}