/* 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; /** * Identical at <code>ParamAVLIterator</code>, but with two trees. When the first is fully browsed, * the iterator moves to the second tree items. Used for <b>IN</b> and <b>OUT</b> edges tree. * <p> * Support <code>null</code> values for trees. * * @author Mathieu Bastian * @param <Item> The type of Object in the tree */ public class BiParamAVLIterator<Item> implements Iterator<Item> { private ParamAVLTree tree2; private ParamAVLTree currentTree; private ParamAVLNode<Item> next; private Item current; public BiParamAVLIterator(ParamAVLTree tree1, ParamAVLTree tree2) { if (tree1 == null) { this.currentTree = tree2; } else { this.currentTree = tree1; this.tree2 = tree2; } if (currentTree != null) { next = currentTree.root; } goToDownLeft(); } private void goToDownLeft() { if (next != null) { while (next.left != null) { next = next.left; } } } public boolean hasNext() { if (next == null) { if (tree2 != null && currentTree != tree2) { currentTree = tree2; next = currentTree.root; if (next == null) { return false; } goToDownLeft(); } else { 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() { currentTree.remove(current); //TODO Optimize, remove in O(1) instead of O(ln(n)) } }