Annotation of embedaddon/php/ext/spl/internal/limititerator.inc, revision 1.1.1.1
1.1 misho 1: <?php
2:
3: /** @file limititerator.inc
4: * @ingroup SPL
5: * @brief class LimitIterator
6: * @author Marcus Boerger
7: * @date 2003 - 2009
8: *
9: * SPL - Standard PHP Library
10: */
11:
12: /**
13: * @brief Limited Iteration over another Iterator
14: * @author Marcus Boerger
15: * @version 1.1
16: * @since PHP 5.0
17: *
18: * A class that starts iteration at a certain offset and only iterates over
19: * a specified amount of elements.
20: *
21: * This class uses SeekableIterator::seek() if available and rewind() plus
22: * a skip loop otehrwise.
23: */
24: class LimitIterator implements OuterIterator
25: {
26: private $it;
27: private $offset;
28: private $count;
29: private $pos;
30:
31: /** Construct
32: *
33: * @param it Iterator to limit
34: * @param offset Offset to first element
35: * @param count Maximum number of elements to show or -1 for all
36: */
37: function __construct(Iterator $it, $offset = 0, $count = -1)
38: {
39: if ($offset < 0) {
40: throw new exception('Parameter offset must be > 0');
41: }
42: if ($count < 0 && $count != -1) {
43: throw new exception('Parameter count must either be -1 or a value greater than or equal to 0');
44: }
45: $this->it = $it;
46: $this->offset = $offset;
47: $this->count = $count;
48: $this->pos = 0;
49: }
50:
51: /** Seek to specified position
52: * @param position offset to seek to (relative to beginning not offset
53: * specified in constructor).
54: * @throw exception when position is invalid
55: */
56: function seek($position) {
57: if ($position < $this->offset) {
58: throw new exception('Cannot seek to '.$position.' which is below offset '.$this->offset);
59: }
60: if ($position > $this->offset + $this->count && $this->count != -1) {
61: throw new exception('Cannot seek to '.$position.' which is behind offset '.$this->offset.' plus count '.$this->count);
62: }
63: if ($this->it instanceof SeekableIterator) {
64: $this->it->seek($position);
65: $this->pos = $position;
66: } else {
67: while($this->pos < $position && $this->it->valid()) {
68: $this->next();
69: }
70: }
71: }
72:
73: /** Rewind to offset specified in constructor
74: */
75: function rewind()
76: {
77: $this->it->rewind();
78: $this->pos = 0;
79: $this->seek($this->offset);
80: }
81:
82: /** @return whether iterator is valid
83: */
84: function valid() {
85: return ($this->count == -1 || $this->pos < $this->offset + $this->count)
86: && $this->it->valid();
87: }
88:
89: /** @return current key
90: */
91: function key() {
92: return $this->it->key();
93: }
94:
95: /** @return current element
96: */
97: function current() {
98: return $this->it->current();
99: }
100:
101: /** Forward to nect element
102: */
103: function next() {
104: $this->it->next();
105: $this->pos++;
106: }
107:
108: /** @return current position relative to zero (not to offset specified in
109: * constructor).
110: */
111: function getPosition() {
112: return $this->pos;
113: }
114:
115: /**
116: * @return The inner iterator
117: */
118: function getInnerIterator()
119: {
120: return $this->it;
121: }
122:
123: /** Aggregate the inner iterator
124: *
125: * @param func Name of method to invoke
126: * @param params Array of parameters to pass to method
127: */
128: function __call($func, $params)
129: {
130: return call_user_func_array(array($this->it, $func), $params);
131: }
132: }
133:
134: ?>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>