Annotation of embedaddon/php/ext/spl/internal/limititerator.inc, revision 1.1.1.1

1.1       misho       1: <?php
                      2: 
                      3: /** @file limititerator.inc
                      4:  * @ingroup SPL
                      5:  * @brief class LimitIterator
                      6:  * @author  Marcus Boerger
                      7:  * @date    2003 - 2009
                      8:  *
                      9:  * SPL - Standard PHP Library
                     10:  */
                     11: 
                     12: /**
                     13:  * @brief   Limited Iteration over another Iterator
                     14:  * @author  Marcus Boerger
                     15:  * @version 1.1
                     16:  * @since PHP 5.0
                     17:  *
                     18:  * A class that starts iteration at a certain offset and only iterates over
                     19:  * a specified amount of elements.
                     20:  *
                     21:  * This class uses SeekableIterator::seek() if available and rewind() plus
                     22:  * a skip loop otehrwise.
                     23:  */
                     24: class LimitIterator implements OuterIterator
                     25: {
                     26:        private $it;
                     27:        private $offset;
                     28:        private $count;
                     29:        private $pos;
                     30: 
                     31:        /** Construct
                     32:         *
                     33:         * @param it     Iterator to limit
                     34:         * @param offset Offset to first element
                     35:         * @param count  Maximum number of elements to show or -1 for all
                     36:         */
                     37:        function __construct(Iterator $it, $offset = 0, $count = -1)
                     38:        {
                     39:                if ($offset < 0) {
                     40:                        throw new exception('Parameter offset must be > 0');
                     41:                }
                     42:                if ($count < 0 && $count != -1) {
                     43:                        throw new exception('Parameter count must either be -1 or a value greater than or equal to 0');
                     44:                }
                     45:                $this->it     = $it;
                     46:                $this->offset = $offset;
                     47:                $this->count  = $count;
                     48:                $this->pos    = 0;
                     49:        }
                     50:        
                     51:        /** Seek to specified position
                     52:         * @param position offset to seek to (relative to beginning not offset
                     53:         *                 specified in constructor).
                     54:         * @throw exception when position is invalid
                     55:         */
                     56:        function seek($position) {
                     57:                if ($position < $this->offset) {
                     58:                        throw new exception('Cannot seek to '.$position.' which is below offset '.$this->offset);
                     59:                }
                     60:                if ($position > $this->offset + $this->count && $this->count != -1) {
                     61:                        throw new exception('Cannot seek to '.$position.' which is behind offset '.$this->offset.' plus count '.$this->count);
                     62:                }
                     63:                if ($this->it instanceof SeekableIterator) {
                     64:                        $this->it->seek($position);
                     65:                        $this->pos = $position;
                     66:                } else {
                     67:                        while($this->pos < $position && $this->it->valid()) {
                     68:                                $this->next();
                     69:                        }
                     70:                }
                     71:        }
                     72: 
                     73:     /** Rewind to offset specified in constructor
                     74:      */
                     75:        function rewind()
                     76:        {
                     77:                $this->it->rewind();
                     78:                $this->pos = 0;
                     79:                $this->seek($this->offset);
                     80:        }
                     81:        
                     82:        /** @return whether iterator is valid
                     83:         */
                     84:        function valid() {
                     85:                return ($this->count == -1 || $this->pos < $this->offset + $this->count)
                     86:                         && $this->it->valid();
                     87:        }
                     88:        
                     89:        /** @return current key
                     90:         */
                     91:        function key() {
                     92:                return $this->it->key();
                     93:        }
                     94: 
                     95:        /** @return current element
                     96:         */
                     97:        function current() {
                     98:                return $this->it->current();
                     99:        }
                    100: 
                    101:        /** Forward to nect element
                    102:         */
                    103:        function next() {
                    104:                $this->it->next();
                    105:                $this->pos++;
                    106:        }
                    107: 
                    108:        /** @return current position relative to zero (not to offset specified in 
                    109:         *          constructor).
                    110:         */
                    111:        function getPosition() {
                    112:                return $this->pos;
                    113:        }
                    114: 
                    115:        /**
                    116:         * @return The inner iterator
                    117:         */     
                    118:        function getInnerIterator()
                    119:        {
                    120:                return $this->it;
                    121:        }
                    122: 
                    123:        /** Aggregate the inner iterator
                    124:         *
                    125:         * @param func    Name of method to invoke
                    126:         * @param params  Array of parameters to pass to method
                    127:         */
                    128:        function __call($func, $params)
                    129:        {
                    130:                return call_user_func_array(array($this->it, $func), $params);
                    131:        }
                    132: }
                    133: 
                    134: ?>

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