/*
* Lattices.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.util;
import java.util.Collection;
import java.util.Iterator;
import org.jakstab.analysis.LatticeElement;
import org.jakstab.util.Logger;
/**
* @author Johannes Kinder
*/
public class Lattices {
@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(Lattices.class);
@SuppressWarnings("unchecked")
public static final <L extends LatticeElement> L joinAll(Collection<L> elementSet) {
Iterator<L> iter = elementSet.iterator();
L result = iter.next();
while (iter.hasNext()) {
result = (L)(result.join(iter.next()));
}
return result;
}
/**
* For a lattice element e and a collection C of lattice elements, returns an element r which
* is the join of e with a distinct member of C, and for which no join of e with a member of C is strictly
* less wrt. the lattice.
* Formally, returns r s.t. e \neq r \and (\exists x \in C. r = e \join x) \and (\not\exists x \in C. (e \join x) \lt r
* @param <L> The lattice type
* @param e The lattice element to find a supremum for
* @param elementSet The set of lattice elements to choose from
* @return A lattice element greater or equal to e
*/
@SuppressWarnings("unchecked")
public static final <L extends LatticeElement> L minimumJoin(L e, Collection<L> elementSet) {
Iterator<L> iter = elementSet.iterator();
L result = null;
while (iter.hasNext()) {
L newElement = (L)(e.join(iter.next()));
if (!newElement.equals(e) && (result == null || newElement.lessOrEqual(result)))
result = newElement;
}
assert (result != null); // Will fail if e is already larger than every other element in C
return result;
}
}