/*
 * DummyState.java - This file is part of the Jakstab project.
 * Copyright 2007-2015 Johannes Kinder <jk@jakstab.org>
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code 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
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, see <http://www.gnu.org/licenses/>.
 */
package org.jakstab.analysis.dummy;

import java.util.Collections;
import java.util.Set;

import org.jakstab.analysis.AbstractState;
import org.jakstab.analysis.LatticeElement;
import org.jakstab.cfa.Location;
import org.jakstab.rtl.expressions.RTLExpression;
import org.jakstab.rtl.expressions.RTLNumber;
import org.jakstab.util.Tuple;

public class DummyState implements AbstractState {
	
	DummyState() {
	}

	@Override
	public boolean lessOrEqual(LatticeElement l) {
		return equals(l);
	}

	@Override
	public boolean isTop() {
		return true;
	}

	@Override
	public boolean isBot() {
		return false;
	}

	@Override
	public Set<Tuple<RTLNumber>> projectionFromConcretization(
			RTLExpression... expressions) {
		
		Tuple<RTLNumber> cVector = new Tuple<RTLNumber>(expressions.length);
		for (int i=0; i<expressions.length; i++) {
			if (expressions[i] instanceof RTLNumber) {
				cVector.set(i, (RTLNumber)expressions[i]);
			} else {
				return null; 
			} 
		}
		return Collections.singleton(cVector);
		
		/*
		// This makes the dummy analysis resolve both branches of a conditional jump.

		Tuple<Set<RTLNumber>> cValues = new Tuple<Set<RTLNumber>>(expressions.length);
		for (int i=0; i<expressions.length; i++) {
			if (expressions[i] instanceof RTLNumber) {
				cValues.set(i, Collections.singleton((RTLNumber)expressions[i]));
			} else if (expressions[i].getBitWidth() == 1) {
				ExpressionFactory factory = ExpressionFactory.getInstance();
				Set<RTLNumber> tf = new FastSet<RTLNumber>();
				tf.add(factory.TRUE);
				tf.add(factory.FALSE);
				cValues.set(i, tf);
			} else {
				cValues.set(i, RTLNumber.ALL_NUMBERS);
			}
		}

		return Sets.crossProduct(cValues);
		*/
	}

	@Override
	public AbstractState join(LatticeElement l) {
		return this;
	}

	@Override
	public Location getLocation() {
		return null;
	}

	@Override
	public String getIdentifier() {
		return "DUMMY";
	}

}
