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