helly Mon Nov 1 17:54:13 2004 EDT
Added files:
/php-src/ext/spl/tests iterator_014.phpt
Modified files:
/php-src/ext/spl spl_iterators.c
/php-src/ext/spl/internal recursiveiteratoriterator.inc
Log:
- Add RecursiveIteratorIterator::beginChildren(), endChildren()
http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.51&r2=1.52&ty=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.51 php-src/ext/spl/spl_iterators.c:1.52
--- php-src/ext/spl/spl_iterators.c:1.51 Mon Nov 1 15:57:23 2004
+++ php-src/ext/spl/spl_iterators.c Mon Nov 1 17:54:10 2004
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: spl_iterators.c,v 1.51 2004/11/01 20:57:23 helly Exp $ */
+/* $Id: spl_iterators.c,v 1.52 2004/11/01 22:54:10 helly Exp $ */
#ifdef HAVE_CONFIG_H
# include "config.h"
@@ -59,40 +59,6 @@
{NULL, NULL, NULL}
};
-SPL_METHOD(RecursiveIteratorIterator, __construct);
-SPL_METHOD(RecursiveIteratorIterator, rewind);
-SPL_METHOD(RecursiveIteratorIterator, valid);
-SPL_METHOD(RecursiveIteratorIterator, key);
-SPL_METHOD(RecursiveIteratorIterator, current);
-SPL_METHOD(RecursiveIteratorIterator, next);
-SPL_METHOD(RecursiveIteratorIterator, getDepth);
-SPL_METHOD(RecursiveIteratorIterator, getSubIterator);
-SPL_METHOD(RecursiveIteratorIterator, getInnerIterator);
-
-static
-ZEND_BEGIN_ARG_INFO(arginfo_recursive_it___construct, 0)
- ZEND_ARG_OBJ_INFO(0, iterator, RecursiveIterator, 0)
- ZEND_ARG_INFO(0, mode)
-ZEND_END_ARG_INFO();
-
-static
-ZEND_BEGIN_ARG_INFO(arginfo_recursive_it_getSubIterator, 0)
- ZEND_ARG_INFO(0, level)
-ZEND_END_ARG_INFO();
-
-static zend_function_entry spl_funcs_RecursiveIteratorIterator[] = {
- SPL_ME(RecursiveIteratorIterator, __construct,
arginfo_recursive_it___construct, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveIteratorIterator, rewind, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveIteratorIterator, valid, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveIteratorIterator, key, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveIteratorIterator, current, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveIteratorIterator, next, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveIteratorIterator, getDepth, NULL, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveIteratorIterator,
getSubIterator,arginfo_recursive_it_getSubIterator, ZEND_ACC_PUBLIC)
- SPL_ME(RecursiveIteratorIterator, getInnerIterator,NULL, ZEND_ACC_PUBLIC)
- {NULL, NULL, NULL}
-};
-
typedef enum {
RIT_LEAVES_ONLY = 0,
RIT_SELF_FIRST = 1,
@@ -190,7 +156,7 @@
}
}
-static void spl_recursive_it_move_forward_ex(spl_recursive_it_object *object
TSRMLS_DC)
+static void spl_recursive_it_move_forward_ex(spl_recursive_it_object *object, zval
*zthis TSRMLS_DC)
{
zend_object_iterator *iterator;
zval *zobject;
@@ -262,6 +228,7 @@
if (sub_iter->funcs->rewind) {
sub_iter->funcs->rewind(sub_iter TSRMLS_CC);
}
+ zend_call_method_with_0_params(&zthis, NULL, NULL,
"beginchildren", NULL);
goto next_step;
}
/* no more elements */
@@ -269,13 +236,14 @@
iterator->funcs->dtor(iterator TSRMLS_CC);
zval_ptr_dtor(&object->iterators[object->level].zobject);
object->level--;
+ zend_call_method_with_0_params(&zthis, NULL, NULL,
"endchildren", NULL);
} else {
return; /* done completeley */
}
}
}
-static void spl_recursive_it_rewind_ex(spl_recursive_it_object *object TSRMLS_DC)
+static void spl_recursive_it_rewind_ex(spl_recursive_it_object *object, zval *zthis
TSRMLS_DC)
{
zend_object_iterator *sub_iter;
@@ -283,6 +251,7 @@
sub_iter = object->iterators[object->level].iterator;
sub_iter->funcs->dtor(sub_iter TSRMLS_CC);
zval_ptr_dtor(&object->iterators[object->level--].zobject);
+ zend_call_method_with_0_params(&zthis, NULL, NULL, "endchildren",
NULL);
}
erealloc(object->iterators, sizeof(spl_sub_iterator));
object->iterators[0].state = RS_START;
@@ -290,17 +259,17 @@
if (sub_iter->funcs->rewind) {
sub_iter->funcs->rewind(sub_iter TSRMLS_CC);
}
- spl_recursive_it_move_forward_ex(object TSRMLS_CC);
+ spl_recursive_it_move_forward_ex(object, zthis TSRMLS_CC);
}
static void spl_recursive_it_move_forward(zend_object_iterator *iter TSRMLS_DC)
{
- spl_recursive_it_move_forward_ex((spl_recursive_it_object*)iter->data
TSRMLS_CC);
+ spl_recursive_it_move_forward_ex((spl_recursive_it_object*)iter->data,
((spl_recursive_it_iterator*)iter)->zobject TSRMLS_CC);
}
static void spl_recursive_it_rewind(zend_object_iterator *iter TSRMLS_DC)
{
- spl_recursive_it_rewind_ex((spl_recursive_it_object*)iter->data TSRMLS_CC);
+ spl_recursive_it_rewind_ex((spl_recursive_it_object*)iter->data,
((spl_recursive_it_iterator*)iter)->zobject TSRMLS_CC);
}
static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry *ce, zval
*zobject TSRMLS_DC)
@@ -361,7 +330,7 @@
{
spl_recursive_it_object *object =
(spl_recursive_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
- spl_recursive_it_rewind_ex(object TSRMLS_CC);
+ spl_recursive_it_rewind_ex(object, getThis() TSRMLS_CC);
} /* }}} */
/* {{{ proto bolean RecursiveIteratorIterator::valid()
@@ -412,7 +381,7 @@
{
spl_recursive_it_object *object =
(spl_recursive_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
- spl_recursive_it_move_forward_ex(object TSRMLS_CC);
+ spl_recursive_it_move_forward_ex(object, getThis() TSRMLS_CC);
} /* }}} */
/* {{{ proto int RecursiveIteratorIterator::getDepth()
@@ -450,6 +419,20 @@
RETURN_ZVAL(object->iterators[level].zobject, 1, 0);
} /* }}} */
+/* {{{ proto RecursiveIterator RecursiveIteratorIterator::beginChildren()
+ Called when recursing one level down */
+SPL_METHOD(RecursiveIteratorIterator, beginChildren)
+{
+ /* nothing to do */
+} /* }}} */
+
+/* {{{ proto RecursiveIterator RecursiveIteratorIterator::endChildren()
+ Called when end recursing one level */
+SPL_METHOD(RecursiveIteratorIterator, endChildren)
+{
+ /* nothing to do */
+} /* }}} */
+
static union _zend_function *spl_recursive_it_get_method(zval **object_ptr, char
*method, int method_len TSRMLS_DC)
{
union _zend_function *function_handler;
@@ -512,6 +495,32 @@
}
/* }}} */
+static
+ZEND_BEGIN_ARG_INFO(arginfo_recursive_it___construct, 0)
+ ZEND_ARG_OBJ_INFO(0, iterator, RecursiveIterator, 0)
+ ZEND_ARG_INFO(0, mode)
+ZEND_END_ARG_INFO();
+
+static
+ZEND_BEGIN_ARG_INFO(arginfo_recursive_it_getSubIterator, 0)
+ ZEND_ARG_INFO(0, level)
+ZEND_END_ARG_INFO();
+
+static zend_function_entry spl_funcs_RecursiveIteratorIterator[] = {
+ SPL_ME(RecursiveIteratorIterator, __construct,
arginfo_recursive_it___construct, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator, rewind, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator, valid, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator, key, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator, current, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator, next, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator, getDepth, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator,
getSubIterator,arginfo_recursive_it_getSubIterator, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator, getInnerIterator,NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator, beginChildren, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(RecursiveIteratorIterator, endChildren, NULL, ZEND_ACC_PUBLIC)
+ {NULL, NULL, NULL}
+};
+
#if MBO_0
static int spl_dual_it_gets_implemented(zend_class_entry *interface, zend_class_entry
*class_type TSRMLS_DC)
{
http://cvs.php.net/diff.php/php-src/ext/spl/internal/recursiveiteratoriterator.inc?r1=1.5&r2=1.6&ty=u
Index: php-src/ext/spl/internal/recursiveiteratoriterator.inc
diff -u php-src/ext/spl/internal/recursiveiteratoriterator.inc:1.5
php-src/ext/spl/internal/recursiveiteratoriterator.inc:1.6
--- php-src/ext/spl/internal/recursiveiteratoriterator.inc:1.5 Mon Nov 1 13:11:39
2004
+++ php-src/ext/spl/internal/recursiveiteratoriterator.inc Mon Nov 1 17:54:12
2004
@@ -46,6 +46,7 @@
{
while ($this->count) {
unset($this->ait[$this->count--]);
+ $this->endChildren();
}
$this->ait[0]->rewind();
$this->ait[0]->recursed = false;
@@ -62,6 +63,7 @@
return true;
}
$count--;
+ $this->endChildren();
}
return false;
}
@@ -98,7 +100,8 @@
$this->ait[++$this->count] = $sub;
if (!$sub instanceof
RecursiveIterator) {
throw new
Exception(get_class($sub).'::getChildren() must return an object that implements
RecursiveIterator');
- }
+ }
+ $this->beginChildren();
return;
}
unset($sub);
@@ -113,6 +116,7 @@
if ($this->count) {
unset($this->ait[$this->count--]);
$it = $this->ait[$this->count];
+ $this->endChildren();
}
}
}
@@ -142,6 +146,18 @@
{
return $this->level;
}
+
+ /** Called right after calling getChildren()
+ */
+ function beginChildren()
+ {
+ }
+
+ /** Called after current child iterator is invalid
+ */
+ function endChildren()
+ {
+ }
}
?>
\ No newline at end of file
http://cvs.php.net/co.php/php-src/ext/spl/tests/iterator_014.phpt?r=1.1&p=1
Index: php-src/ext/spl/tests/iterator_014.phpt
+++ php-src/ext/spl/tests/iterator_014.phpt
--TEST--
SPL: RecursiveIteratorIterator and beginChildren/endChildren
--FILE--
<?php
class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator
{
function hasChildren()
{
return is_array($this->current());
}
function getChildren()
{
echo __METHOD__ . "\n";
return new RecursiveArrayIterator($this->current());
}
function valid()
{
if (!parent::valid())
{
echo __METHOD__ . " = false\n";
return false;
}
else
{
return true;
}
}
}
class RecursiveArrayIteratorIterator extends RecursiveIteratorIterator
{
function rewind()
{
echo __METHOD__ . "\n";
parent::rewind();
}
function valid()
{
echo __METHOD__ . "\n";
return parent::valid();
}
function current()
{
echo __METHOD__ . "\n";
return parent::current();
}
function key()
{
echo __METHOD__ . "\n";
return parent::key();
}
function next()
{
echo __METHOD__ . "\n";
parent::next();
}
function beginChildren()
{
echo __METHOD__ . "(".$this->getDepth().")\n";
}
function endChildren()
{
echo __METHOD__ . "(".$this->getDepth().")\n";
}
}
foreach(new RecursiveArrayIteratorIterator(new RecursiveArrayIterator(array("a",
array("ba", array("bba", "bbb"), array(array("bcaa"))), array("ca"), "d"))) as $k=>$v)
{
echo "$k=>$v\n";
}
?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
RecursiveArrayIteratorIterator::rewind
RecursiveArrayIteratorIterator::valid
RecursiveArrayIteratorIterator::current
RecursiveArrayIteratorIterator::key
0=>a
RecursiveArrayIteratorIterator::next
RecursiveArrayIterator::getChildren
RecursiveArrayIteratorIterator::beginChildren(1)
RecursiveArrayIteratorIterator::valid
RecursiveArrayIteratorIterator::current
RecursiveArrayIteratorIterator::key
0=>ba
RecursiveArrayIteratorIterator::next
RecursiveArrayIterator::getChildren
RecursiveArrayIteratorIterator::beginChildren(2)
RecursiveArrayIteratorIterator::valid
RecursiveArrayIteratorIterator::current
RecursiveArrayIteratorIterator::key
0=>bba
RecursiveArrayIteratorIterator::next
RecursiveArrayIteratorIterator::valid
RecursiveArrayIteratorIterator::current
RecursiveArrayIteratorIterator::key
1=>bbb
RecursiveArrayIteratorIterator::next
RecursiveArrayIterator::valid = false
RecursiveArrayIteratorIterator::endChildren(1)
RecursiveArrayIterator::getChildren
RecursiveArrayIteratorIterator::beginChildren(2)
RecursiveArrayIterator::getChildren
RecursiveArrayIteratorIterator::beginChildren(3)
RecursiveArrayIteratorIterator::valid
RecursiveArrayIteratorIterator::current
RecursiveArrayIteratorIterator::key
0=>bcaa
RecursiveArrayIteratorIterator::next
RecursiveArrayIterator::valid = false
RecursiveArrayIteratorIterator::endChildren(2)
RecursiveArrayIterator::valid = false
RecursiveArrayIteratorIterator::endChildren(1)
RecursiveArrayIterator::valid = false
RecursiveArrayIteratorIterator::endChildren(0)
RecursiveArrayIterator::getChildren
RecursiveArrayIteratorIterator::beginChildren(1)
RecursiveArrayIteratorIterator::valid
RecursiveArrayIteratorIterator::current
RecursiveArrayIteratorIterator::key
0=>ca
RecursiveArrayIteratorIterator::next
RecursiveArrayIterator::valid = false
RecursiveArrayIteratorIterator::endChildren(0)
RecursiveArrayIteratorIterator::valid
RecursiveArrayIteratorIterator::current
RecursiveArrayIteratorIterator::key
3=>d
RecursiveArrayIteratorIterator::next
RecursiveArrayIterator::valid = false
RecursiveArrayIteratorIterator::valid
RecursiveArrayIterator::valid = false
===DONE===
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php