Annotation of embedaddon/php/ext/spl/internal/appenditerator.inc, revision 1.1.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>