Annotation of embedaddon/php/ext/spl/internal/appenditerator.inc, revision 1.1.1.1
1.1 misho 1: <?php
2:
3: /** @file appenditerator.inc
4: * @ingroup SPL
5: * @brief class AppendIterator
6: * @author Marcus Boerger
7: * @date 2003 - 2009
8: *
9: * SPL - Standard PHP Library
10: */
11:
12: /** @ingroup SPL
13: * @brief Iterator that iterates over several iterators one after the other
14: * @author Marcus Boerger
15: * @version 1.0
16: * @since PHP 5.1
17: */
18: class AppendIterator implements OuterIterator
19: {
20: /** @internal array of inner iterators */
21: private $iterators;
22:
23: /** Construct an empty AppendIterator
24: */
25: function __construct()
26: {
27: $this->iterators = new ArrayIterator();
28: }
29:
30: /** Append an Iterator
31: * @param $it Iterator to append
32: *
33: * If the current state is invalid but the appended iterator is valid
34: * the AppendIterator itself becomes valid. However there will be no
35: * call to $it->rewind(). Also if the current state is invalid the inner
36: * ArrayIterator will be rewound und forwarded to the appended element.
37: */
38: function append(Iterator $it)
39: {
40: $this->iterators->append($it);
41: }
42:
43: /** @return the current inner Iterator
44: */
45: function getInnerIterator()
46: {
47: return $this->iterators->current();
48: }
49:
50: /** Rewind to the first element of the first inner Iterator.
51: * @return void
52: */
53: function rewind()
54: {
55: $this->iterators->rewind();
56: if ($this->iterators->valid())
57: {
58: $this->getInnerIterator()->rewind();
59: }
60: }
61:
62: /** @return whether the current element is valid
63: */
64: function valid()
65: {
66: return $this->iterators->valid() && $this->getInnerIterator()->valid();
67: }
68:
69: /** @return the current value if it is valid or \c NULL
70: */
71: function current()
72: {
73: /* Using $this->valid() would be exactly the same; it would omit
74: * the access to a non valid element in the inner iterator. Since
75: * the user didn't respect the valid() return value false this
76: * must be intended hence we go on. */
77: return $this->iterators->valid() ? $this->getInnerIterator()->current() : NULL;
78: }
79:
80: /** @return the current key if it is valid or \c NULL
81: */
82: function key()
83: {
84: return $this->iterators->valid() ? $this->getInnerIterator()->key() : NULL;
85: }
86:
87: /** Move to the next element. If this means to another Iterator that
88: * rewind that Iterator.
89: * @return void
90: */
91: function next()
92: {
93: if (!$this->iterators->valid())
94: {
95: return; /* done all */
96: }
97: $this->getInnerIterator()->next();
98: if ($this->getInnerIterator()->valid())
99: {
100: return; /* found valid element in current inner iterator */
101: }
102: $this->iterators->next();
103: while ($this->iterators->valid())
104: {
105: $this->getInnerIterator()->rewind();
106: if ($this->getInnerIterator()->valid())
107: {
108: return; /* found element as first elemet in another iterator */
109: }
110: $this->iterators->next();
111: }
112: }
113:
114: /** Aggregates the inner iterator
115: */
116: function __call($func, $params)
117: {
118: return call_user_func_array(array($this->getInnerIterator(), $func), $params);
119: }
120: }
121:
122: ?>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>