/*
* LocationState.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.location;
import java.util.Set;
import org.jakstab.analysis.*;
import org.jakstab.cfa.Location;
import org.jakstab.rtl.expressions.RTLExpression;
import org.jakstab.rtl.expressions.RTLNumber;
import org.jakstab.util.Logger;
import org.jakstab.util.Tuple;
/**
* @author Johannes Kinder
*/
public class LocationState implements AbstractState, Comparable<LocationState> {
@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(LocationState.class);
public static final LocationState TOP = new LocationState();
public static final LocationState BOT = new LocationState();
private final Location location;
private LocationState() {
location = null;
}
public LocationState(Location location) {
assert location != null : "Cannot create control flow state with NULL location!";
this.location = location;
}
@Override
public String getIdentifier() {
return location.toString();
}
@Override
public Location getLocation() {
return location;
}
@Override
public LocationState join(LatticeElement l) {
LocationState c = (LocationState)l;
if (this.isBot()) return c;
if (c.isBot() || this.equals(c)) return this;
return TOP;
}
@Override
public boolean isBot() {
return this == BOT;
}
@Override
public boolean isTop() {
return this == TOP;
}
@Override
public boolean lessOrEqual(LatticeElement l) {
if (l.isTop() || this.equals(l)) return true;
return false;
}
@Override
public int hashCode() {
if (isTop()) return 38941;
if (isBot()) return 124767;
return location.hashCode() + 31;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
LocationState other = (LocationState) obj;
if (location == null) {
// location is only null for singletons TOP and BOT
assert isTop() || isBot();
return false;
}
return location.equals(other.location);
}
@Override
public String toString() {
return location.toString();
}
@Override
public Set<Tuple<RTLNumber>> projectionFromConcretization(
RTLExpression... expressions) {
return null;
}
@Override
public int compareTo(LocationState o) {
return location.compareTo(o.location);
}
}