diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-03-14 05:42:27 +0000 |
---|---|---|
committer | <> | 2013-04-03 16:25:08 +0000 |
commit | c4dd7a1a684490673e25aaf4fabec5df138854c4 (patch) | |
tree | 4d57c44caae4480efff02b90b9be86f44bf25409 /ext/spl/internal/recursivecachingiterator.inc | |
download | php2-master.tar.gz |
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/spl/internal/recursivecachingiterator.inc')
-rw-r--r-- | ext/spl/internal/recursivecachingiterator.inc | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/ext/spl/internal/recursivecachingiterator.inc b/ext/spl/internal/recursivecachingiterator.inc new file mode 100644 index 0000000..0676d43 --- /dev/null +++ b/ext/spl/internal/recursivecachingiterator.inc @@ -0,0 +1,99 @@ +<?php + +/** @file recursivecachingiterator.inc + * @ingroup SPL + * @brief class RecursiveCachingIterator + * @author Marcus Boerger + * @date 2003 - 2009 + * + * SPL - Standard PHP Library + */ + +/** + * @brief Cached recursive iteration over another Iterator + * @author Marcus Boerger + * @version 1.2 + * @since PHP 5.1 + * + * @see CachingIterator + */ +class RecursiveCachingIterator extends CachingIterator implements RecursiveIterator +{ + private $hasChildren; + private $getChildren; + + /** Construct from another iterator + * + * @param it Iterator to cache + * @param flags Bitmask: + * - CALL_TOSTRING (whether to call __toString() for every element) + * - CATCH_GET_CHILD (whether to catch exceptions when trying to get childs) + */ + function __construct(RecursiveIterator $it, $flags = self::CALL_TOSTRING) + { + parent::__construct($it, $flags); + } + + /** Rewind Iterator + */ + function rewind(); + { + $this->hasChildren = false; + $this->getChildren = NULL; + parent::rewind(); + } + + /** Forward to next element if necessary then an Iterator for the Children + * will be created. + */ + function next() + { + if ($this->hasChildren = $this->it->hasChildren()) + { + try + { + $child = $this->it->getChildren(); + if (!$this->ref) + { + $this->ref = new ReflectionClass($this); + } + $this->getChildren = $ref->newInstance($child, $this->flags); + } + catch(Exception $e) + { + if (!$this->flags & self::CATCH_GET_CHILD) + { + throw $e; + } + $this->hasChildren = false; + $this->getChildren = NULL; + } + } else + { + $this->getChildren = NULL; + } + parent::next(); + } + + private $ref; + + /** @return whether the current element has children + * @note The check whether the Iterator for the children can be created was + * already executed. Hence when flag CATCH_GET_CHILD was given in + * constructor this fucntion returns false so that getChildren does + * not try to access those children. + */ + function hasChildren() + { + return $this->hasChildren; + } + + /** @return An Iterator for the children + */ + function getChildren() + { + return $this->getChildren; + } +} + +?>
\ No newline at end of file |