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

Reply via email to