- Implement OuterIterator in C

This commit is contained in:
Marcus Boerger 2004-10-29 20:12:57 +00:00
parent 85cae78988
commit 208a97a221
8 changed files with 64 additions and 7 deletions

View File

@ -3,7 +3,7 @@
define('CIT_CALL_TOSTRING', 1);
define('CIT_CATCH_GET_CHILD', 2);
class CachingIterator
class CachingIterator implements OuterIterator
{
protected $it;
protected $current;
@ -76,6 +76,11 @@ class CachingIterator
}
return $this->strValue;
}
function getInnerIterator()
{
return $this->it;
}
}
?>

View File

@ -9,7 +9,7 @@
* you can put an iterator into the constructor and the instance will only
* return selected (accepted) elements.
*/
abstract class FilterIterator implements Iterator
abstract class FilterIterator implements OuterIterator
{
protected $it;
@ -92,6 +92,14 @@ abstract class FilterIterator implements Iterator
protected function __clone() {
// disallow clone
}
/**
* @return The inner iterator
*/
function getInnerIterator()
{
return $this->it;
}
}
?>

View File

@ -1,6 +1,6 @@
<?php
class LimitIterator implements Iterator
class LimitIterator implements OuterIterator
{
protected $it;
protected $offset;
@ -67,6 +67,14 @@ class LimitIterator implements Iterator
function getPosition() {
return $this->pos;
}
/**
* @return The inner iterator
*/
function getInnerIterator()
{
return $this->it;
}
}
?>

View File

@ -6,7 +6,7 @@
* @version 1.0
*
*/
class RecursiveIteratorIterator implements Iterator
class RecursiveIteratorIterator implements OuterIterator
{
protected $ait = array();
protected $count = 0;
@ -92,6 +92,14 @@ class RecursiveIteratorIterator implements Iterator
return @$this->ait[$level];
}
/**
* @return The inner iterator
*/
function getInnerIterator()
{
return $this->it;
}
function getDepth()
{
return $this->level;

View File

@ -168,6 +168,7 @@ PHP_FUNCTION(class_implements)
SPL_ADD_CLASS(DirectoryIterator, z_list, sub, allow, ce_flags); \
SPL_ADD_CLASS(FilterIterator, z_list, sub, allow, ce_flags); \
SPL_ADD_CLASS(LimitIterator, z_list, sub, allow, ce_flags); \
SPL_ADD_CLASS(OuterIterator, z_list, sub, allow, ce_flags); \
SPL_ADD_CLASS(ParentIterator, z_list, sub, allow, ce_flags); \
SPL_ADD_CLASS(RecursiveDirectoryIterator, z_list, sub, allow, ce_flags); \
SPL_ADD_CLASS(RecursiveIterator, z_list, sub, allow, ce_flags); \

View File

@ -44,6 +44,7 @@ zend_class_entry *spl_ce_SeekableIterator;
zend_class_entry *spl_ce_LimitIterator;
zend_class_entry *spl_ce_CachingIterator;
zend_class_entry *spl_ce_CachingRecursiveIterator;
zend_class_entry *spl_ce_OuterIterator;
function_entry spl_funcs_RecursiveIterator[] = {
SPL_ABSTRACT_ME(RecursiveIterator, hasChildren, NULL)
@ -59,6 +60,7 @@ SPL_METHOD(RecursiveIteratorIterator, current);
SPL_METHOD(RecursiveIteratorIterator, next);
SPL_METHOD(RecursiveIteratorIterator, getDepth);
SPL_METHOD(RecursiveIteratorIterator, getSubIterator);
SPL_METHOD(RecursiveIteratorIterator, getInnerIterator);
static
ZEND_BEGIN_ARG_INFO(arginfo_recursive_it___construct, 0)
@ -80,6 +82,7 @@ static zend_function_entry spl_funcs_RecursiveIteratorIterator[] = {
SPL_ME(RecursiveIteratorIterator, next, NULL, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveIteratorIterator, getDepth, NULL, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveIteratorIterator, getSubIterator,arginfo_recursive_it_getSubIterator, ZEND_ACC_PUBLIC)
SPL_ME(RecursiveIteratorIterator, getInnerIterator,NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
@ -414,8 +417,8 @@ SPL_METHOD(RecursiveIteratorIterator, getDepth)
RETURN_LONG(object->level);
} /* }}} */
/* {{{ proto RecursiveIterator RecursiveIteratorIterator::getSubIterator()
The current active sub iterator */
/* {{{ proto RecursiveIterator RecursiveIteratorIterator::getSubIterator([int level])
The current active sub iterator or the iterator at specified level */
SPL_METHOD(RecursiveIteratorIterator, getSubIterator)
{
spl_recursive_it_object *object = (spl_recursive_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
@ -430,6 +433,16 @@ SPL_METHOD(RecursiveIteratorIterator, getSubIterator)
RETURN_ZVAL(object->iterators[level].zobject, 1, 0);
} /* }}} */
/* {{{ proto RecursiveIterator RecursiveIteratorIterator::getInnerIterator()
The current active sub iterator */
SPL_METHOD(RecursiveIteratorIterator, getInnerIterator)
{
spl_recursive_it_object *object = (spl_recursive_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
long level = object->level;
RETURN_ZVAL(object->iterators[level].zobject, 1, 0);
} /* }}} */
/* {{{ spl_RecursiveIteratorIterator_dtor */
static void spl_RecursiveIteratorIterator_free_storage(void *_object TSRMLS_DC)
{
@ -1386,6 +1399,11 @@ PHP_FUNCTION(iterator_count)
}
/* }}} */
static zend_function_entry spl_funcs_OuterIterator[] = {
SPL_ABSTRACT_ME(OuterIterator, getInnerIterator, NULL)
{NULL, NULL, NULL}
};
/* {{{ PHP_MINIT_FUNCTION(spl_iterators)
*/
PHP_MINIT_FUNCTION(spl_iterators)
@ -1432,7 +1450,15 @@ PHP_MINIT_FUNCTION(spl_iterators)
REGISTER_SPL_SUB_CLASS_EX(CachingRecursiveIterator, CachingIterator, spl_dual_it_new, spl_funcs_CachingRecursiveIterator);
REGISTER_SPL_IMPLEMENTS(CachingRecursiveIterator, RecursiveIterator);
REGISTER_SPL_INTERFACE(OuterIterator);
REGISTER_SPL_ITERATOR(OuterIterator);
REGISTER_SPL_IMPLEMENTS(RecursiveIteratorIterator, OuterIterator);
REGISTER_SPL_IMPLEMENTS(CachingIterator, OuterIterator);
REGISTER_SPL_IMPLEMENTS(FilterIterator, OuterIterator);
REGISTER_SPL_IMPLEMENTS(LimitIterator, OuterIterator);
return SUCCESS;
}
/* }}} */

View File

@ -32,6 +32,7 @@ extern zend_class_entry *spl_ce_SeekableIterator;
extern zend_class_entry *spl_ce_LimitIterator;
extern zend_class_entry *spl_ce_CachingIterator;
extern zend_class_entry *spl_ce_CachingRecursiveIterator;
extern zend_class_entry *spl_ce_OuterIterator;
PHP_MINIT_FUNCTION(spl_iterators);