]> granicus.if.org Git - php/commitdiff
- MFH CachingIterator implements Countable
authorMarcus Boerger <helly@php.net>
Mon, 19 Feb 2007 16:18:24 +0000 (16:18 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 19 Feb 2007 16:18:24 +0000 (16:18 +0000)
ext/spl/spl_iterators.c

index 4cf4606c8e950a947e793c7805eff7069ba4f759..c93ded1762e52be28afe469e238c64d3cf09c1e7 100755 (executable)
@@ -2232,6 +2232,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)
@@ -2271,6 +2288,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}
 };
 
@@ -2900,6 +2918,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);