/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ package com.db4o.foundation; public class FlatteningIterator extends CompositeIterator4 { private static class IteratorStack { public final Iterator4 iterator; public final IteratorStack next; public IteratorStack(Iterator4 iterator_, IteratorStack next_) { iterator = iterator_; next = next_; } } private IteratorStack _stack; public FlatteningIterator(Iterator4 iterators) { super(iterators); } public boolean moveNext() { if (null == _currentIterator) { if (null == _stack) { _currentIterator = _iterators; } else { _currentIterator = pop(); } } if (!_currentIterator.moveNext()) { if (_currentIterator == _iterators) { return false; } _currentIterator = null; return moveNext(); } final Object current = _currentIterator.current(); if (current instanceof Iterator4) { push(_currentIterator); _currentIterator = nextIterator(current); return moveNext(); } return true; } private void push(Iterator4 currentIterator) { _stack = new IteratorStack(currentIterator, _stack); } private Iterator4 pop() { final Iterator4 iterator = _stack.iterator; _stack = _stack.next; return iterator; } }