helly           Wed Aug 10 15:48:48 2005 EDT

  Added files:                 
    /php-src/ext/spl/internal   recursivefilteriterator.inc 

  Modified files:              
    /php-src/ext/spl    spl_iterators.c 
    /php-src/ext/spl/internal   parentiterator.inc 
  Log:
  - Add RecursiveFilterIterator
  - Derive ParentIterator from RecursiveIterator
  # Actually brought up by a user. It is of course better to filter first and
  # do the recursion only for accepted values. Otherwise you would iterate
  # children and possibly recurse into them just to ignore them later anyway.
  
  
http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.73&r2=1.74&ty=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.73 
php-src/ext/spl/spl_iterators.c:1.74
--- php-src/ext/spl/spl_iterators.c:1.73        Wed Aug  3 10:07:53 2005
+++ php-src/ext/spl/spl_iterators.c     Wed Aug 10 15:48:46 2005
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_iterators.c,v 1.73 2005/08/03 14:07:53 sniper Exp $ */
+/* $Id: spl_iterators.c,v 1.74 2005/08/10 19:48:46 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -41,6 +41,7 @@
 PHPAPI zend_class_entry *spl_ce_RecursiveIterator;
 PHPAPI zend_class_entry *spl_ce_RecursiveIteratorIterator;
 PHPAPI zend_class_entry *spl_ce_FilterIterator;
+PHPAPI zend_class_entry *spl_ce_RecursiveFilterIterator;
 PHPAPI zend_class_entry *spl_ce_ParentIterator;
 PHPAPI zend_class_entry *spl_ce_SeekableIterator;
 PHPAPI zend_class_entry *spl_ce_LimitIterator;
@@ -1041,6 +1042,40 @@
        spl_filter_it_next(getThis(), intern TSRMLS_CC);
 } /* }}} */
 
+/* {{{ proto RecursiveFilterIterator::__construct(RecursiveIterator it)
+   Create a RecursiveFilterIterator from a RecursiveIterator */
+SPL_METHOD(RecursiveFilterIterator, __construct)
+{
+       spl_dual_it_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, 
spl_ce_RecursiveIterator, DIT_Default);
+} /* }}} */
+
+/* {{{ proto boolean RecursiveFilterIterator::hasChildren()
+   Check whether the inner iterator's current element has children */
+SPL_METHOD(RecursiveFilterIterator, hasChildren)
+{
+       spl_dual_it_object   *intern;
+       zval                 *retval;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
+
+       zend_call_method_with_0_params(&intern->inner.zobject, 
intern->inner.ce, NULL, "haschildren", &retval);
+       RETURN_ZVAL(retval, 0, 1);
+} /* }}} */
+
+/* {{{ proto RecursiveFilterIterator RecursiveFilterIterator::getChildren()
+   Return the inner iterator's children contained in a RecursiveFilterIterator 
*/
+SPL_METHOD(RecursiveFilterIterator, getChildren)
+{
+       spl_dual_it_object   *intern;
+       zval                 *retval;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
+
+       zend_call_method_with_0_params(&intern->inner.zobject, 
intern->inner.ce, NULL, "getchildren", &retval);
+       spl_instantiate_arg_ex1(spl_ce_RecursiveFilterIterator, &return_value, 
0, retval TSRMLS_CC);
+       zval_ptr_dtor(&retval);
+} /* }}} */
+
 /* {{{ proto ParentIterator::__construct(RecursiveIterator it)
    Create a ParentIterator from a RecursiveIterator */
 SPL_METHOD(ParentIterator, __construct)
@@ -1142,15 +1177,21 @@
 
 static
 ZEND_BEGIN_ARG_INFO(arginfo_parent_it___construct, 0) 
-       ZEND_ARG_OBJ_INFO(0, iterator, Iterator, 0)
+       ZEND_ARG_OBJ_INFO(0, iterator, RecursiveIterator, 0)
 ZEND_END_ARG_INFO();
 
+static zend_function_entry spl_funcs_RecursiveFilterIterator[] = {
+       SPL_ME(RecursiveFilterIterator,  __construct,      
arginfo_parent_it___construct, ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveFilterIterator,  hasChildren,      NULL, 
ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveFilterIterator,  getChildren,      NULL, 
ZEND_ACC_PUBLIC)
+       {NULL, NULL, NULL}
+};
+
 static zend_function_entry spl_funcs_ParentIterator[] = {
        SPL_ME(ParentIterator,  __construct,      
arginfo_parent_it___construct, ZEND_ACC_PUBLIC)
        SPL_MA(ParentIterator,  accept,           ParentIterator, hasChildren, 
NULL, ZEND_ACC_PUBLIC)
        SPL_ME(ParentIterator,  hasChildren,      NULL, ZEND_ACC_PUBLIC)
        SPL_ME(ParentIterator,  getChildren,      NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(dual_it,         getInnerIterator, NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
 
@@ -1938,10 +1979,11 @@
 
        REGISTER_SPL_STD_CLASS_EX(FilterIterator, spl_dual_it_new, 
spl_funcs_FilterIterator);
        REGISTER_SPL_ITERATOR(FilterIterator);
-       spl_ce_FilterIterator->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS;
 
-       REGISTER_SPL_SUB_CLASS_EX(ParentIterator, FilterIterator, 
spl_dual_it_new, spl_funcs_ParentIterator);
-       REGISTER_SPL_IMPLEMENTS(ParentIterator, RecursiveIterator);
+       REGISTER_SPL_SUB_CLASS_EX(RecursiveFilterIterator, FilterIterator, 
spl_dual_it_new, spl_funcs_RecursiveFilterIterator);
+       REGISTER_SPL_IMPLEMENTS(RecursiveFilterIterator, RecursiveIterator);
+
+       REGISTER_SPL_SUB_CLASS_EX(ParentIterator, RecursiveFilterIterator, 
spl_dual_it_new, spl_funcs_ParentIterator);
 
        REGISTER_SPL_INTERFACE(SeekableIterator);
        REGISTER_SPL_ITERATOR(SeekableIterator);
http://cvs.php.net/diff.php/php-src/ext/spl/internal/parentiterator.inc?r1=1.5&r2=1.6&ty=u
Index: php-src/ext/spl/internal/parentiterator.inc
diff -u php-src/ext/spl/internal/parentiterator.inc:1.5 
php-src/ext/spl/internal/parentiterator.inc:1.6
--- php-src/ext/spl/internal/parentiterator.inc:1.5     Wed Feb 16 19:24:57 2005
+++ php-src/ext/spl/internal/parentiterator.inc Wed Aug 10 15:48:48 2005
@@ -12,14 +12,14 @@
 /**
  * @brief   Iterator to filter parents
  * @author  Marcus Boerger
- * @version 1.1
- * @since PHP 5.0
+ * @version 1.2
+ * @since PHP 6.0
  *
  * This extended FilterIterator allows a recursive iteration using 
  * RecursiveIteratorIterator that only shows those elements which have 
  * children.
  */
-class ParentIterator extends FilterIterator implements RecursiveIterator
+class ParentIterator extends RecursiveFilterIterator
 {
        /** @param $it the RecursiveIterator to filter
         */
@@ -35,13 +35,6 @@
                return $this->it->hasChildren();
        }
 
-       /** @return whether the current element has children
-        */
-       function hasChildren()
-       {
-               return $this->it->hasChildren();
-       }
-
        /** @return the ParentIterator for the current elements children
         */
        function getChildren()

http://cvs.php.net/co.php/php-src/ext/spl/internal/recursivefilteriterator.inc?r=1.1&p=1
Index: php-src/ext/spl/internal/recursivefilteriterator.inc
+++ php-src/ext/spl/internal/recursivefilteriterator.inc
<?php

/** @file recursivefilteriterator.inc
 * @ingroup SPL
 * @brief class RecursiveFilterIterator
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/**
 * @brief   Iterator to filter recursive iterators
 * @author  Marcus Boerger
 * @version 1.0
 * @since PHP 6.0
 *
 * This extended FilterIterator allows a recursive iteration using 
 * RecursiveIteratorIterator that only shows those elements which
 * are accepted. It is of course better to filter before doing the 
 * recursion since it allows to prevent recursion into children that 
 * get declined later anyway.
 */
class RecursiveFilterIterator extends FilterIterator implements 
RecursiveIterator
{
        /** @param $it the RecursiveIterator to filter
         */
        function __construct(RecursiveIterator $it)
        {
                parent::__construct($it);
        }
        
        /** @return whether the current element has children
         */
        function hasChildren()
        {
                return $this->it->hasChildren();
        }

        /** @return the ParentIterator for the current elements children
         */
        function getChildren()
        {
                return new RecursiveFilterIterator($this->it->getChildren());
        }
}

?>

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to