You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.6 KiB
122 lines
3.6 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2013-
|
|
// Authors:
|
|
// * Ernst Moritz Hahn <emhahn@cs.ox.ac.uk> (University of Oxford)
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// This file is part of PRISM.
|
|
//
|
|
// PRISM is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 2 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// PRISM 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 for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with PRISM; if not, write to the Free Software Foundation,
|
|
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
//==============================================================================
|
|
|
|
package param;
|
|
|
|
import java.util.Iterator;
|
|
import java.util.NoSuchElementException;
|
|
|
|
/**
|
|
* Computes the intersections of two (or three) regions.
|
|
* @author Ernst Moritz Hahn <emhahn@cs.ox.ac.uk> (University of Oxford)
|
|
*/
|
|
final class RegionValuesIntersections implements Iterable<RegionIntersection> {
|
|
final private class RegionIntersectionOperator implements Iterator<RegionIntersection> {
|
|
private RegionValues regions1;
|
|
private RegionValues regions2;
|
|
private RegionValues regions3;
|
|
private int numRegions1;
|
|
private int regions1Index;
|
|
private boolean hasNext;
|
|
private Region region;
|
|
private StateValues stateValues1;
|
|
private StateValues stateValues2;
|
|
private StateValues stateValues3;
|
|
|
|
RegionIntersectionOperator(RegionValues regions1, RegionValues regions2, RegionValues regions3)
|
|
{
|
|
this.regions1 = regions1;
|
|
this.regions2 = regions2;
|
|
this.regions3 = regions3;
|
|
regions1Index = 0;
|
|
numRegions1 = regions1.getNumRegions();
|
|
region = null;
|
|
stateValues1 = null;
|
|
stateValues2 = null;
|
|
stateValues3 = null;
|
|
findNext();
|
|
}
|
|
|
|
private void findNext() {
|
|
boolean found = false;
|
|
while (regions1Index < numRegions1 && !found) {
|
|
region = regions1.getRegion(regions1Index);
|
|
stateValues1 = regions1.getResult(region);
|
|
stateValues2 = regions2.getResult(region);
|
|
stateValues3 = regions3 != null ? regions3.getResult(region) : null;
|
|
found = (stateValues2 != null
|
|
&& (regions3 == null || stateValues3 != null));
|
|
regions1Index++;
|
|
}
|
|
hasNext = found;
|
|
}
|
|
|
|
@Override
|
|
public boolean hasNext() {
|
|
return hasNext;
|
|
}
|
|
|
|
@Override
|
|
public RegionIntersection next() {
|
|
if (hasNext) {
|
|
RegionIntersection result = new RegionIntersection(region, stateValues1, stateValues2, stateValues3);
|
|
findNext();
|
|
return result;
|
|
} else {
|
|
throw new NoSuchElementException();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void remove() {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
}
|
|
|
|
private RegionValues regions1;
|
|
private RegionValues regions2;
|
|
private RegionValues regions3;
|
|
|
|
public RegionValuesIntersections(RegionValues regions1, RegionValues regions2) {
|
|
regions1.cosplit(regions2);
|
|
this.regions1 = regions1;
|
|
this.regions2 = regions2;
|
|
this.regions3 = null;
|
|
}
|
|
|
|
public RegionValuesIntersections(RegionValues regions1, RegionValues regions2, RegionValues regions3) {
|
|
regions1.cosplit(regions2, regions3);
|
|
this.regions1 = regions1;
|
|
this.regions2 = regions2;
|
|
this.regions3 = regions3;
|
|
}
|
|
|
|
@Override
|
|
public Iterator<RegionIntersection> iterator() {
|
|
return new RegionIntersectionOperator(regions1, regions2, regions3);
|
|
}
|
|
|
|
}
|