/* * Copyright (C) 2017 Christian Schilling (schillic@informatik.uni-freiburg.de) * Copyright (C) 2017 University of Freiburg * * This file is part of the ULTIMATE Automata Library. * * The ULTIMATE Automata Library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The ULTIMATE Automata Library 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the ULTIMATE Automata Library. If not, see . * * Additional permission under GNU GPL version 3 section 7: * If you modify the ULTIMATE Automata Library, or any covered work, by linking * or combining it with Eclipse RCP (or a modified version of Eclipse RCP), * containing parts covered by the terms of the Eclipse Public License, the * licensors of the ULTIMATE Automata Library grant you additional permission * to convey the resulting work. */ package de.uni_freiburg.informatik.ultimate.automata.util; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.MapToCollectionIterator; import de.uni_freiburg.informatik.ultimate.util.datastructures.relation.Pair; /** * Map implementation of a set of pairs. *

* The {@link #iterator()} method creates the {@link Pair} objects on-demand and does not store them. Accordingly, two * iterations would result in different {@link Pair} objects. * * @author Christian Schilling (schillic@informatik.uni-freiburg.de) * @author Matthias Heizmann (heizmann@informatik.uni-freiburg.de) * @param * element type */ public class MapBackedSetOfPairs implements ISetOfPairs>> { private final Map> mMap; /** * @param map * Map. */ public MapBackedSetOfPairs(final Map> map) { mMap = map; } @Override public void addPair(final E lhs, final E rhs) { throw new UnsupportedOperationException("The pairs must be specified at construction time."); } @Override public boolean containsPair(final E lhs, final E rhs) { final Set rhsSet = mMap.get(lhs); if (rhsSet == null) { return false; } return rhsSet.contains(rhs); } @Override public Map> getRelation() { return mMap; } /** * Note: Two calls to this method result in different {@link Pair} objects. *

* {@inheritDoc} */ @Override public Iterator> iterator() { final Map> map = mMap; return new Iterator>() { private final MapToCollectionIterator> mIt = new MapToCollectionIterator<>(map); @Override public boolean hasNext() { return mIt.hasNext(); } @Override public Pair next() { final Entry next = mIt.next(); return new Pair<>(next.getKey(), next.getValue()); } }; } @Override public String toString() { return mMap.toString(); } }