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

1.1     ! misho       1: <?php
        !             2: /** @file spldoublylinkedlist.inc
        !             3:  * @ingroup SPL
        !             4:  * @brief class SplDoublyLinkedList
        !             5:  * @author  Etienne Kneuss
        !             6:  * @date    2008 - 2009
        !             7:  *
        !             8:  * SPL - Standard PHP Library
        !             9:  */
        !            10: 
        !            11: /** @ingroup SPL
        !            12:  * @brief Doubly Linked List
        !            13:  * @since PHP 5.3
        !            14:  *
        !            15:  * The SplDoublyLinkedList class provides the main functionalities of a
        !            16:  * doubly linked list (DLL).
        !            17:  * @note The following userland implementation of Iterator is a bit different
        !            18:  *        from the internal one. Internally, iterators generated by nested 
        !            19:  *        foreachs are independent, while they share the same traverse pointer 
        !            20:  *        in userland.
        !            21:  */
        !            22: class SplDoublyLinkedList implements Iterator, ArrayAccess, Countable
        !            23: {
        !            24:        protected $_llist   = array();
        !            25:        protected $_it_mode = 0;
        !            26:        protected $_it_pos  = 0;
        !            27: 
        !            28:        /** Iterator mode
        !            29:         * @see setIteratorMode
        !            30:         */
        !            31:        const IT_MODE_LIFO     = 0x00000002;
        !            32: 
        !            33:        /** Iterator mode
        !            34:         * @see setIteratorMode
        !            35:         */
        !            36:        const IT_MODE_FIFO     = 0x00000000;
        !            37: 
        !            38:        /** Iterator mode
        !            39:         * @see setIteratorMode
        !            40:         */
        !            41:        const IT_MODE_KEEP     = 0x00000000;
        !            42: 
        !            43:        /** Iterator mode
        !            44:         * @see setIteratorMode
        !            45:         */
        !            46:        const IT_MODE_DELETE   = 0x00000001;
        !            47: 
        !            48:        /** @return the element popped from the end of the DLL.
        !            49:         * @throw RuntimeException If the datastructure is empty.
        !            50:         */
        !            51:        public function pop()
        !            52:        {
        !            53:                if (count($this->_llist) == 0) {
        !            54:                        throw new RuntimeException("Can't pop from an empty datastructure");
        !            55:                }
        !            56:                return array_pop($this->_llist);
        !            57:        }
        !            58: 
        !            59:        /** @return the element shifted from the beginning of the DLL.
        !            60:         * @throw RuntimeException If the datastructure is empty.
        !            61:         */
        !            62:        public function shift()
        !            63:        {
        !            64:                if (count($this->_llist) == 0) {
        !            65:                        throw new RuntimeException("Can't shift from an empty datastructure");
        !            66:                }
        !            67:                return array_shift($this->_llist);
        !            68:        }
        !            69: 
        !            70:        /** Pushes an element to the end of the DLL.
        !            71:         * @param $data variable to add to the DLL.
        !            72:         */
        !            73:        public function push($data)
        !            74:        {
        !            75:                array_push($this->_llist, $data);
        !            76:                return true;
        !            77:        }
        !            78: 
        !            79:        /** Adds an element to the beginning of the DLL.
        !            80:         * @param $data variable to add to the DLL.
        !            81:         */
        !            82:        public function unshift($data)
        !            83:        {
        !            84:                array_unshift($this->_llist, $data);
        !            85:                return true;
        !            86:        }
        !            87: 
        !            88:        /** @return the element at the beginning of the DLL.
        !            89:         */
        !            90:        public function top()
        !            91:        {
        !            92:                return end($this->_llist);
        !            93:        }
        !            94: 
        !            95:        /** @return the element at the end of the DLL.
        !            96:         */
        !            97:        public function bottom()
        !            98:        {
        !            99:                return reset($this->_llist);
        !           100:        }
        !           101: 
        !           102:        /** @return number elements in the DLL.
        !           103:         */
        !           104:        public function count()
        !           105:        {
        !           106:                return count($this->_llist);
        !           107:        }
        !           108: 
        !           109:        /** @return whether the DLL is empty.
        !           110:         */
        !           111:        public function isEmpty()
        !           112:        {
        !           113:                return ($this->count() == 0);
        !           114:        }
        !           115: 
        !           116:        /** Changes the iteration mode. There are two orthogonal sets of modes that 
        !           117:         * can be set:
        !           118:         * - The direction of the iteration (either one or the other)
        !           119:         *  - SplDoublyLnkedList::IT_MODE_LIFO (Stack style)
        !           120:         *  - SplDoublyLnkedList::IT_MODE_FIFO (Queue style)
        !           121:         *
        !           122:         * - The behavior of the iterator (either one or the other)
        !           123:         *  - SplDoublyLnkedList::IT_MODE_DELETE (Elements are deleted by the iterator)
        !           124:         *  - SplDoublyLnkedList::IT_MODE_KEEP   (Elements are traversed by the iterator)
        !           125:         *
        !           126:         * The default mode is 0 : SplDoublyLnkedList::IT_MODE_FIFO | SplDoublyLnkedList::IT_MODE_KEEP
        !           127:         *
        !           128:         * @param $mode new mode of iteration
        !           129:         */
        !           130:        public function setIteratorMode($mode)
        !           131:        {
        !           132:                $this->_it_mode = $mode;
        !           133:        }
        !           134: 
        !           135:        /** @return the current iteration mode
        !           136:         * @see setIteratorMode
        !           137:         */
        !           138:        public function getIteratorMode()
        !           139:        {
        !           140:                return $this->_it_mode;
        !           141:        }
        !           142: 
        !           143:        /** Rewind to top iterator as set in constructor
        !           144:         */
        !           145:        public function rewind()
        !           146:        {
        !           147:                if ($this->_it_mode & self::IT_MODE_LIFO) {
        !           148:                        $this->_it_pos = count($this->_llist)-1;
        !           149:                } else {
        !           150:                        $this->_it_pos = 0;
        !           151:                }
        !           152:        }
        !           153: 
        !           154:        /** @return whether iterator is valid
        !           155:         */
        !           156:        public function valid()
        !           157:        {
        !           158:                return array_key_exists($this->_it_pos, $this->_llist);
        !           159:        }
        !           160: 
        !           161:        /** @return current key
        !           162:         */
        !           163:        public function key()
        !           164:        {
        !           165:                return $this->_it_pos;
        !           166:        }
        !           167: 
        !           168:        /** @return current object
        !           169:         */
        !           170:        public function current()
        !           171:        {
        !           172:                return $this->_llist[$this->_it_pos];
        !           173:        }
        !           174: 
        !           175:        /** Forward to next element
        !           176:         */
        !           177:        public function next()
        !           178:        {
        !           179:                if ($this->_it_mode & self::IT_MODE_LIFO) {
        !           180:                        if ($this->_it_mode & self::IT_MODE_DELETE) {
        !           181:                                $this->pop();
        !           182:                        }
        !           183:                        $this->_it_pos--;
        !           184:                } else {
        !           185:                        if ($this->_it_mode & self::IT_MODE_DELETE) {
        !           186:                                $this->shift();
        !           187:                        } else {
        !           188:                                $this->_it_pos++;
        !           189:                        }
        !           190:                }
        !           191:        }
        !           192: 
        !           193:        /** @return whether a certain offset exists in the DLL
        !           194:         *
        !           195:         * @param $offset             The offset
        !           196:         * @throw OutOfRangeException If the offset is either invalid or out of
        !           197:         *                            range.
        !           198:         */
        !           199:        public function offsetExists($offset)
        !           200:        {
        !           201:                if (!is_numeric($offset)) {
        !           202:                        throw new OutOfRangeException("Offset invalid or out of range");
        !           203:                } else {
        !           204:                        return array_key_exists($offset, $this->_llist);
        !           205:                }
        !           206:        }
        !           207: 
        !           208:        /** @return the data at a certain offset in the DLL
        !           209:         *
        !           210:         * @param $offset             The offset
        !           211:         * @throw OutOfRangeException If the offset is either invalid or out of
        !           212:         *                            range.
        !           213:         */
        !           214:        public function offsetGet($offset)
        !           215:        {
        !           216:                if ($this->_it_mode & self::IT_MODE_LIFO) {
        !           217:                        $realOffset = count($this->_llist)-$offset;
        !           218:                } else {
        !           219:                        $realOffset = $offset;
        !           220:                }
        !           221: 
        !           222:                if (!is_numeric($offset) || !array_key_exists($realOffset, $this->_llist)) {
        !           223:                        throw new OutOfRangeException("Offset invalid or out of range");
        !           224:                } else {
        !           225:                        return $this->_llist[$realOffset];
        !           226:                }
        !           227:        }
        !           228: 
        !           229:        /** Defines the data at a certain offset in the DLL
        !           230:         *
        !           231:         * @param $offset             The offset
        !           232:         * @param $value              New value
        !           233:         * @throw OutOfRangeException If the offset is either invalid or out of
        !           234:         *                            range.
        !           235:         */
        !           236:        public function offsetSet($offset, $value)
        !           237:        {
        !           238:                if ($offset === null) {
        !           239:                        return $this->push($value);
        !           240:                }
        !           241: 
        !           242:                if ($this->_it_mode & self::IT_MODE_LIFO) {
        !           243:                        $realOffset = count($this->_llist)-$offset;
        !           244:                } else {
        !           245:                        $realOffset = $offset;
        !           246:                }
        !           247: 
        !           248:                if (!is_numeric($offset) || !array_key_exists($realOffset, $this->_llist)) {
        !           249:                        throw new OutOfRangeException("Offset invalid or out of range");
        !           250:                } else {
        !           251:                        $this->_llist[$realOffset] = $value;
        !           252:                }
        !           253:        }
        !           254: 
        !           255:        /** Unsets the element at a certain offset in the DLL
        !           256:         *
        !           257:         * @param $offset             The offset
        !           258:         * @throw OutOfRangeException If the offset is either invalid or out of
        !           259:         *                            range.
        !           260:         */
        !           261:        public function offsetUnset($offset)
        !           262:        {
        !           263:                if ($this->_it_mode & self::IT_MODE_LIFO) {
        !           264:                        $realOffset = count($this->_llist)-$offset;
        !           265:                } else {
        !           266:                        $realOffset = $offset;
        !           267:                }
        !           268: 
        !           269:                if (!is_numeric($offset) || !array_key_exists($realOffset, $this->_llist)) {
        !           270:                        throw new OutOfRangeException("Offset invalid or out of range");
        !           271:                } else {
        !           272:                        array_splice($this->_llist, $realOffset, 1);
        !           273:                }
        !           274:        }
        !           275: }
        !           276: 
        !           277: ?>

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