helly Thu May 6 04:57:21 2004 EDT Modified files: /php-src/ext/spl spl_array.c Log: Count support for ArrayIterator & ArrayObject http://cvs.php.net/diff.php/php-src/ext/spl/spl_array.c?r1=1.45&r2=1.46&ty=u Index: php-src/ext/spl/spl_array.c diff -u php-src/ext/spl/spl_array.c:1.45 php-src/ext/spl/spl_array.c:1.46 --- php-src/ext/spl/spl_array.c:1.45 Thu Apr 29 18:52:49 2004 +++ php-src/ext/spl/spl_array.c Thu May 6 04:57:20 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_array.c,v 1.45 2004/04/29 22:52:49 helly Exp $ */ +/* $Id: spl_array.c,v 1.46 2004/05/06 08:57:20 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -614,31 +614,6 @@ } /* }}} */ -/* {{{ PHP_MINIT_FUNCTION(spl_array) */ -PHP_MINIT_FUNCTION(spl_array) -{ - REGISTER_SPL_STD_CLASS_EX(ArrayObject, spl_array_object_new, spl_funcs_ArrayObject); - zend_class_implements(spl_ce_ArrayObject TSRMLS_CC, 1, zend_ce_aggregate); - zend_class_implements(spl_ce_ArrayObject TSRMLS_CC, 1, zend_ce_arrayaccess); - memcpy(&spl_handler_ArrayObject, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - spl_handler_ArrayObject.clone_obj = spl_array_object_clone; - spl_handler_ArrayObject.read_dimension = spl_array_read_dimension; - spl_handler_ArrayObject.write_dimension = spl_array_write_dimension; - spl_handler_ArrayObject.unset_dimension = spl_array_unset_dimension; - spl_handler_ArrayObject.has_dimension = spl_array_has_dimension; - spl_handler_ArrayObject.get_properties = spl_array_get_properties; - - REGISTER_SPL_STD_CLASS_EX(ArrayIterator, spl_array_object_new, spl_funcs_ArrayIterator); - zend_class_implements(spl_ce_ArrayIterator TSRMLS_CC, 1, zend_ce_iterator); - zend_class_implements(spl_ce_ArrayIterator TSRMLS_CC, 1, zend_ce_arrayaccess); - REGISTER_SPL_IMPLEMENTS(ArrayIterator, SeekableIterator); - memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers)); - spl_ce_ArrayIterator->get_iterator = spl_array_get_iterator; - - return SUCCESS; -} -/* }}} */ - /* {{{ proto void ArrayObject::__construct(array|object ar = array()) proto void ArrayIterator::__construct(array|object ar = array()) Cronstructs a new array iterator from a path. */ @@ -744,36 +719,47 @@ while (position-- > 0 && spl_array_next(intern TSRMLS_CC)); } /* }}} */ -/* {{{ proto int ArrayObject::count() - proto int ArrayIterator::count() - Return the number of elements in the Iterator. */ -SPL_METHOD(Array, count) +int spl_array_object_count_elements(zval *object, long *count TSRMLS_DC) /* {{{ */ { - zval *object = getThis(); + *count = 0; + spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC); HashTable *aht = HASH_OF(intern->array); HashPosition pos; - long cnt; if (!aht) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array was modified outside object and is no longer an array"); - RETURN_LONG(0); + *count = 0; + return FAILURE; } if (Z_TYPE_P(intern->array) == IS_OBJECT) { + /* We need to store the 'pos' since we'll modify it in the functions + * we're going to call and which do not support 'pos' as parameter. */ pos = intern->pos; - cnt = 0; + *count = 0; zend_hash_internal_pointer_reset_ex(aht, &intern->pos); while(intern->pos) { - cnt++; + (*count)++; spl_array_next(intern TSRMLS_CC); } intern->pos = pos; - RETURN_LONG(cnt); + return SUCCESS; } else { - RETURN_LONG(zend_hash_num_elements(aht)); + *count = zend_hash_num_elements(aht); + return SUCCESS; } - +} /* }}} */ + +/* {{{ proto int ArrayObject::count() + proto int ArrayIterator::count() + Return the number of elements in the Iterator. */ +SPL_METHOD(Array, count) +{ + long count; + + spl_array_object_count_elements(getThis(), &count TSRMLS_CC); + RETURN_LONG(count); } /* }}} */ /* {{{ proto mixed|NULL ArrayIterator::current() @@ -880,6 +866,32 @@ } /* }}} */ +/* {{{ PHP_MINIT_FUNCTION(spl_array) */ +PHP_MINIT_FUNCTION(spl_array) +{ + REGISTER_SPL_STD_CLASS_EX(ArrayObject, spl_array_object_new, spl_funcs_ArrayObject); + zend_class_implements(spl_ce_ArrayObject TSRMLS_CC, 1, zend_ce_aggregate); + zend_class_implements(spl_ce_ArrayObject TSRMLS_CC, 1, zend_ce_arrayaccess); + memcpy(&spl_handler_ArrayObject, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); + spl_handler_ArrayObject.clone_obj = spl_array_object_clone; + spl_handler_ArrayObject.read_dimension = spl_array_read_dimension; + spl_handler_ArrayObject.write_dimension = spl_array_write_dimension; + spl_handler_ArrayObject.unset_dimension = spl_array_unset_dimension; + spl_handler_ArrayObject.has_dimension = spl_array_has_dimension; + spl_handler_ArrayObject.get_properties = spl_array_get_properties; + spl_handler_ArrayObject.count_elements = spl_array_object_count_elements; + + REGISTER_SPL_STD_CLASS_EX(ArrayIterator, spl_array_object_new, spl_funcs_ArrayIterator); + zend_class_implements(spl_ce_ArrayIterator TSRMLS_CC, 1, zend_ce_iterator); + zend_class_implements(spl_ce_ArrayIterator TSRMLS_CC, 1, zend_ce_arrayaccess); + REGISTER_SPL_IMPLEMENTS(ArrayIterator, SeekableIterator); + memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers)); + spl_ce_ArrayIterator->get_iterator = spl_array_get_iterator; + + return SUCCESS; +} +/* }}} */ + /* * Local variables: * tab-width: 4
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php