helly           Sun Oct 31 19:27:00 2004 EDT

  Added files:                 
    /php-src/ext/spl/internal   appenditerator.inc 
    /php-src/ext/spl/tests      iterator_010.phpt iterator_011.phpt 
                                iterator_012.phpt iterator_013.phpt 

  Removed files:               
    /php-src/ext/spl/examples   appenditerator.inc 

  Modified files:              
    /php-src/ext/spl    php_spl.c spl_array.c spl_array.h spl_iterators.c 
                        spl_iterators.h 
    /php-src/ext/spl/examples/tests     examples.inc 
    /php-src/ext/spl/tests      iterator_001.phpt iterator_007.phpt 
  Log:
  - Minor fixes
  - Implement AppendIterator in C
  
  
http://cvs.php.net/diff.php/php-src/ext/spl/php_spl.c?r1=1.33&r2=1.34&ty=u
Index: php-src/ext/spl/php_spl.c
diff -u php-src/ext/spl/php_spl.c:1.33 php-src/ext/spl/php_spl.c:1.34
--- php-src/ext/spl/php_spl.c:1.33      Sun Oct 31 15:59:37 2004
+++ php-src/ext/spl/php_spl.c   Sun Oct 31 19:26:57 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_spl.c,v 1.33 2004/10/31 20:59:37 helly Exp $ */
+/* $Id: php_spl.c,v 1.34 2004/11/01 00:26:57 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
        #include "config.h"
@@ -161,6 +161,7 @@
        spl_add_classes(&spl_ce_ ## class_name, z_list, sub, allow, ce_flags TSRMLS_CC)
 
 #define SPL_LIST_CLASSES(z_list, sub, allow, ce_flags) \
+       SPL_ADD_CLASS(AppendIterator, z_list, sub, allow, ce_flags); \
        SPL_ADD_CLASS(ArrayObject, z_list, sub, allow, ce_flags); \
        SPL_ADD_CLASS(ArrayIterator, z_list, sub, allow, ce_flags); \
        SPL_ADD_CLASS(CachingIterator, z_list, sub, allow, ce_flags); \
http://cvs.php.net/diff.php/php-src/ext/spl/spl_array.c?r1=1.52&r2=1.53&ty=u
Index: php-src/ext/spl/spl_array.c
diff -u php-src/ext/spl/spl_array.c:1.52 php-src/ext/spl/spl_array.c:1.53
--- php-src/ext/spl/spl_array.c:1.52    Mon Oct  4 16:17:06 2004
+++ php-src/ext/spl/spl_array.c Sun Oct 31 19:26:57 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_array.c,v 1.52 2004/10/04 20:17:06 andi Exp $ */
+/* $Id: spl_array.c,v 1.53 2004/11/01 00:26:57 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -371,20 +371,12 @@
        spl_array_write_dimension(getThis(), index, value TSRMLS_CC);
 } /* }}} */
 
-/* {{{ proto void ArrayObject::append(mixed $newval)
-       proto void ArrayIterator::append(mixed $newval)
- Appends the value (cannot be called for objects). */
-SPL_METHOD(Array, append)
+
+void spl_array_iterator_append(zval *object, zval *append_value TSRMLS_DC) /* {{{ */
 {
-       zval *object = getThis();
        spl_array_object *intern = 
(spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
        HashTable *aht = HASH_OF(intern->array);
 
-       zval *value;
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) {
-               return;
-       }
-
        if (!aht) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside 
object and is no longer an array");
                return;
@@ -394,12 +386,25 @@
                php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot append properties to 
objects, use %s::offsetSet() instead", Z_OBJCE_P(object)->name);
        }
 
-       spl_array_write_dimension(object, NULL, value TSRMLS_CC);
+       spl_array_write_dimension(object, NULL, append_value TSRMLS_CC);
        if (!intern->pos) {
                intern->pos = aht->pListTail;
        }
 } /* }}} */
 
+/* {{{ proto void ArrayObject::append(mixed $newval)
+       proto void ArrayIterator::append(mixed $newval)
+ Appends the value (cannot be called for objects). */
+SPL_METHOD(Array, append)
+{
+       zval *value;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) {
+               return;
+       }
+       spl_array_iterator_append(getThis(), value TSRMLS_CC);
+} /* }}} */
+
 /* {{{ proto void ArrayObject::offsetUnset(mixed $index)
        proto void ArrayIterator::offsetUnset(mixed $index)
  Unsets the value at the specified $index. */
http://cvs.php.net/diff.php/php-src/ext/spl/spl_array.h?r1=1.9&r2=1.10&ty=u
Index: php-src/ext/spl/spl_array.h
diff -u php-src/ext/spl/spl_array.h:1.9 php-src/ext/spl/spl_array.h:1.10
--- php-src/ext/spl/spl_array.h:1.9     Tue Jan 20 15:59:45 2004
+++ php-src/ext/spl/spl_array.h Sun Oct 31 19:26:57 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_array.h,v 1.9 2004/01/20 20:59:45 helly Exp $ */
+/* $Id: spl_array.h,v 1.10 2004/11/01 00:26:57 helly Exp $ */
 
 #ifndef SPL_ARRAY_H
 #define SPL_ARRAY_H
@@ -29,6 +29,8 @@
 
 PHP_MINIT_FUNCTION(spl_array);
 
+extern void spl_array_iterator_append(zval *object, zval *append_value TSRMLS_DC);
+
 #endif /* SPL_ARRAY_H */
 
 /*
http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.48&r2=1.49&ty=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.48 php-src/ext/spl/spl_iterators.c:1.49
--- php-src/ext/spl/spl_iterators.c:1.48        Sun Oct 31 15:59:37 2004
+++ php-src/ext/spl/spl_iterators.c     Sun Oct 31 19:26:57 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_iterators.c,v 1.48 2004/10/31 20:59:37 helly Exp $ */
+/* $Id: spl_iterators.c,v 1.49 2004/11/01 00:26:57 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -33,6 +33,7 @@
 #include "spl_engine.h"
 #include "spl_iterators.h"
 #include "spl_directory.h"
+#include "spl_array.h"
 
 #define INLINE inline
 
@@ -49,6 +50,7 @@
 zend_class_entry *spl_ce_NoRewindIterator;
 zend_class_entry *spl_ce_InfiniteIterator;
 zend_class_entry *spl_ce_EmptyIterator;
+zend_class_entry *spl_ce_AppendIterator;
 
 function_entry spl_funcs_RecursiveIterator[] = {
        SPL_ABSTRACT_ME(RecursiveIterator, hasChildren,  NULL)
@@ -646,6 +648,12 @@
                        }
                        break;
                }
+               case DIT_AppendIterator:
+                       spl_instantiate(spl_ce_ArrayIterator, 
&intern->u.append.zarrayit, 1 TSRMLS_CC);
+                       zend_call_method_with_0_params(&intern->u.append.zarrayit, 
spl_ce_ArrayIterator, &spl_ce_ArrayIterator->constructor, "__construct", NULL);
+                       intern->u.append.iterator = 
spl_ce_ArrayIterator->get_iterator(spl_ce_ArrayIterator, intern->u.append.zarrayit 
TSRMLS_CC);
+                       php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
+                       return intern;
                default:
                        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", 
&zobject, ce_inner) == FAILURE) {
                                php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
@@ -698,7 +706,6 @@
 
 static INLINE void spl_dual_it_free(spl_dual_it_object *intern TSRMLS_DC)
 {
-       spl_dual_it_require(intern TSRMLS_CC);
        if (intern->inner.iterator && 
intern->inner.iterator->funcs->invalidate_current) {
                
intern->inner.iterator->funcs->invalidate_current(intern->inner.iterator TSRMLS_CC);
        }
@@ -801,6 +808,7 @@
        proto mixed ParentIterator::key()
        proto mixed IteratorIterator::key()
        proto mixed NoRewindIterator::key()
+       proto mixed AppendIterator::key()
    Get the current key */
 SPL_METHOD(dual_it, key)
 {
@@ -824,6 +832,7 @@
        proto mixed ParentIterator::current()
        proto mixed IteratorIterator::current()
        proto mixed NoRewindIterator::current()
+       proto mixed AppendIterator::current()
    Get the current element value */
 SPL_METHOD(dual_it, current)
 {
@@ -951,6 +960,11 @@
        if (object->inner.zobject) {
                zval_ptr_dtor(&object->inner.zobject);
        }
+       
+       if (object->dit_type == DIT_AppendIterator) {
+               object->u.append.iterator->funcs->dtor(object->u.append.iterator 
TSRMLS_CC);
+               zval_ptr_dtor(&object->u.append.zarrayit);
+       }
 
        zend_hash_destroy(object->std.properties);
        FREE_HASHTABLE(object->std.properties);
@@ -1415,15 +1429,65 @@
        spl_dual_it_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, zend_ce_iterator, 
DIT_NoRewindIterator);
 } /* }}} */
 
-/* {{{ proto NoRewindIterator::rewind()
-   Prevent a call to inner iterators rewind() (internally the current data will be 
fetched if valid()) */
+/* {{{ proto void NoRewindIterator::rewind()
+   Prevent a call to inner iterators rewind() */
 SPL_METHOD(NoRewindIterator, rewind)
 {
+       /* nothing to do */
+} /* }}} */
+
+/* {{{ proto void NoRewindIterator::valid()
+   Return inner iterators valid() */
+SPL_METHOD(NoRewindIterator, valid)
+{
+       spl_dual_it_object   *intern;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
+       RETURN_BOOL(intern->inner.iterator->funcs->valid(intern->inner.iterator 
TSRMLS_CC) == SUCCESS);
+} /* }}} */
+
+/* {{{ proto mixed NoRewindIterator::key()
+   Return inner iterators key() */
+SPL_METHOD(NoRewindIterator, key)
+{
        spl_dual_it_object   *intern;
 
        intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
 
-       spl_dual_it_fetch(intern, 1 TSRMLS_CC);
+       if (intern->inner.iterator->funcs->get_current_key) {
+               char *str_key;
+               uint str_key_len;
+               ulong int_key;
+               if 
(intern->inner.iterator->funcs->get_current_key(intern->inner.iterator, &str_key, 
&str_key_len, &int_key TSRMLS_CC) == HASH_KEY_IS_LONG) {
+                       RETURN_LONG(int_key);
+               } else {
+                       RETURN_STRINGL(str_key, str_key_len-1, 0);
+               }
+       } else {
+               RETURN_NULL();
+       }
+} /* }}} */
+
+/* {{{ proto mixed NoRewindIterator::current()
+   Return inner iterators current() */
+SPL_METHOD(NoRewindIterator, current)
+{
+       spl_dual_it_object   *intern;
+       zval **data;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
+       intern->inner.iterator->funcs->get_current_data(intern->inner.iterator, &data 
TSRMLS_CC);
+       RETURN_ZVAL(*data, 1, 0);
+} /* }}} */
+
+/* {{{ proto void NoRewindIterator::next()
+   Return inner iterators next() */
+SPL_METHOD(NoRewindIterator, next)
+{
+       spl_dual_it_object   *intern;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
+       intern->inner.iterator->funcs->move_forward(intern->inner.iterator TSRMLS_CC);
 } /* }}} */
 
 static
@@ -1434,10 +1498,10 @@
 static zend_function_entry spl_funcs_NoRewindIterator[] = {
        SPL_ME(NoRewindIterator, __construct,      arginfo_norewind_it___construct, 
ZEND_ACC_PUBLIC)
        SPL_ME(NoRewindIterator, rewind,           NULL, ZEND_ACC_PUBLIC)
-       SPL_ME(dual_it,          valid,            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(NoRewindIterator, valid,            NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(NoRewindIterator, key,              NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(NoRewindIterator, current,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(NoRewindIterator, next,             NULL, ZEND_ACC_PUBLIC)
        SPL_ME(dual_it,          getInnerIterator, NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
@@ -1514,6 +1578,136 @@
        SPL_ME(EmptyIterator, next,             NULL, ZEND_ACC_PUBLIC)
 };
 
+int spl_append_it_next_iterator(spl_dual_it_object *intern TSRMLS_DC) /* {{{*/
+{
+       spl_dual_it_free(intern TSRMLS_CC);
+
+       if (intern->inner.zobject) {
+               zval_ptr_dtor(&intern->inner.zobject);
+               intern->inner.zobject = NULL;
+               intern->inner.ce = NULL;
+               intern->inner.object = NULL;
+               intern->inner.iterator = NULL;
+       }
+       if (intern->u.append.iterator->funcs->valid(intern->u.append.iterator 
TSRMLS_CC) == SUCCESS) {
+               zval **it;
+
+               
intern->u.append.iterator->funcs->get_current_data(intern->u.append.iterator, &it 
TSRMLS_CC);
+               (*it)->refcount++;
+               intern->inner.zobject = *it;
+               intern->inner.ce = Z_OBJCE_PP(it);
+               intern->inner.object = zend_object_store_get_object(*it TSRMLS_CC);
+               intern->inner.iterator = 
intern->inner.ce->get_iterator(intern->inner.ce, *it TSRMLS_CC);
+               spl_dual_it_rewind(intern TSRMLS_CC);
+               
intern->u.append.iterator->funcs->move_forward(intern->u.append.iterator TSRMLS_CC);
+               return SUCCESS;
+       } else {
+               return FAILURE;
+       }
+} /* }}} */
+
+void spl_append_it_fetch(spl_dual_it_object *intern TSRMLS_DC) /* {{{*/
+{
+       while (spl_dual_it_valid(intern TSRMLS_CC) != SUCCESS) {
+               if (spl_append_it_next_iterator(intern TSRMLS_CC) != SUCCESS) {
+                       return;
+               }
+       }
+       spl_dual_it_fetch(intern, 0 TSRMLS_CC);
+} /* }}} */
+
+void spl_append_it_next(spl_dual_it_object *intern TSRMLS_DC) /* {{{ */
+{
+       if (spl_dual_it_valid(intern TSRMLS_CC) == SUCCESS) {
+               spl_dual_it_next(intern, 1 TSRMLS_CC);
+       }
+       spl_append_it_fetch(intern TSRMLS_CC);
+} /* }}} */
+
+/* {{{ proto AppendIterator::__construct()
+   Create an AppendIterator */
+SPL_METHOD(AppendIterator, __construct)
+{
+       spl_dual_it_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, zend_ce_iterator, 
DIT_AppendIterator);
+} /* }}} */
+
+/* {{{ proto void AppendIterator::append(Iterator it)
+   Append an iterator */
+SPL_METHOD(AppendIterator, append)
+{
+       spl_dual_it_object   *intern;
+       zval *it;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &it, 
zend_ce_iterator) == FAILURE) {
+               return;
+       }
+       spl_array_iterator_append(intern->u.append.zarrayit, it TSRMLS_CC);
+
+       if (!intern->inner.iterator || spl_dual_it_valid(intern TSRMLS_CC) != SUCCESS) 
{
+               if (intern->u.append.iterator->funcs->valid(intern->u.append.iterator 
TSRMLS_CC) != SUCCESS) {
+                       
intern->u.append.iterator->funcs->rewind(intern->u.append.iterator TSRMLS_CC);
+               }
+               do {
+                       spl_append_it_next_iterator(intern TSRMLS_CC);
+               } while (intern->inner.zobject != it);
+               spl_append_it_fetch(intern TSRMLS_CC);
+       }
+} /* }}} */
+
+/* {{{ proto void AppendIterator::rewind()
+   Rewind to the first iterator and rewind the first iterator, too */
+SPL_METHOD(AppendIterator, rewind)
+{
+       spl_dual_it_object   *intern;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
+       
+       intern->u.append.iterator->funcs->rewind(intern->u.append.iterator TSRMLS_CC);
+       if (spl_append_it_next_iterator(intern TSRMLS_CC) == SUCCESS) {
+               spl_append_it_fetch(intern TSRMLS_CC);
+       }
+} /* }}} */
+
+/* {{{ proto boolean AppendIterator::valid()
+   Check if the current state is valid */
+SPL_METHOD(AppendIterator, valid)
+{
+       spl_dual_it_object   *intern;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
+
+       RETURN_BOOL(intern->current.data);
+} /* }}} */
+
+/* {{{ proto AppendIterator::next()
+   Forward to next element */
+SPL_METHOD(AppendIterator, next)
+{
+       spl_dual_it_object   *intern;
+
+       intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
+       
+       spl_append_it_next(intern TSRMLS_CC);
+} /* }}} */
+
+static
+ZEND_BEGIN_ARG_INFO(arginfo_append_it_append, 0) 
+       ZEND_ARG_OBJ_INFO(0, iterator, Iterator, 0)
+ZEND_END_ARG_INFO();
+
+static zend_function_entry spl_funcs_AppendIterator[] = {
+       SPL_ME(AppendIterator, __construct,      NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(AppendIterator, append,           arginfo_append_it_append, 
ZEND_ACC_PUBLIC)
+       SPL_ME(AppendIterator, rewind,           NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(AppendIterator, valid,            NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(dual_it,        key,              NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(dual_it,        current,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(AppendIterator, next,             NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(dual_it,        getInnerIterator, NULL, ZEND_ACC_PUBLIC)
+};
+
 /* {{{ array iterator_to_array(IteratorAggregate it) 
    Copy the iterator into an array */
 PHP_FUNCTION(iterator_to_array)
@@ -1640,12 +1834,15 @@
        REGISTER_SPL_INTERFACE(OuterIterator);
        REGISTER_SPL_ITERATOR(OuterIterator);
 
+       REGISTER_SPL_STD_CLASS_EX(AppendIterator, spl_dual_it_new, 
spl_funcs_AppendIterator);
+
        REGISTER_SPL_IMPLEMENTS(RecursiveIteratorIterator, OuterIterator);
        REGISTER_SPL_IMPLEMENTS(CachingIterator, OuterIterator);
        REGISTER_SPL_IMPLEMENTS(FilterIterator, OuterIterator);
        REGISTER_SPL_IMPLEMENTS(LimitIterator, OuterIterator);
        REGISTER_SPL_IMPLEMENTS(IteratorIterator, OuterIterator);
        REGISTER_SPL_IMPLEMENTS(NoRewindIterator, OuterIterator);
+       REGISTER_SPL_IMPLEMENTS(AppendIterator, OuterIterator);
 
        REGISTER_SPL_SUB_CLASS_EX(InfiniteIterator, IteratorIterator, spl_dual_it_new, 
spl_funcs_InfiniteIterator);
        
http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.h?r1=1.14&r2=1.15&ty=u
Index: php-src/ext/spl/spl_iterators.h
diff -u php-src/ext/spl/spl_iterators.h:1.14 php-src/ext/spl/spl_iterators.h:1.15
--- php-src/ext/spl/spl_iterators.h:1.14        Sun Oct 31 15:59:37 2004
+++ php-src/ext/spl/spl_iterators.h     Sun Oct 31 19:26:58 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_iterators.h,v 1.14 2004/10/31 20:59:37 helly Exp $ */
+/* $Id: spl_iterators.h,v 1.15 2004/11/01 00:26:58 helly Exp $ */
 
 #ifndef SPL_ITERATORS_H
 #define SPL_ITERATORS_H
@@ -37,6 +37,7 @@
 extern zend_class_entry *spl_ce_NoRewindIterator;
 extern zend_class_entry *spl_ce_InfiniteIterator;
 extern zend_class_entry *spl_ce_EmptyIterator;
+extern zend_class_entry *spl_ce_AppendIterator;
 
 PHP_MINIT_FUNCTION(spl_iterators);
 
@@ -51,6 +52,7 @@
        DIT_IteratorIterator,
        DIT_NoRewindIterator,
        DIT_InfiniteIterator,
+       DIT_AppendIterator,
 } dual_it_type;
 
 enum {
@@ -90,6 +92,10 @@
                        zval             *zstr;
                        zval             *zchildren;
                } caching;
+               struct {
+                       zval                 *zarrayit;
+                       zend_object_iterator *iterator;
+               } append;
        } u;
 } spl_dual_it_object;
 
http://cvs.php.net/diff.php/php-src/ext/spl/examples/tests/examples.inc?r1=1.2&r2=1.3&ty=u
Index: php-src/ext/spl/examples/tests/examples.inc
diff -u php-src/ext/spl/examples/tests/examples.inc:1.2 
php-src/ext/spl/examples/tests/examples.inc:1.3
--- php-src/ext/spl/examples/tests/examples.inc:1.2     Wed Apr 28 17:52:51 2004
+++ php-src/ext/spl/examples/tests/examples.inc Sun Oct 31 19:26:59 2004
@@ -13,10 +13,6 @@
 }
 
 $classes = array(
-       'EmptyIterator',
-       'InfiniteIterator',
-       'AppendIterator',
-       'NoRewindIterator',
 );
 
 foreach (new IncludeFiles(dirname(__FILE__). '/..', $classes) as $file)
http://cvs.php.net/diff.php/php-src/ext/spl/tests/iterator_001.phpt?r1=1.1&r2=1.2&ty=u
Index: php-src/ext/spl/tests/iterator_001.phpt
diff -u php-src/ext/spl/tests/iterator_001.phpt:1.1 
php-src/ext/spl/tests/iterator_001.phpt:1.2
--- php-src/ext/spl/tests/iterator_001.phpt:1.1 Wed Apr 28 15:58:47 2004
+++ php-src/ext/spl/tests/iterator_001.phpt     Sun Oct 31 19:26:59 2004
@@ -47,7 +47,7 @@
                $this->i++;
        }
        
-       public function greaterThen($comp)
+       public function greaterThan($comp)
        {
                echo get_class($this) . '::' . __FUNCTION__ . '(' . $comp . ")\n";
                return $this->current() > $comp;
@@ -69,7 +69,7 @@
 $it = new LimitIterator(new NumericArrayIterator($a), 1, 3);
 foreach ($it as $v)
 {
-       print $v . ' is ' . ($it->greaterThen(2) ? 'greater than 2' : 'less than or 
equal 2') . "\n";
+       print $v . ' is ' . ($it->greaterThan(2) ? 'greater than 2' : 'less than or 
equal 2') . "\n";
 }
 
 echo "===SEEKABLE===\n";
@@ -77,15 +77,16 @@
 $it = new LimitIterator(new SeekableNumericArrayIterator($a), 1, 3);
 foreach($it as $v)
 {
-       print $v . ' is ' . ($it->greaterThen(2) ? 'greater than 2' : 'less than or 
equal 2') . "\n";
+       print $v . ' is ' . ($it->greaterThan(2) ? 'greater than 2' : 'less than or 
equal 2') . "\n";
 }
 
 echo "===STACKED===\n";
+echo "Shows '2 is greater than 2' because the test is actually done with the current 
value which is 3.\n";
 $a = array(1, 2, 3, 4, 5);
 $it = new CachingIterator(new LimitIterator(new SeekableNumericArrayIterator($a), 1, 
3));
 foreach($it as $v)
 {
-       print $v . ' is ' . ($it->greaterThen(2) ? 'greater than 2' : 'less than or 
equal 2') . "\n";
+       print $v . ' is ' . ($it->greaterThan(2) ? 'greater than 2' : 'less than or 
equal 2') . "\n";
 }
 
 ?>
@@ -100,19 +101,22 @@
 NumericArrayIterator::valid(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
-LimitIterator::greaterThen(2)
+NumericArrayIterator::greaterThan(2)
+NumericArrayIterator::current
 2 is less than or equal 2
 NumericArrayIterator::next
 NumericArrayIterator::valid(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
-LimitIterator::greaterThen(2)
+NumericArrayIterator::greaterThan(2)
+NumericArrayIterator::current
 3 is greater than 2
 NumericArrayIterator::next
 NumericArrayIterator::valid(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
-LimitIterator::greaterThen(2)
+NumericArrayIterator::greaterThan(2)
+NumericArrayIterator::current
 4 is greater than 2
 NumericArrayIterator::next
 ===SEEKABLE===
@@ -122,22 +126,26 @@
 NumericArrayIterator::valid(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
-LimitIterator::greaterThen(2)
+SeekableNumericArrayIterator::greaterThan(2)
+NumericArrayIterator::current
 2 is less than or equal 2
 NumericArrayIterator::next
 NumericArrayIterator::valid(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
-LimitIterator::greaterThen(2)
+SeekableNumericArrayIterator::greaterThan(2)
+NumericArrayIterator::current
 3 is greater than 2
 NumericArrayIterator::next
 NumericArrayIterator::valid(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
-LimitIterator::greaterThen(2)
+SeekableNumericArrayIterator::greaterThan(2)
+NumericArrayIterator::current
 4 is greater than 2
 NumericArrayIterator::next
 ===STACKED===
+Shows '2 is greater than 2' because the test is actually done with the current value 
which is 3.
 NumericArrayIterator::__construct
 NumericArrayIterator::rewind
 SeekableNumericArrayIterator::seek(1)
@@ -148,15 +156,18 @@
 NumericArrayIterator::valid(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
-CachingIterator::greaterThen(2)
-2 is less than or equal 2
+SeekableNumericArrayIterator::greaterThan(2)
+NumericArrayIterator::current
+2 is greater than 2
 NumericArrayIterator::next
 NumericArrayIterator::valid(true)
 NumericArrayIterator::current
 NumericArrayIterator::key
-CachingIterator::greaterThen(2)
+SeekableNumericArrayIterator::greaterThan(2)
+NumericArrayIterator::current
 3 is greater than 2
 NumericArrayIterator::next
-CachingIterator::greaterThen(2)
+SeekableNumericArrayIterator::greaterThan(2)
+NumericArrayIterator::current
 4 is greater than 2
 ===DONE===
http://cvs.php.net/diff.php/php-src/ext/spl/tests/iterator_007.phpt?r1=1.1&r2=1.2&ty=u
Index: php-src/ext/spl/tests/iterator_007.phpt
diff -u php-src/ext/spl/tests/iterator_007.phpt:1.1 
php-src/ext/spl/tests/iterator_007.phpt:1.2
--- php-src/ext/spl/tests/iterator_007.phpt:1.1 Sun Oct 31 13:43:00 2004
+++ php-src/ext/spl/tests/iterator_007.phpt     Sun Oct 31 19:26:59 2004
@@ -121,54 +121,48 @@
 ArrayIteratorEx::valid
 ===1===
 NoRewindIteratorEx::rewind
-ArrayIteratorEx::valid
 NoRewindIteratorEx::valid
+ArrayIteratorEx::valid
 ===2===
 NoRewindIteratorEx::rewind
-ArrayIteratorEx::valid
-ArrayIteratorEx::current
-ArrayIteratorEx::key
 NoRewindIteratorEx::valid
+ArrayIteratorEx::valid
 NoRewindIteratorEx::current
+ArrayIteratorEx::current
 int(0)
 NoRewindIteratorEx::next
 ArrayIteratorEx::next
-ArrayIteratorEx::valid
-ArrayIteratorEx::current
-ArrayIteratorEx::key
 NoRewindIteratorEx::valid
+ArrayIteratorEx::valid
 NoRewindIteratorEx::current
+ArrayIteratorEx::current
 int(1)
 NoRewindIteratorEx::next
 ArrayIteratorEx::next
-ArrayIteratorEx::valid
-ArrayIteratorEx::current
-ArrayIteratorEx::key
 NoRewindIteratorEx::valid
+ArrayIteratorEx::valid
 NoRewindIteratorEx::current
+ArrayIteratorEx::current
 int(2)
 ===3===
 NoRewindIteratorEx::rewind
-ArrayIteratorEx::valid
-ArrayIteratorEx::current
-ArrayIteratorEx::key
 NoRewindIteratorEx::valid
+ArrayIteratorEx::valid
 NoRewindIteratorEx::current
 int(2)
 NoRewindIteratorEx::next
 ArrayIteratorEx::next
-ArrayIteratorEx::valid
-ArrayIteratorEx::current
-ArrayIteratorEx::key
 NoRewindIteratorEx::valid
+ArrayIteratorEx::valid
 NoRewindIteratorEx::current
+ArrayIteratorEx::current
 int(3)
 NoRewindIteratorEx::next
 ArrayIteratorEx::next
-ArrayIteratorEx::valid
 NoRewindIteratorEx::valid
+ArrayIteratorEx::valid
 ===4===
 NoRewindIteratorEx::rewind
-ArrayIteratorEx::valid
 NoRewindIteratorEx::valid
+ArrayIteratorEx::valid
 ===DONE===

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

/** @file appenditerator.inc
 * @ingroup SPL
 * @brief class AppendIterator
 * @author  Marcus Boerger
 * @date    2003 - 2004
 *
 * SPL - Standard PHP Library
 */

/** @ingroup SPL
 * @brief   Iterator that iterates over several iterators one after the other
 * @author  Marcus Boerger
 * @version 1.0
 */
class AppendIterator implements OuterIterator
{
        /** @internal array of inner iterators */
        private $iterators;

        /** Construct an empty AppendIterator
         */
        function __construct()
        {
                $this->iterators = new ArrayIterator();
        }

        /** Append an Iterator
         * @param $it Iterator to append
         *
         * If the current state is invalid but the appended iterator is valid
         * the the AppendIterator itself becomes valid. However there will be no
         * call to $it->rewind(). Also if the current state is invalid the inner
         * ArrayIterator will be rewound und forwarded to the appended element.
         */     
        function append(Iterator $it)
        {
                $this->iterators->append($it);
        }

        /** @return the current inner Iterator
         */
        function getInnerIterator()
        {
                return $this->iterators->current();
        }

        /** Rewind to the first element of the first inner Iterator.
         * @return void
         */
        function rewind()
        {
                $this->iterators->rewind();
                if ($this->iterators->valid())
                {
                        $this->getInnerIterator()->rewind();
                }
        }

        /** @return whether the current element is valid
          */
        function valid()
        {
                return $this->iterators->valid() && $this->getInnerIterator()->valid();
        }

        /** @return the current value if it is valid or \c NULL
         */
        function current()
        {
                /* Using $this->valid() would be exactly the same; it would omit
                 * the access to a non valid element in the inner iterator. Since
                 * the user didn't respect the valid() return value false this
                 * must be intended hence we go on. */
                return $this->iterators->valid() ? 
$this->getInnerIterator()->current() : NULL;
        }

        /** @return the current key if it is valid or \c NULL
         */
        function key()
        {
                return $this->iterators->valid() ? $this->getInnerIterator()->key() : 
NULL;
        }

        /** Move to the next element. If this means to another Iterator that 
         * rewind that Iterator.
         * @return void
         */
        function next()
        {
                if (!$this->iterators->valid())
                {
                        return; /* done all */
                }
                $this->getInnerIterator()->next();
                if ($this->getInnerIterator()->valid())
                {
                        return; /* found valid element in current inner iterator */
                }
                $this->iterators->next();
                while ($this->iterators->valid())
                {
                        $this->getInnerIterator()->rewind();
                        if ($this->getInnerIterator()->valid())
                        {
                                return; /* found element as first elemet in another 
iterator */
                        }
                        $this->iterators->next();
                }
        }

        /** Aggregates the inner iterator
         */     
        function __call($func, $params)
        {
                return call_user_func_array(array($this->getInnerIterator(), $func), 
$params);
        }
}

?>
http://cvs.php.net/co.php/php-src/ext/spl/tests/iterator_010.phpt?r=1.1&p=1
Index: php-src/ext/spl/tests/iterator_010.phpt
+++ php-src/ext/spl/tests/iterator_010.phpt
--TEST--
SPL: EmptyIterator
--FILE--
<?php

echo "===EmptyIterator===\n";

foreach(new LimitIterator(new EmptyIterator(), 0, 3) as $key => $val)
{
        echo "$key=>$val\n";
}

?>
===DONE===
<?php exit(0);
--EXPECTF--
===EmptyIterator===
===DONE===

http://cvs.php.net/co.php/php-src/ext/spl/tests/iterator_011.phpt?r=1.1&p=1
Index: php-src/ext/spl/tests/iterator_011.phpt
+++ php-src/ext/spl/tests/iterator_011.phpt
--TEST--
SPL: InfiniteIterator
--FILE--
<?php

echo "===EmptyIterator===\n";

foreach(new LimitIterator(new InfiniteIterator(new EmptyIterator()), 0, 3) as 
$key=>$val)
{
        echo "$key=>$val\n";
}

echo "===InfiniteIterator===\n";

$it = new ArrayIterator(array(0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D'));
$it = new InfiniteIterator($it);
$it = new LimitIterator($it, 2, 5);
foreach($it as $val=>$key)
{
        echo "$val=>$key\n";
}

echo "===Infinite/LimitIterator===\n";

$it = new ArrayIterator(array(0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D'));
$it = new LimitIterator($it, 1, 2);
$it = new InfiniteIterator($it);
$it = new LimitIterator($it, 2, 5);
foreach($it as $val=>$key)
{
        echo "$val=>$key\n";
}

?>
===DONE===
<?php exit(0);
--EXPECTF--
===EmptyIterator===
===InfiniteIterator===
2=>C
3=>D
0=>A
1=>B
2=>C
===Infinite/LimitIterator===
1=>B
2=>C
1=>B
2=>C
1=>B
===DONE===

http://cvs.php.net/co.php/php-src/ext/spl/tests/iterator_012.phpt?r=1.1&p=1
Index: php-src/ext/spl/tests/iterator_012.phpt
+++ php-src/ext/spl/tests/iterator_012.phpt
--TEST--
SPL: NoRweindIterator
--FILE--
<?php

echo "===Current===\n";

$it = new NoRewindIterator(new ArrayIterator(array(0 => 'A', 1 => 'B', 2 => 'C')));

echo $it->key() . '=>' . $it->current() . "\n";

echo "===Next===\n";

$it->next();

echo "===Foreach===\n";

foreach($it as $key=>$val)
{
        echo "$key=>$val\n";
}

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
===Current===
0=>A
===Next===
===Foreach===
1=>B
2=>C
===DONE===

http://cvs.php.net/co.php/php-src/ext/spl/tests/iterator_013.phpt?r=1.1&p=1
Index: php-src/ext/spl/tests/iterator_013.phpt
+++ php-src/ext/spl/tests/iterator_013.phpt
--TEST--
SPL: AppendIterator
--FILE--
<?php

echo "===Empty===\n";

$it = new AppendIterator;

foreach($it as $key=>$val)
{
        echo "$key=>$val\n";
}

echo "===Append===\n";

$it->append(new ArrayIterator(array(0 => 'A', 1 => 'B')));

foreach($it as $key=>$val)
{
        echo "$key=>$val\n";
}

echo "===Rewind===\n";

foreach($it as $key=>$val)
{
        echo "$key=>$val\n";
}

echo "===Append===\n";

$it->append(new ArrayIterator(array(2 => 'C', 3 => 'D')));

foreach(new NoRewindIterator($it) as $key=>$val)
{
        echo "$key=>$val\n";
}

echo "===Rewind===\n";

foreach($it as $key=>$val)
{
        echo "$key=>$val\n";
}

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
===Empty===
===Append===
0=>A
1=>B
===Rewind===
0=>A
1=>B
===Append===
2=>C
3=>D
===Rewind===
0=>A
1=>B
2=>C
3=>D
===DONE===

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

Reply via email to