summaryrefslogtreecommitdiff
path: root/ext/spl/internal/recursiveiteratoriterator.inc
diff options
context:
space:
mode:
Diffstat (limited to 'ext/spl/internal/recursiveiteratoriterator.inc')
-rwxr-xr-xext/spl/internal/recursiveiteratoriterator.inc101
1 files changed, 101 insertions, 0 deletions
diff --git a/ext/spl/internal/recursiveiteratoriterator.inc b/ext/spl/internal/recursiveiteratoriterator.inc
new file mode 100755
index 0000000000..05e31df464
--- /dev/null
+++ b/ext/spl/internal/recursiveiteratoriterator.inc
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @brief Iterates through recursive iterators
+ * @author Marcus Boerger
+ * @version 1.0
+ *
+ */
+class RecursiveIteratorIterator implements Iterator
+{
+ protected $ait = array();
+ protected $count = 0;
+
+ function __construct(RecursiveIterator $it)
+ {
+ $this->ait[0] = $it;
+ }
+
+
+ function rewind()
+ {
+ while ($this->count) {
+ unset($this->ait[$this->count--]);
+ }
+ $this->ait[0]->rewind();
+ $this->ait[0]->recursed = false;
+ }
+
+ function valid()
+ {
+ $count = $this->count;
+ while ($count) {
+ $it = $this->ait[$count];
+ if ($it->valid()) {
+ return true;
+ }
+ $count--;
+ }
+ return false;
+ }
+
+ function key()
+ {
+ $it = $this->ait[$this->count];
+ return $it->key();
+ }
+
+ function current()
+ {
+ $it = $this->ait[$this->count];
+ return $it->current();
+ }
+
+ function next()
+ {
+ while ($this->count) {
+ $it = $this->ait[$this->count];
+ if ($it->valid()) {
+ if (!$it->recursed && $it->hasChildren()) {
+ $it->recursed = true;
+ $sub = $it->getChildren();
+ $sub->recursed = false;
+ $sub->rewind();
+ if ($sub->valid()) {
+ $this->ait[++$this->count] = $sub;
+ if (!$sub instanceof RecursiveIterator) {
+ throw new Exception(get_class($sub).'::getChildren() must return an object that implements RecursiveIterator');
+ }
+ return;
+ }
+ unset($sub);
+ }
+ $it->next();
+ $it->recursed = false;
+ if ($it->valid()) {
+ return;
+ }
+ $it->recursed = false;
+ }
+ if ($this->count) {
+ unset($this->ait[$this->count--]);
+ $it = $this->ait[$this->count];
+ }
+ }
+ }
+
+ function getSubIterator($level = NULL)
+ {
+ if (is_null($level)) {
+ $level = $this->count;
+ }
+ return @$this->ait[$level];
+ }
+
+ function getDepth()
+ {
+ return $this->level;
+ }
+}
+
+?> \ No newline at end of file