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