[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-cvs
Subject:    [PHP-CVS] cvs: php-src /ext/spl php_spl.c spl_iterators.c spl_iterators.h  /ext/spl/examples infinit
From:       "Marcus Boerger" <helly () php ! net>
Date:       2004-10-31 19:49:18
Message-ID: cvshelly1099252158 () cvsserver
[Download RAW message or body]

helly		Sun Oct 31 14:49:18 2004 EDT

  Added files:                 
    /php-src/ext/spl/internal	infiniteiterator.inc 
    /php-src/ext/spl/tests	iterator_008.phpt 

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

  Modified files:              
    /php-src/ext/spl	php_spl.c spl_iterators.c spl_iterators.h 
  Log:
  - Implement InfiniteIterator in C
  
  
http://cvs.php.net/diff.php/php-src/ext/spl/php_spl.c?r1=1.31&r2=1.32&ty=u
Index: php-src/ext/spl/php_spl.c
diff -u php-src/ext/spl/php_spl.c:1.31 php-src/ext/spl/php_spl.c:1.32
--- php-src/ext/spl/php_spl.c:1.31	Sun Oct 31 13:43:00 2004
+++ php-src/ext/spl/php_spl.c	Sun Oct 31 14:49:15 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_spl.c,v 1.31 2004/10/31 18:43:00 helly Exp $ */
+/* $Id: php_spl.c,v 1.32 2004/10/31 19:49:15 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 	#include "config.h"
@@ -167,6 +167,7 @@
 	SPL_ADD_CLASS(CachingRecursiveIterator, z_list, sub, allow, ce_flags); \
 	SPL_ADD_CLASS(DirectoryIterator, z_list, sub, allow, ce_flags); \
 	SPL_ADD_CLASS(FilterIterator, z_list, sub, allow, ce_flags); \
+	SPL_ADD_CLASS(InfiniteIterator, z_list, sub, allow, ce_flags); \
 	SPL_ADD_CLASS(IteratorIterator, z_list, sub, allow, ce_flags); \
 	SPL_ADD_CLASS(LimitIterator, z_list, sub, allow, ce_flags); \
 	SPL_ADD_CLASS(NoRewindIterator, z_list, sub, allow, ce_flags); \
http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.46&r2=1.47&ty=u
Index: php-src/ext/spl/spl_iterators.c
diff -u php-src/ext/spl/spl_iterators.c:1.46 php-src/ext/spl/spl_iterators.c:1.47
--- php-src/ext/spl/spl_iterators.c:1.46	Sun Oct 31 14:05:19 2004
+++ php-src/ext/spl/spl_iterators.c	Sun Oct 31 14:49:15 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_iterators.c,v 1.46 2004/10/31 19:05:19 helly Exp $ */
+/* $Id: spl_iterators.c,v 1.47 2004/10/31 19:49:15 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -47,6 +47,7 @@
 zend_class_entry *spl_ce_OuterIterator;
 zend_class_entry *spl_ce_IteratorIterator;
 zend_class_entry *spl_ce_NoRewindIterator;
+zend_class_entry *spl_ce_InfiniteIterator;
 
 function_entry spl_funcs_RecursiveIterator[] = {
 	SPL_ABSTRACT_ME(RecursiveIterator, hasChildren,  NULL)
@@ -1440,7 +1441,37 @@
 	{NULL, NULL, NULL}
 };
 
-zend_object_iterator_funcs spl_norewind_it_iterator_funcs;
+/* {{{ proto InfiniteIterator::__construct(Iterator it)
+   Create an iterator from another iterator */
+SPL_METHOD(InfiniteIterator, __construct)
+{
+	spl_dual_it_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, zend_ce_iterator, \
DIT_InfiniteIterator); +} /* }}} */
+
+/* {{{ proto InfiniteIterator::next()
+   Prevent a call to inner iterators rewind() (internally the current data will be \
fetched if valid()) */ +SPL_METHOD(InfiniteIterator, next)
+{
+	spl_dual_it_object   *intern;
+
+	intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+	spl_dual_it_next(intern, 1 TSRMLS_CC);
+	if (spl_dual_it_valid(intern TSRMLS_CC) == SUCCESS) {
+		spl_dual_it_fetch(intern, 0 TSRMLS_CC);
+	} else {
+		spl_dual_it_rewind(intern TSRMLS_CC);
+		if (spl_dual_it_valid(intern TSRMLS_CC) == SUCCESS) {
+			spl_dual_it_fetch(intern, 0 TSRMLS_CC);
+		}
+	}
+
+} /* }}} */
+
+static zend_function_entry spl_funcs_InfiniteIterator[] = {
+	SPL_ME(InfiniteIterator, __construct,      arginfo_norewind_it___construct, \
ZEND_ACC_PUBLIC) +	SPL_ME(InfiniteIterator, next,             NULL, ZEND_ACC_PUBLIC)
+};
 
 /* {{{ array iterator_to_array(IteratorAggregate it) 
    Copy the iterator into an array */
@@ -1575,6 +1606,8 @@
 	REGISTER_SPL_IMPLEMENTS(IteratorIterator, OuterIterator);
 	REGISTER_SPL_IMPLEMENTS(NoRewindIterator, OuterIterator);
 
+	REGISTER_SPL_SUB_CLASS_EX(InfiniteIterator, IteratorIterator, spl_dual_it_new, \
spl_funcs_InfiniteIterator); +
 	return SUCCESS;
 }
 /* }}} */
http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.h?r1=1.12&r2=1.13&ty=u
Index: php-src/ext/spl/spl_iterators.h
diff -u php-src/ext/spl/spl_iterators.h:1.12 php-src/ext/spl/spl_iterators.h:1.13
--- php-src/ext/spl/spl_iterators.h:1.12	Sun Oct 31 13:43:00 2004
+++ php-src/ext/spl/spl_iterators.h	Sun Oct 31 14:49:15 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_iterators.h,v 1.12 2004/10/31 18:43:00 helly Exp $ */
+/* $Id: spl_iterators.h,v 1.13 2004/10/31 19:49:15 helly Exp $ */
 
 #ifndef SPL_ITERATORS_H
 #define SPL_ITERATORS_H
@@ -35,6 +35,7 @@
 extern zend_class_entry *spl_ce_OuterIterator;
 extern zend_class_entry *spl_ce_IteratorIterator;
 extern zend_class_entry *spl_ce_NoRewindIterator;
+extern zend_class_entry *spl_ce_InfiniteIterator;
 
 PHP_MINIT_FUNCTION(spl_iterators);
 
@@ -48,6 +49,7 @@
 	DIT_CachingRecursiveIterator,
 	DIT_IteratorIterator,
 	DIT_NoRewindIterator,
+	DIT_InfiniteIterator,
 } dual_it_type;
 
 enum {

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

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

/** @ingroup Examples
 * @brief   An infinite Iterator
 * @author  Marcus Boerger
 * @version 1.1
 *
 * This Iterator takes another Iterator and infinitvely iterates it by
 * rewinding it when its end is reached.
 *
 * \note Even an InfiniteIterator stops if its inner Iterator is empty.
 *
 \verbatim
 $it       = new ArrayIterator(array(1,2,3));
 $infinite = new InfiniteIterator($it);
 $limit    = new LimitIterator($infinite, 0, 5);
 foreach($limit as $val=>$key)
 {
 	echo "$val=>$key\n";
 }
 \endverbatim
 */
class InfiniteIterator extends IteratorIterator
{
	/** Move the inner Iterator forward to its next element or rewind it.
	 * @return void
	 */
	function next()
	{
		$this->getInnerIterator()->next();
		if (!$this->getInnerIterator()->valid())
		{
			$this->getInnerIterator()->rewind();
		}
	}
}

?>
http://cvs.php.net/co.php/php-src/ext/spl/tests/iterator_008.phpt?r=1.1&p=1
Index: php-src/ext/spl/tests/iterator_008.phpt
+++ php-src/ext/spl/tests/iterator_008.phpt
--TEST--
SPL: InfiniteIterator
--SKIPIF--
<?php if (!extension_loaded("spl")) print "skip"; ?>
--FILE--
<?php

class ArrayIteratorEx extends ArrayIterator
{
	function rewind()
	{
		echo __METHOD__ . "\n";
		parent::rewind();
	}
	function valid()
	{
		echo __METHOD__ . "\n";
		return parent::valid();
	}
	function current()
	{
		echo __METHOD__ . "\n";
		return parent::current();
	}
	function key()
	{
		echo __METHOD__ . "\n";
		return parent::key();
	}
	function next()
	{
		echo __METHOD__ . "\n";
		parent::next();
	}
}

$it = new InfiniteIterator(new ArrayIteratorEx(range(0,2)));

$pos =0;

foreach ($it as $v) {
	var_dump($v);
	if ($pos++ > 5) {
		break;
	}
}

?>
===DONE===
<?php exit(0); ?>
--EXPECT--
ArrayIteratorEx::rewind
ArrayIteratorEx::valid
ArrayIteratorEx::current
ArrayIteratorEx::key
int(0)
ArrayIteratorEx::next
ArrayIteratorEx::valid
ArrayIteratorEx::current
ArrayIteratorEx::key
int(1)
ArrayIteratorEx::next
ArrayIteratorEx::valid
ArrayIteratorEx::current
ArrayIteratorEx::key
int(2)
ArrayIteratorEx::next
ArrayIteratorEx::valid
ArrayIteratorEx::rewind
ArrayIteratorEx::valid
ArrayIteratorEx::current
ArrayIteratorEx::key
int(0)
ArrayIteratorEx::next
ArrayIteratorEx::valid
ArrayIteratorEx::current
ArrayIteratorEx::key
int(1)
ArrayIteratorEx::next
ArrayIteratorEx::valid
ArrayIteratorEx::current
ArrayIteratorEx::key
int(2)
ArrayIteratorEx::next
ArrayIteratorEx::valid
ArrayIteratorEx::rewind
ArrayIteratorEx::valid
ArrayIteratorEx::current
ArrayIteratorEx::key
int(0)
===DONE===

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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic