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