From 496c1db1b5c5510ee0de7ba42d6d709e48a27682 Mon Sep 17 00:00:00 2001 From: Marcus Boerger Date: Thu, 8 Feb 2007 20:13:49 +0000 Subject: [PATCH] - Moving Countable from spl_array.c to spl_iterator.c allows CachingIterator to implement Countable --- ext/spl/spl_array.c | 9 --------- ext/spl/spl_array.h | 1 - ext/spl/spl_iterators.c | 26 ++++++++++++++++++++++++++ ext/spl/spl_iterators.h | 1 + 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 1c3e0828f9..42a26670a7 100755 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -42,8 +42,6 @@ zend_object_handlers spl_handler_ArrayIterator; PHPAPI zend_class_entry *spl_ce_ArrayIterator; PHPAPI zend_class_entry *spl_ce_RecursiveArrayIterator; -PHPAPI zend_class_entry *spl_ce_Countable; - #define SPL_ARRAY_STD_PROP_LIST 0x00000001 #define SPL_ARRAY_ARRAY_AS_PROPS 0x00000002 #define SPL_ARRAY_OVERLOADED_REWIND 0x00010000 @@ -1524,11 +1522,6 @@ static zend_function_entry spl_funcs_RecursiveArrayIterator[] = { {NULL, NULL, NULL} }; -static zend_function_entry spl_funcs_Countable[] = { - SPL_ABSTRACT_ME(Countable, count, NULL) - {NULL, NULL, NULL} -}; - /* {{{ PHP_MINIT_FUNCTION(spl_array) */ PHP_MINIT_FUNCTION(spl_array) { @@ -1563,8 +1556,6 @@ PHP_MINIT_FUNCTION(spl_array) REGISTER_SPL_IMPLEMENTS(RecursiveArrayIterator, RecursiveIterator); spl_ce_RecursiveArrayIterator->get_iterator = spl_array_get_iterator; - REGISTER_SPL_INTERFACE(Countable); - REGISTER_SPL_IMPLEMENTS(ArrayObject, Countable); REGISTER_SPL_IMPLEMENTS(ArrayIterator, Countable); diff --git a/ext/spl/spl_array.h b/ext/spl/spl_array.h index 0ef75f47fc..5e8f23dca4 100755 --- a/ext/spl/spl_array.h +++ b/ext/spl/spl_array.h @@ -27,7 +27,6 @@ extern PHPAPI zend_class_entry *spl_ce_ArrayObject; extern PHPAPI zend_class_entry *spl_ce_ArrayIterator; extern PHPAPI zend_class_entry *spl_ce_RecursiveArrayIterator; -extern PHPAPI zend_class_entry *spl_ce_Countable; PHP_MINIT_FUNCTION(spl_array); diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 7b4d8b8f84..9585eb279b 100755 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -57,6 +57,7 @@ PHPAPI zend_class_entry *spl_ce_EmptyIterator; PHPAPI zend_class_entry *spl_ce_AppendIterator; PHPAPI zend_class_entry *spl_ce_RegexIterator; PHPAPI zend_class_entry *spl_ce_RecursiveRegexIterator; +PHPAPI zend_class_entry *spl_ce_Countable; zend_function_entry spl_funcs_RecursiveIterator[] = { SPL_ABSTRACT_ME(RecursiveIterator, hasChildren, NULL) @@ -2272,6 +2273,23 @@ SPL_METHOD(CachingIterator, setFlags) } /* }}} */ +/* {{{ proto void CachingIterator::count() + Number of cached elements */ +SPL_METHOD(CachingIterator, count) +{ + spl_dual_it_object *intern; + + intern = (spl_dual_it_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + + if (!(intern->u.caching.flags & CIT_FULL_CACHE)) { + zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "%v does not use a full cache (see CachingIterator::__construct)", Z_OBJCE_P(getThis())->name); + return; + } + + RETURN_LONG(zend_hash_num_elements(HASH_OF(intern->u.caching.zcache))); +} +/* }}} */ + static ZEND_BEGIN_ARG_INFO_EX(arginfo_caching_it___construct, 0, 0, 1) ZEND_ARG_OBJ_INFO(0, iterator, Iterator, 0) @@ -2311,6 +2329,7 @@ static zend_function_entry spl_funcs_CachingIterator[] = { SPL_ME(CachingIterator, offsetUnset, arginfo_caching_it_offsetGet, ZEND_ACC_PUBLIC) SPL_ME(CachingIterator, offsetExists, arginfo_caching_it_offsetGet, ZEND_ACC_PUBLIC) SPL_ME(CachingIterator, getCache, NULL, ZEND_ACC_PUBLIC) + SPL_ME(CachingIterator, count, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; @@ -2897,6 +2916,11 @@ static zend_function_entry spl_funcs_OuterIterator[] = { {NULL, NULL, NULL} }; +static zend_function_entry spl_funcs_Countable[] = { + SPL_ABSTRACT_ME(Countable, count, NULL) + {NULL, NULL, NULL} +}; + /* {{{ PHP_MINIT_FUNCTION(spl_iterators) */ PHP_MINIT_FUNCTION(spl_iterators) @@ -2939,6 +2963,7 @@ PHP_MINIT_FUNCTION(spl_iterators) REGISTER_SPL_SUB_CLASS_EX(ParentIterator, RecursiveFilterIterator, spl_dual_it_new, spl_funcs_ParentIterator); + REGISTER_SPL_INTERFACE(Countable); REGISTER_SPL_INTERFACE(SeekableIterator); REGISTER_SPL_ITERATOR(SeekableIterator); @@ -2946,6 +2971,7 @@ PHP_MINIT_FUNCTION(spl_iterators) REGISTER_SPL_SUB_CLASS_EX(CachingIterator, IteratorIterator, spl_dual_it_new, spl_funcs_CachingIterator); REGISTER_SPL_IMPLEMENTS(CachingIterator, ArrayAccess); + REGISTER_SPL_IMPLEMENTS(CachingIterator, Countable); REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "CALL_TOSTRING", CIT_CALL_TOSTRING); REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "CATCH_GET_CHILD", CIT_CATCH_GET_CHILD); diff --git a/ext/spl/spl_iterators.h b/ext/spl/spl_iterators.h index 8a931ebc18..2b7cee891e 100755 --- a/ext/spl/spl_iterators.h +++ b/ext/spl/spl_iterators.h @@ -50,6 +50,7 @@ extern PHPAPI zend_class_entry *spl_ce_EmptyIterator; extern PHPAPI zend_class_entry *spl_ce_AppendIterator; extern PHPAPI zend_class_entry *spl_ce_RegexIterator; extern PHPAPI zend_class_entry *spl_ce_RecursiveRegexIterator; +extern PHPAPI zend_class_entry *spl_ce_Countable; PHP_MINIT_FUNCTION(spl_iterators); -- 2.40.0