CommonArraySliceReference.java

package dev.civl.mc.model.common.expression.reference;

import dev.civl.mc.model.IF.expression.Expression;
import dev.civl.mc.model.IF.expression.reference.ArraySliceReference;
import dev.civl.mc.model.IF.expression.reference.MemoryUnitReference;

public class CommonArraySliceReference extends CommonReference implements
		ArraySliceReference {
	/**
	 * The kind of the array slice, which could be ELEMENT, WILDCARD, or RANGE.
	 */
	private ArraySliceKind arraySliceKind;

	/**
	 * The index expression of the array slice. This could be an integer, a
	 * wild-card expression or a range expression, depending on
	 * {@link #arraySliceKind}.
	 */
	private Expression indexExpression;

	/**
	 * Creates a new instance of array slice reference.
	 * 
	 * @param sliceKind
	 * @param index
	 * @param child
	 */
	public CommonArraySliceReference(ArraySliceKind sliceKind,
			Expression index, MemoryUnitReference child) {
		super(child);
		this.arraySliceKind = sliceKind;
		this.indexExpression = index;
	}

	/**
	 * Creates a new instance of array slice reference.
	 * 
	 * @param sliceKind
	 * @param index
	 */
	public CommonArraySliceReference(ArraySliceKind sliceKind, Expression index) {
		super(null);
		this.arraySliceKind = sliceKind;
		this.indexExpression = index;
	}

	@Override
	public ArraySliceKind sliceKind() {
		return this.arraySliceKind;
	}

	@Override
	public MemoryUnitReferenceKind memoryUnitKind() {
		return MemoryUnitReferenceKind.ARRAY_SLICE;
	}

	@Override
	public Expression index() {
		return this.indexExpression;
	}

	@Override
	protected boolean equalsReference(MemoryUnitReference ref) {
		ArraySliceReference that = (ArraySliceReference) ref;

		if (this.indexExpression.equals(that.index()))
			return this.childEquals(that);
		return false;
	}

	@Override
	protected StringBuffer toStringBuffer() {
		StringBuffer result = new StringBuffer();

		result.append("[");
		result.append(indexExpression);
		result.append("]");
		if (child != null)
			result.append(child.toString());
		return result;
	}

}