/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.utils.collection.avl; import java.util.Iterator; import org.gephi.utils.collection.avl.ResetableIterator; /** * Iterator for the {@link ParamAVLTree}. Return items in an ascending order. * * @author Mathieu Bastian * @param <Item> The type of Object in the tree */ public class ParamAVLIterator<Item> implements Iterator<Item>, ResetableIterator { private ParamAVLTree tree; private ParamAVLNode<Item> next; private Item current; public ParamAVLIterator() { } public ParamAVLIterator(ParamAVLNode node) { this.next = node; goToDownLeft(); } public ParamAVLIterator(ParamAVLTree tree) { this(tree.root); this.tree = tree; } public void setNode(ParamAVLTree tree) { this.next = tree.root; this.tree = tree; goToDownLeft(); } private void goToDownLeft() { if (next != null) { while (next.left != null) { next = next.left; } } } public boolean hasNext() { if (next == null) { return false; } current = this.next.item; if (next.right == null) { while ((next.parent != null) && (next == next.parent.right)) { this.next = this.next.parent; } this.next = this.next.parent; } else { this.next = this.next.right; while (this.next.left != null) { this.next = this.next.left; } } return true; } public Item next() { return current; } public void remove() { tree.remove(current); //TODO Optimize, remove in O(1) instead of O(ln(n)) } }