Annotation of embedaddon/php/ext/spl/internal/iteratoriterator.inc, revision 1.1

1.1     ! misho       1: <?php
        !             2: 
        !             3: /** @file iteratoriterator.inc
        !             4:  * @ingroup SPL
        !             5:  * @brief class IteratorIterator
        !             6:  * @author  Marcus Boerger
        !             7:  * @date    2003 - 2009
        !             8:  *
        !             9:  * SPL - Standard PHP Library
        !            10:  */
        !            11: 
        !            12: /** @ingroup SPL
        !            13:  * @brief Basic Iterator wrapper
        !            14:  * @since PHP 5.1
        !            15:  *
        !            16:  * This iterator wrapper allows to convert anything that is traversable into 
        !            17:  * an Iterator. It is very important to understand that most classes that do 
        !            18:  * not implement Iterator have their reasone to. Most likely they do not allow
        !            19:  * the full Iterator feature set. If so you need to provide techniques to
        !            20:  * prevent missuse. If you do not you must expect exceptions or fatal erros.
        !            21:  *
        !            22:  * It is also possible to derive the class and implement IteratorAggregate by
        !            23:  * downcasting the instances returned in getIterator. See the following
        !            24:  * example (assuming BaseClass implements Traversable):
        !            25:  \code
        !            26:  class SomeClass extends BaseClass implements IteratorAggregate
        !            27:  {
        !            28:    function getIterator()
        !            29:    {
        !            30:      return new IteratorIterator($this, 'BaseClass');
        !            31:    }
        !            32:  }
        !            33:  \endcode
        !            34:  *
        !            35:  * As you can see in the example this approach requires that the class to 
        !            36:  * downcast to is actually a base class of the specified iterator to wrap.
        !            37:  * Omitting the downcast in the above example would result in an endless loop
        !            38:  * since IteratorIterator::__construct() would call SomeClass::getIterator().
        !            39:  */
        !            40: class IteratorIterator implements OuterIterator
        !            41: {
        !            42:        /** Construct an IteratorIterator from an Iterator or an IteratorAggregate.
        !            43:         *
        !            44:         * @param iterator  inner iterator
        !            45:         * @param classname optional class the iterator has to be downcasted to
        !            46:         */
        !            47:        function __construct(Traversable $iterator, $classname = null)
        !            48:        {
        !            49:                if ($iterator instanceof IteratorAggregate)
        !            50:                {
        !            51:                    $iterator = $iterator->getIterator();
        !            52:                }
        !            53:                if ($iterator instanceof Iterator)
        !            54:                {
        !            55:                        $this->iterator = $iterator;
        !            56:                }
        !            57:                else
        !            58:                {
        !            59:                        throw new Exception("Classes that only implement Traversable can be wrapped only after converting class IteratorIterator into c code");
        !            60:                }
        !            61:        }
        !            62: 
        !            63:        /** \return the inner iterator as passed to the constructor
        !            64:         */
        !            65:        function getInnerIterator()
        !            66:        {
        !            67:                return $this->iterator;
        !            68:        }
        !            69: 
        !            70:        /** \return whether the iterator is valid
        !            71:         */
        !            72:        function valid()
        !            73:        {
        !            74:                return $this->iterator->valid();
        !            75:        }
        !            76: 
        !            77:        /** \return current key
        !            78:         */
        !            79:        function key()
        !            80:        {
        !            81:                return $this->iterator->key();
        !            82:        }
        !            83: 
        !            84:        /** \return current value
        !            85:         */
        !            86:        function current()
        !            87:        {
        !            88:                return $this->iterator->current();
        !            89:        }
        !            90: 
        !            91:        /** forward to next element
        !            92:         */
        !            93:        function next()
        !            94:        {
        !            95:                return $this->iterator->next();
        !            96:        }
        !            97: 
        !            98:        /** rewind to the first element
        !            99:         */
        !           100:        function rewind()
        !           101:        {
        !           102:                return $this->iterator->rewind();
        !           103:        }
        !           104: 
        !           105:        /** Aggregate the inner iterator
        !           106:         *
        !           107:         * @param func    Name of method to invoke
        !           108:         * @param params  Array of parameters to pass to method
        !           109:         */
        !           110:        function __call($func, $params)
        !           111:        {
        !           112:                return call_user_func_array(array($this->iterator, $func), $params);
        !           113:        }
        !           114: 
        !           115:        /** The inner iterator must be private because when this class will be
        !           116:         * converted to c code it won't no longer be available.
        !           117:         */
        !           118:        private $iterator;
        !           119: }
        !           120: 
        !           121: ?>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>