ValueObjectIterator.java

package com.surrealdb;

import java.util.Iterator;
import java.util.NoSuchElementException;

class ValueObjectIterator<T> implements Iterator<T> {

	private final ValueClassConverter<T> converter;
	private final Iterator<Value> iterator;
	private boolean done;

	ValueObjectIterator(Class<T> clazz, Iterator<Value> iterator) {
		this.converter = new ValueClassConverter<>(clazz);
		this.iterator = iterator;
	}

	@Override
	final public boolean hasNext() {
		if (done) {
			return false;
		}
		if (iterator.hasNext()) {
			return true;
		}
		done = true;
		// Nobody else can reach a plain iterator, so free it now. A synchronized one
		// may still be in use by another thread and is left to the cleaner.
		if (iterator instanceof ValueIterator) {
			((ValueIterator) iterator).close();
		}
		return false;
	}

	@Override
	final public T next() {
		if (done) {
			throw new NoSuchElementException();
		}
		// Each element is converted to a T, then released.
		final Value value = iterator.next();
		try {
			return converter.convert(value);
		} finally {
			value.close();
		}
	}
}