IntervalDomainIterator.java
/* Copyright 2015 Laurent COCAULT
* Licensed to Laurent COCAULT under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership. Laurent COCAULT licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the
* License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.csp.constraint.model;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* Iterator on the values of an interval domain.
*/
class IntervalDomainIterator<T extends Value<T>> implements Iterator<T> {
/**
* Domain of values to iterate.
*/
private IntervalDomain<T> domain_;
/**
* Current value.
*/
private T value_;
/**
* Next value.
*/
private T next_;
/**
* Constructor of the iterator.
* @param domain
* Domain of values to iterate
*/
public IntervalDomainIterator(final IntervalDomain<T> domain) {
domain_ = domain;
value_ = null;
next_ = domain.getFirstValue();
}
/**
* {@inheritDoc}
*/
@Override
public boolean hasNext() {
return next_ != null;
}
/**
* {@inheritDoc}
*/
@Override
public T next() {
// Value is the next value
if (next_ == null) {
throw new NoSuchElementException();
}
value_ = next_;
// Compute the next one
boolean finished = false;
final Iterator<Interval<T>> index = domain_.getValues().iterator();
while (index.hasNext() && !finished) {
final Interval<T> interval = index.next();
if (interval.isInInterval(value_)) {
// Current value found : global iteration is over
finished = true;
if (interval.isInInterval(value_.nextValue())) {
// The next value is in the interval
next_ = value_.nextValue();
} else if (index.hasNext()) {
// Get the next internal minimum
next_ = index.next().getMinValue();
} else {
// No next value
next_ = null;
}
}
}
return value_;
}
/**
* {@inheritDoc}
*/
@Override
public void remove() {
if (value_ == null) {
// Next has not been called yet
throw new IllegalStateException();
} else {
// Remove the value
domain_.removeValue(value_);
}
}
}