DualIterator Class Reference
[Example classes]

Synchronous iteration over two iterators. More...

Inheritance diagram for DualIterator:

Inheritance graph
{RecursiveDualIterator\n|- $ref\l|+ __construct()\l+ areEqual()\l+ areIdentical()\l+ getChildren()\l+ hasChildren()\l}{Iterator\n||+ current()\l+ key()\l+ next()\l+ rewind()\l+ valid()\l}{Traversable\n||}
[legend]
Collaboration diagram for DualIterator:

Collaboration graph
{Iterator\n||+ current()\l+ key()\l+ next()\l+ rewind()\l+ valid()\l}{Traversable\n||}
[legend]
List of all members.

Public Member Functions

 __construct (Iterator $lhs, Iterator $rhs, $flags=0x33)
 areEqual ()
 areIdentical ()
 current ()
 getFlags ()
 getLHS ()
 getRHS ()
 key ()
 next ()
 rewind ()
 setFlags ($flags)
 valid ()

Static Public Member Functions

static compareIterators (Iterator $lhs, Iterator $rhs, $identical=false)

Public Attributes

const CURRENT_0 = 0x00
const CURRENT_ARRAY = 0x03
const CURRENT_LHS = 0x01
const CURRENT_RHS = 0x02
const DEFAULT_FLAGS = 0x33
const KEY_0 = 0x00
const KEY_ARRAY = 0x30
const KEY_LHS = 0x10
const KEY_RHS = 0x20

Private Attributes

 $flags
 $lhs
 $rhs

Detailed Description

Synchronous iteration over two iterators.

Author:
Marcus Boerger
Version:
1.3

Definition at line 17 of file dualiterator.inc.


Constructor & Destructor Documentation

DualIterator::__construct ( Iterator lhs,
Iterator rhs,
flags = 0x33 
)

construct iterator from two iterators

Parameters:
lhs Left Hand Side Iterator
rhs Right Hand Side Iterator
flags iteration flags

Definition at line 41 of file dualiterator.inc.

References $flags, $lhs, and $rhs.

00043     {
00044         $this->lhs   = $lhs;
00045         $this->rhs   = $rhs;
00046         $this->flags = $flags;
00047     }


Member Function Documentation

DualIterator::areEqual (  ) 

Returns:
whether both inner iterators are valid and have equal current and key values or both are non valid.

Reimplemented in RecursiveDualIterator.

Definition at line 150 of file dualiterator.inc.

References valid().

Referenced by compareIterators().

00151     {
00152         return $this->valid()
00153              ? $this->lhs->current() ==  $this->rhs->current()
00154             && $this->lhs->key()     ==  $this->rhs->key()
00155              : $this->lhs->valid()   ==  $this->rhs->valid();
00156     }

Here is the call graph for this function:

DualIterator::valid

DualIterator::areIdentical (  ) 

Returns:
whether both inner iterators are valid and have identical current and key values or both are non valid.

Reimplemented in RecursiveDualIterator.

Definition at line 139 of file dualiterator.inc.

References valid().

Referenced by compareIterators().

00140     {
00141         return $this->valid()
00142              ? $this->lhs->current() === $this->rhs->current()
00143             && $this->lhs->key()     === $this->rhs->key()
00144              : $this->lhs->valid()   ==  $this->rhs->valid();
00145     }

Here is the call graph for this function:

DualIterator::valid

static DualIterator::compareIterators ( Iterator lhs,
Iterator rhs,
identical = false 
) [static]

Compare two iterators.

Parameters:
lhs Left Hand Side Iterator
rhs Right Hand Side Iterator
identical whether to use areEqual() or areIdentical()
Returns:
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.

Definition at line 168 of file dualiterator.inc.

References $it, $lhs, $rhs, areEqual(), and areIdentical().

00170     {
00171         if ($lhs instanceof RecursiveIterator)
00172         {
00173             if ($rhs instanceof RecursiveIterator)
00174             {
00175                 $it = new RecursiveDualIterator($lhs, $rhs, 
00176                                 self::CURRENT_0 | self::KEY_0);
00177                 $it = new RecursiveCompareDualIterator($it);
00178             }
00179             else
00180             {
00181                 return false;
00182             }
00183         }
00184         else
00185         {
00186             $it = new DualIterator($lhs, $rhs, self::CURRENT_0 | self::KEY_0);
00187         }
00188 
00189         if ($identical)
00190         {
00191             foreach($it as $n)
00192             {
00193                 if (!$it->areIdentical())
00194                 {
00195                     return false;
00196                 }
00197             }
00198         }
00199         else
00200         {
00201             foreach($it as $n)
00202             {
00203                 if (!$it->areEqual())
00204                 {
00205                     return false;
00206                 }
00207             }
00208         }
00209         return $identical ? $it->areIdentical() : $it->areEqual();
00210     }

Here is the call graph for this function:

DualIterator::areEqualDualIterator::areIdenticalDualIterator::valid

DualIterator::current (  ) 

Returns:
current value depending on CURRENT_* flags

Implements Iterator.

Definition at line 94 of file dualiterator.inc.

00095     {
00096         switch($this->flags & 0x0F)
00097         {
00098         default:
00099         case self::CURRENT_ARRAY:
00100             return array($this->lhs->current(), $this->rhs->current());
00101         case self::CURRENT_LHS:
00102             return $this->lhs->current();
00103         case self::CURRENT_RHS:
00104             return $this->rhs->current();
00105         case self::CURRENT_0:
00106             return NULL;
00107         }
00108     }

DualIterator::getFlags (  ) 

Returns:
current flags

Definition at line 72 of file dualiterator.inc.

Referenced by RecursiveDualIterator::getChildren().

00073     {
00074         return $this->flags;
00075     }

DualIterator::getLHS (  ) 

Returns:
Left Hand Side Iterator

Definition at line 51 of file dualiterator.inc.

Referenced by RecursiveDualIterator::areEqual(), RecursiveDualIterator::areIdentical(), RecursiveDualIterator::getChildren(), and RecursiveDualIterator::hasChildren().

00052     {
00053         return $this->lhs;
00054     }

DualIterator::getRHS (  ) 

Returns:
Right Hand Side Iterator

Definition at line 58 of file dualiterator.inc.

Referenced by RecursiveDualIterator::areEqual(), RecursiveDualIterator::areIdentical(), RecursiveDualIterator::getChildren(), and RecursiveDualIterator::hasChildren().

00059     {
00060         return $this->rhs;
00061     }

DualIterator::key (  ) 

Returns:
current value depending on KEY_* flags

Implements Iterator.

Definition at line 112 of file dualiterator.inc.

00113     {
00114         switch($this->flags & 0xF0)
00115         {
00116         default:
00117         case self::CURRENT_ARRAY:
00118             return array($this->lhs->key(), $this->rhs->key());
00119         case self::CURRENT_LHS:
00120             return $this->lhs->key();
00121         case self::CURRENT_RHS:
00122             return $this->rhs->key();
00123         case self::CURRENT_0:
00124             return NULL;
00125         }
00126     }

DualIterator::next (  ) 

move both inner iterators forward

Implements Iterator.

Definition at line 130 of file dualiterator.inc.

00131     {
00132         $this->lhs->next();
00133         $this->rhs->next();
00134     }

DualIterator::rewind (  ) 

rewind both inner iterators

Implements Iterator.

Definition at line 79 of file dualiterator.inc.

00080     {
00081         $this->lhs->rewind();
00082         $this->rhs->rewind();   
00083     }

DualIterator::setFlags ( flags  ) 

Parameters:
flags new flags

Definition at line 65 of file dualiterator.inc.

References $flags.

00066     {
00067         $this->flags = $flags;
00068     }

DualIterator::valid (  ) 

Returns:
whether both inner iterators are valid

Implements Iterator.

Definition at line 87 of file dualiterator.inc.

Referenced by areEqual(), and areIdentical().

00088     {
00089         return $this->lhs->valid() && $this->rhs->valid();  
00090     }


Member Data Documentation

DualIterator::$flags [private]

Definition at line 33 of file dualiterator.inc.

Referenced by RecursiveDualIterator::__construct(), __construct(), and setFlags().

DualIterator::$lhs [private]

Definition at line 31 of file dualiterator.inc.

Referenced by RecursiveDualIterator::__construct(), __construct(), and compareIterators().

DualIterator::$rhs [private]

Definition at line 32 of file dualiterator.inc.

Referenced by RecursiveDualIterator::__construct(), __construct(), and compareIterators().

const DualIterator::CURRENT_0 = 0x00

Definition at line 22 of file dualiterator.inc.

const DualIterator::CURRENT_ARRAY = 0x03

Definition at line 21 of file dualiterator.inc.

const DualIterator::CURRENT_LHS = 0x01

Definition at line 19 of file dualiterator.inc.

const DualIterator::CURRENT_RHS = 0x02

Definition at line 20 of file dualiterator.inc.

const DualIterator::DEFAULT_FLAGS = 0x33

Definition at line 29 of file dualiterator.inc.

const DualIterator::KEY_0 = 0x00

Definition at line 27 of file dualiterator.inc.

const DualIterator::KEY_ARRAY = 0x30

Definition at line 26 of file dualiterator.inc.

const DualIterator::KEY_LHS = 0x10

Definition at line 24 of file dualiterator.inc.

const DualIterator::KEY_RHS = 0x20

Definition at line 25 of file dualiterator.inc.


The documentation for this class was generated from the following file:
Generated on Thu Apr 26 01:05:43 2007 for SPL-StandardPHPLibrary by  doxygen 1.5.2