001/* 002 * Copyright 2006 - 2013 003 * Stefan Balev <stefan.balev@graphstream-project.org> 004 * Julien Baudry <julien.baudry@graphstream-project.org> 005 * Antoine Dutot <antoine.dutot@graphstream-project.org> 006 * Yoann Pigné <yoann.pigne@graphstream-project.org> 007 * Guilhelm Savin <guilhelm.savin@graphstream-project.org> 008 * 009 * This file is part of GraphStream <http://graphstream-project.org>. 010 * 011 * GraphStream is a library whose purpose is to handle static or dynamic 012 * graph, create them from scratch, file or any source and display them. 013 * 014 * This program is free software distributed under the terms of two licenses, the 015 * CeCILL-C license that fits European law, and the GNU Lesser General Public 016 * License. You can use, modify and/ or redistribute the software under the terms 017 * of the CeCILL-C license as circulated by CEA, CNRS and INRIA at the following 018 * URL <http://www.cecill.info> or under the terms of the GNU LGPL as published by 019 * the Free Software Foundation, either version 3 of the License, or (at your 020 * option) any later version. 021 * 022 * This program is distributed in the hope that it will be useful, but WITHOUT ANY 023 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 024 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 025 * 026 * You should have received a copy of the GNU Lesser General Public License 027 * along with this program. If not, see <http://www.gnu.org/licenses/>. 028 * 029 * The fact that you are presently reading this means that you have had 030 * knowledge of the CeCILL-C and LGPL licenses and that you accept their terms. 031 */ 032package org.graphstream.util; 033 034import java.util.Iterator; 035 036import org.graphstream.graph.Graph; 037import org.graphstream.graph.Node; 038 039public class FilteredNodeIterator<T extends Node> implements Iterator<T> { 040 041 protected Iterator<T> globalIterator; 042 protected Filter<Node> filter; 043 protected T next; 044 045 public FilteredNodeIterator(Graph g, Filter<Node> filter) { 046 this(g.<T>getNodeIterator(), filter); 047 } 048 049 public FilteredNodeIterator(Iterator<T> ite, Filter<Node> filter) { 050 this.globalIterator = ite; 051 this.filter = filter; 052 053 findNext(); 054 } 055 056 protected void findNext() { 057 next = null; 058 059 while (globalIterator.hasNext() && next == null) { 060 next = globalIterator.next(); 061 062 if (!filter.isAvailable(next)) 063 next = null; 064 } 065 } 066 067 /* 068 * (non-Javadoc) 069 * @see java.util.Iterator#hasNext() 070 */ 071 public boolean hasNext() { 072 return next != null; 073 } 074 075 /* 076 * (non-Javadoc) 077 * @see java.util.Iterator#next() 078 */ 079 public T next() { 080 T tmp = next; 081 findNext(); 082 083 return tmp; 084 } 085 086 /* 087 * (non-Javadoc) 088 * @see java.util.Iterator#remove() 089 */ 090 public void remove() { 091 } 092}