{NULL, NULL, NULL}
};
+static INLINE int spl_limit_it_has_more(spl_dual_it_object *intern TSRMLS_DC)
+{
+ /* FAILURE / SUCCESS */
+ if (intern->u.limit.count != -1 && intern->current.pos >= intern->u.limit.offset + intern->u.limit.count) {
+ return FAILURE;
+ } else {
+ return spl_dual_it_has_more(intern TSRMLS_CC);
+ }
+}
+
static INLINE void spl_limit_it_seek(spl_dual_it_object *intern, long pos TSRMLS_DC)
{
zval *zpos;
zval_ptr_dtor(&zpos);
spl_dual_it_free(intern TSRMLS_CC);
zend_user_it_free_current(intern->inner.iterator TSRMLS_CC);
- spl_dual_it_fetch(intern, 1 TSRMLS_CC);
intern->current.pos = pos;
+ if (spl_limit_it_has_more(intern TSRMLS_CC) == SUCCESS) {
+ spl_dual_it_fetch(intern, 0 TSRMLS_CC);
+ }
} else {
/* emulate the forward seek, by next() calls */
/* a back ward seek is done by a previous rewind() */
intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+/* RETURN_BOOL(spl_limit_it_has_more(intern TSRMLS_CC) == SUCCESS);*/
RETURN_BOOL((intern->u.limit.count == -1 || intern->current.pos < intern->u.limit.offset + intern->u.limit.count) && intern->current.data);
}
+SPL_METHOD(LimitIterator, next)
+{
+ spl_dual_it_object *intern;
+
+ intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ spl_dual_it_next(intern, 1 TSRMLS_CC);
+ if (intern->u.limit.count == -1 || intern->current.pos < intern->u.limit.offset + intern->u.limit.count) {
+ spl_dual_it_fetch(intern, 1 TSRMLS_CC);
+ }
+}
+
SPL_METHOD(LimitIterator, seek)
{
spl_dual_it_object *intern;
SPL_ME(LimitIterator, hasMore, NULL, ZEND_ACC_PUBLIC)
SPL_ME(dual_it, key, NULL, ZEND_ACC_PUBLIC)
SPL_ME(dual_it, current, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(dual_it, next, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(LimitIterator, next, NULL, ZEND_ACC_PUBLIC)
SPL_ME(LimitIterator, seek, arginfo_limit_it_seek, ZEND_ACC_PUBLIC)
SPL_ME(LimitIterator, getPosition, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
public function hasMore()
{
- echo __METHOD__ . "\n";
- return $this->i < count($this->a);
+ $ret = $this->i < count($this->a);
+ echo __METHOD__ . '(' . ($ret ? 'true' : 'false') . ")\n";
+ return $ret;
}
public function key()
}
$a = array(1, 2, 3, 4, 5);
-foreach (new LimitIterator(new NumericArrayIterator($a)) as $v)
+foreach (new LimitIterator(new NumericArrayIterator($a), 1, 3) as $v)
{
print "$v\n";
}
echo "===SEEKABLE===\n";
$a = array(1, 2, 3, 4, 5);
-foreach(new LimitIterator(new SeekableNumericArrayIterator($a)) as $v)
+foreach(new LimitIterator(new SeekableNumericArrayIterator($a), 1, 3) as $v)
{
print "$v\n";
}
echo "===SEEKING===\n";
$a = array(1, 2, 3, 4, 5);
$l = new LimitIterator(new SeekableNumericArrayIterator($a));
-for($i = 0; $i < 5; $i++)
+for($i = 1; $i < 4; $i++)
{
$l->seek($i);
print $l->current() . "\n";
?>
===DONE===
+<?php exit(0); ?>
--EXPECT--
NumericArrayIterator::__construct
NumericArrayIterator::rewind
-NumericArrayIterator::hasMore
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-1
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::current
NumericArrayIterator::key
2
NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::current
NumericArrayIterator::key
3
NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::current
NumericArrayIterator::key
4
NumericArrayIterator::next
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-5
-NumericArrayIterator::next
-NumericArrayIterator::hasMore
===SEEKABLE===
NumericArrayIterator::__construct
NumericArrayIterator::rewind
-SeekableNumericArrayIterator::seek(0)
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-1
-NumericArrayIterator::next
-NumericArrayIterator::hasMore
+SeekableNumericArrayIterator::seek(1)
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::current
NumericArrayIterator::key
2
NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::current
NumericArrayIterator::key
3
NumericArrayIterator::next
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::current
NumericArrayIterator::key
4
NumericArrayIterator::next
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-5
-NumericArrayIterator::next
-NumericArrayIterator::hasMore
===SEEKING===
NumericArrayIterator::__construct
-SeekableNumericArrayIterator::seek(0)
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-1
SeekableNumericArrayIterator::seek(1)
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::current
NumericArrayIterator::key
2
SeekableNumericArrayIterator::seek(2)
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::current
NumericArrayIterator::key
3
SeekableNumericArrayIterator::seek(3)
-NumericArrayIterator::hasMore
+NumericArrayIterator::hasMore(true)
NumericArrayIterator::current
NumericArrayIterator::key
4
-SeekableNumericArrayIterator::seek(4)
-NumericArrayIterator::hasMore
-NumericArrayIterator::current
-NumericArrayIterator::key
-5
===DONE===