Annotation of embedaddon/php/ext/spl/internal/appenditerator.inc, revision 1.1
1.1 ! misho 1: <?php
! 2:
! 3: /** @file appenditerator.inc
! 4: * @ingroup SPL
! 5: * @brief class AppendIterator
! 6: * @author Marcus Boerger
! 7: * @date 2003 - 2009
! 8: *
! 9: * SPL - Standard PHP Library
! 10: */
! 11:
! 12: /** @ingroup SPL
! 13: * @brief Iterator that iterates over several iterators one after the other
! 14: * @author Marcus Boerger
! 15: * @version 1.0
! 16: * @since PHP 5.1
! 17: */
! 18: class AppendIterator implements OuterIterator
! 19: {
! 20: /** @internal array of inner iterators */
! 21: private $iterators;
! 22:
! 23: /** Construct an empty AppendIterator
! 24: */
! 25: function __construct()
! 26: {
! 27: $this->iterators = new ArrayIterator();
! 28: }
! 29:
! 30: /** Append an Iterator
! 31: * @param $it Iterator to append
! 32: *
! 33: * If the current state is invalid but the appended iterator is valid
! 34: * the AppendIterator itself becomes valid. However there will be no
! 35: * call to $it->rewind(). Also if the current state is invalid the inner
! 36: * ArrayIterator will be rewound und forwarded to the appended element.
! 37: */
! 38: function append(Iterator $it)
! 39: {
! 40: $this->iterators->append($it);
! 41: }
! 42:
! 43: /** @return the current inner Iterator
! 44: */
! 45: function getInnerIterator()
! 46: {
! 47: return $this->iterators->current();
! 48: }
! 49:
! 50: /** Rewind to the first element of the first inner Iterator.
! 51: * @return void
! 52: */
! 53: function rewind()
! 54: {
! 55: $this->iterators->rewind();
! 56: if ($this->iterators->valid())
! 57: {
! 58: $this->getInnerIterator()->rewind();
! 59: }
! 60: }
! 61:
! 62: /** @return whether the current element is valid
! 63: */
! 64: function valid()
! 65: {
! 66: return $this->iterators->valid() && $this->getInnerIterator()->valid();
! 67: }
! 68:
! 69: /** @return the current value if it is valid or \c NULL
! 70: */
! 71: function current()
! 72: {
! 73: /* Using $this->valid() would be exactly the same; it would omit
! 74: * the access to a non valid element in the inner iterator. Since
! 75: * the user didn't respect the valid() return value false this
! 76: * must be intended hence we go on. */
! 77: return $this->iterators->valid() ? $this->getInnerIterator()->current() : NULL;
! 78: }
! 79:
! 80: /** @return the current key if it is valid or \c NULL
! 81: */
! 82: function key()
! 83: {
! 84: return $this->iterators->valid() ? $this->getInnerIterator()->key() : NULL;
! 85: }
! 86:
! 87: /** Move to the next element. If this means to another Iterator that
! 88: * rewind that Iterator.
! 89: * @return void
! 90: */
! 91: function next()
! 92: {
! 93: if (!$this->iterators->valid())
! 94: {
! 95: return; /* done all */
! 96: }
! 97: $this->getInnerIterator()->next();
! 98: if ($this->getInnerIterator()->valid())
! 99: {
! 100: return; /* found valid element in current inner iterator */
! 101: }
! 102: $this->iterators->next();
! 103: while ($this->iterators->valid())
! 104: {
! 105: $this->getInnerIterator()->rewind();
! 106: if ($this->getInnerIterator()->valid())
! 107: {
! 108: return; /* found element as first elemet in another iterator */
! 109: }
! 110: $this->iterators->next();
! 111: }
! 112: }
! 113:
! 114: /** Aggregates the inner iterator
! 115: */
! 116: function __call($func, $params)
! 117: {
! 118: return call_user_func_array(array($this->getInnerIterator(), $func), $params);
! 119: }
! 120: }
! 121:
! 122: ?>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>