// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.osm; import java.util.AbstractCollection; import java.util.Collection; import java.util.Iterator; import org.openstreetmap.josm.tools.Predicate; class DatasetCollection extends AbstractCollection<OsmPrimitive> { private class FilterIterator implements Iterator<OsmPrimitive> { private final Iterator<OsmPrimitive> iterator; private OsmPrimitive current; public FilterIterator(Iterator<OsmPrimitive> iterator) { this.iterator = iterator; } private void findNext() { if (current == null) { while (iterator.hasNext()) { current = iterator.next(); if (predicate.evaluate(current)) return; } current = null; } } public boolean hasNext() { findNext(); return current != null; } public OsmPrimitive next() { findNext(); OsmPrimitive old = current; current = null; return old; } public void remove() { throw new UnsupportedOperationException(); } } private final Collection<OsmPrimitive> primitives; private final Predicate<OsmPrimitive> predicate; public DatasetCollection(Collection<OsmPrimitive> primitives, Predicate<OsmPrimitive> predicate) { this.primitives = primitives; this.predicate = predicate; } @Override public Iterator<OsmPrimitive> iterator() { return new FilterIterator(primitives.iterator()); } @Override public int size() { int size = 0; Iterator<OsmPrimitive> it = iterator(); while (it.hasNext()) { size++; it.next(); } return size; } @Override public boolean isEmpty() { return !iterator().hasNext(); } }