lhs = $lhs; $this->rhs = $rhs; $this->flags = $flags; } /** @return Left Hand Side Iterator */ function getLHS() { return $this->lhs; } /** @return Right Hand Side Iterator */ function getRHS() { return $this->rhs; } /** @param flags new flags */ function setFlags($flags) { $this->flags = $flags; } /** @return current flags */ function getFlags() { return $this->flags; } /** rewind both inner iterators */ function rewind() { $this->lhs->rewind(); $this->rhs->rewind(); } /** @return whether both inner iterators are valid */ function valid() { return $this->lhs->valid() && $this->rhs->valid(); } /** @return current value depending on CURRENT_* flags */ function current() { switch($this->flags & 0x0F) { default: case self::CURRENT_ARRAY: return array($this->lhs->current(), $this->rhs->current()); case self::CURRENT_LHS: return $this->lhs->current(); case self::CURRENT_RHS: return $this->rhs->current(); case self::CURRENT_0: return NULL; } } /** @return key value depending on KEY_* flags */ function key() { switch($this->flags & 0xF0) { default: case self::KEY_LHS: return $this->lhs->key(); case self::KEY_RHS: return $this->rhs->key(); case self::KEY_0: return NULL; } } /** move both inner iterators forward */ function next() { $this->lhs->next(); $this->rhs->next(); } /** @return whether both inner iterators are valid and have identical * current and key values or both are non valid. */ function areIdentical() { return $this->valid() ? $this->lhs->current() === $this->rhs->current() && $this->lhs->key() === $this->rhs->key() : $this->lhs->valid() == $this->rhs->valid(); } /** @return whether both inner iterators are valid and have equal current * and key values or both are non valid. */ function areEqual() { return $this->valid() ? $this->lhs->current() == $this->rhs->current() && $this->lhs->key() == $this->rhs->key() : $this->lhs->valid() == $this->rhs->valid(); } /** Compare two iterators * * @param lhs Left Hand Side Iterator * @param rhs Right Hand Side Iterator * @param identical whether to use areEqual() or areIdentical() * @return whether both iterators are equal/identical * * @note If one implements RecursiveIterator the other must do as well. * And if both do then a recursive comparison is being used. */ static function compareIterators(Iterator $lhs, Iterator $rhs, $identical = false) { if ($lhs instanceof RecursiveIterator) { if ($rhs instanceof RecursiveIterator) { $it = new RecursiveDualIterator($lhs, $rhs, self::CURRENT_0 | self::KEY_0); $it = new RecursiveCompareDualIterator($it); } else { return false; } } else { $it = new DualIterator($lhs, $rhs, self::CURRENT_0 | self::KEY_0); } if ($identical) { foreach($it as $n) { if (!$it->areIdentical()) { return false; } } } else { foreach($it as $n) { if (!$it->areEqual()) { return false; } } } return $identical ? $it->areIdentical() : $it->areEqual(); } } ?>