Annotation of embedaddon/php/ext/spl/examples/dualiterator.inc, revision 1.1

1.1     ! misho       1: <?php
        !             2: 
        !             3: /** @file dualiterator.inc
        !             4:  * @ingroup Examples
        !             5:  * @brief class DualIterator
        !             6:  * @author  Marcus Boerger
        !             7:  * @date    2003 - 2006
        !             8:  *
        !             9:  * SPL - Standard PHP Library
        !            10:  */
        !            11: 
        !            12: /** @ingroup Examples
        !            13:  * @brief   Synchronous iteration over two iterators
        !            14:  * @author  Marcus Boerger
        !            15:  * @version 1.3
        !            16:  */
        !            17: class DualIterator implements Iterator
        !            18: {
        !            19:        const CURRENT_LHS   = 0x01;
        !            20:        const CURRENT_RHS   = 0x02;
        !            21:        const CURRENT_ARRAY = 0x03;
        !            22:        const CURRENT_0     = 0x00;
        !            23: 
        !            24:        const KEY_LHS   = 0x10;
        !            25:        const KEY_RHS   = 0x20;
        !            26:        const KEY_0     = 0x00;
        !            27:        
        !            28:        const DEFAULT_FLAGS = 0x13;
        !            29:        
        !            30:        private $lhs;
        !            31:        private $rhs;
        !            32:        private $flags;
        !            33: 
        !            34:        /** construct iterator from two iterators
        !            35:         *
        !            36:         * @param lhs   Left  Hand Side Iterator
        !            37:         * @param rhs   Right Hand Side Iterator
        !            38:         * @param flags iteration flags
        !            39:         */
        !            40:        function __construct(Iterator $lhs, Iterator $rhs, 
        !            41:                                        $flags = 0x13 /*DualIterator::DEFAULT_FLAGS*/)
        !            42:        {
        !            43:                $this->lhs   = $lhs;
        !            44:                $this->rhs   = $rhs;
        !            45:                $this->flags = $flags;
        !            46:        }
        !            47: 
        !            48:        /** @return Left Hand Side Iterator
        !            49:         */
        !            50:        function getLHS()
        !            51:        {
        !            52:                return $this->lhs;
        !            53:        }
        !            54: 
        !            55:        /** @return Right Hand Side Iterator
        !            56:         */
        !            57:        function getRHS()
        !            58:        {
        !            59:                return $this->rhs;
        !            60:        }
        !            61: 
        !            62:        /** @param flags new flags
        !            63:         */
        !            64:        function setFlags($flags)
        !            65:        {
        !            66:                $this->flags = $flags;
        !            67:        }
        !            68: 
        !            69:        /** @return current flags
        !            70:         */
        !            71:        function getFlags()
        !            72:        {
        !            73:                return $this->flags;
        !            74:        }
        !            75: 
        !            76:        /** rewind both inner iterators
        !            77:         */     
        !            78:        function rewind()
        !            79:        {
        !            80:                $this->lhs->rewind();
        !            81:                $this->rhs->rewind();   
        !            82:        }
        !            83: 
        !            84:        /** @return whether both inner iterators are valid
        !            85:         */     
        !            86:        function valid()
        !            87:        {
        !            88:                return $this->lhs->valid() && $this->rhs->valid();      
        !            89:        }
        !            90: 
        !            91:        /** @return current value depending on CURRENT_* flags
        !            92:         */     
        !            93:        function current()
        !            94:        {
        !            95:                switch($this->flags & 0x0F)
        !            96:                {
        !            97:                default:
        !            98:                case self::CURRENT_ARRAY:
        !            99:                        return array($this->lhs->current(), $this->rhs->current());
        !           100:                case self::CURRENT_LHS:
        !           101:                        return $this->lhs->current();
        !           102:                case self::CURRENT_RHS:
        !           103:                        return $this->rhs->current();
        !           104:                case self::CURRENT_0:
        !           105:                        return NULL;
        !           106:                }
        !           107:        }
        !           108: 
        !           109:        /** @return key value depending on KEY_* flags
        !           110:         */     
        !           111:        function key()
        !           112:        {
        !           113:                switch($this->flags & 0xF0)
        !           114:                {
        !           115:                default:
        !           116:                case self::KEY_LHS:
        !           117:                        return $this->lhs->key();
        !           118:                case self::KEY_RHS:
        !           119:                        return $this->rhs->key();
        !           120:                case self::KEY_0:
        !           121:                        return NULL;
        !           122:                }
        !           123:        }
        !           124: 
        !           125:        /** move both inner iterators forward
        !           126:         */     
        !           127:        function next()
        !           128:        {
        !           129:                $this->lhs->next();
        !           130:                $this->rhs->next();
        !           131:        }
        !           132: 
        !           133:        /** @return whether both inner iterators are valid and have identical 
        !           134:         * current and key values or both are non valid.
        !           135:         */
        !           136:        function areIdentical()
        !           137:        {
        !           138:                return $this->valid()
        !           139:                     ? $this->lhs->current() === $this->rhs->current()
        !           140:                        && $this->lhs->key()     === $this->rhs->key()
        !           141:                         : $this->lhs->valid()   ==  $this->rhs->valid();
        !           142:        }
        !           143: 
        !           144:        /** @return whether both inner iterators are valid and have equal current 
        !           145:         * and key values or both are non valid.
        !           146:         */
        !           147:        function areEqual()
        !           148:        {
        !           149:                return $this->valid()
        !           150:                     ? $this->lhs->current() ==  $this->rhs->current()
        !           151:                        && $this->lhs->key()     ==  $this->rhs->key()
        !           152:                         : $this->lhs->valid()   ==  $this->rhs->valid();
        !           153:        }
        !           154: 
        !           155:        /** Compare two iterators
        !           156:         *
        !           157:         * @param lhs   Left  Hand Side Iterator
        !           158:         * @param rhs   Right Hand Side Iterator
        !           159:         * @param identical whether to use areEqual() or areIdentical()
        !           160:         * @return whether both iterators are equal/identical
        !           161:         *
        !           162:         * @note If one implements RecursiveIterator the other must do as well.
        !           163:         *       And if both do then a recursive comparison is being used.
        !           164:         */
        !           165:        static function compareIterators(Iterator $lhs, Iterator $rhs, 
        !           166:                                         $identical = false)
        !           167:        {
        !           168:                if ($lhs instanceof RecursiveIterator)
        !           169:                {
        !           170:                        if ($rhs instanceof RecursiveIterator)
        !           171:                        {
        !           172:                                $it = new RecursiveDualIterator($lhs, $rhs, 
        !           173:                                                                self::CURRENT_0 | self::KEY_0);
        !           174:                                $it = new RecursiveCompareDualIterator($it);
        !           175:                        }
        !           176:                        else
        !           177:                        {
        !           178:                                return false;
        !           179:                        }
        !           180:                }
        !           181:                else
        !           182:                {
        !           183:                        $it = new DualIterator($lhs, $rhs, self::CURRENT_0 | self::KEY_0);
        !           184:                }
        !           185: 
        !           186:                if ($identical)
        !           187:                {
        !           188:                        foreach($it as $n)
        !           189:                        {
        !           190:                                if (!$it->areIdentical())
        !           191:                                {
        !           192:                                        return false;
        !           193:                                }
        !           194:                        }
        !           195:                }
        !           196:                else
        !           197:                {
        !           198:                        foreach($it as $n)
        !           199:                        {
        !           200:                                if (!$it->areEqual())
        !           201:                                {
        !           202:                                        return false;
        !           203:                                }
        !           204:                        }
        !           205:                }
        !           206:                return $identical ? $it->areIdentical() : $it->areEqual();
        !           207:        }
        !           208: }
        !           209: 
        !           210: ?>

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