]> granicus.if.org Git - php/commitdiff
- Implement EmptyIterator in C
authorMarcus Boerger <helly@php.net>
Sun, 31 Oct 2004 20:59:39 +0000 (20:59 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 31 Oct 2004 20:59:39 +0000 (20:59 +0000)
ext/spl/internal/emptyiterator.inc [moved from ext/spl/examples/emptyiterator.inc with 95% similarity]
ext/spl/php_spl.c
ext/spl/spl_functions.c
ext/spl/spl_iterators.c
ext/spl/spl_iterators.h
ext/spl/tests/iterator_009.phpt [new file with mode: 0755]

similarity index 95%
rename from ext/spl/examples/emptyiterator.inc
rename to ext/spl/internal/emptyiterator.inc
index 2402497b4fc1add9893d4fe7a2a88f301ec99435..730b45cd7f8dbdf09b05e3dadc32d77e4002970d 100755 (executable)
@@ -1,7 +1,7 @@
 <?php
 
 /** @file emptyiterator.inc
- * @ingroup Examples
+ * @ingroup SPL
  * @brief class EmptyIterator
  * @author  Marcus Boerger
  * @date    2003 - 2004
@@ -9,7 +9,7 @@
  * SPL - Standard PHP Library
  */
 
-/** @ingroup Examples
+/** @ingroup SPL
  * @brief   An empty Iterator
  * @author  Marcus Boerger
  * @version 1.0
index 3fcdd49ef7682747b85e8e1614ee16d43bdb6285..f4bfb7d8742f3834482fce2583be2abc5f68d397 100755 (executable)
@@ -166,6 +166,7 @@ PHP_FUNCTION(class_implements)
        SPL_ADD_CLASS(CachingIterator, z_list, sub, allow, ce_flags); \
        SPL_ADD_CLASS(CachingRecursiveIterator, z_list, sub, allow, ce_flags); \
        SPL_ADD_CLASS(DirectoryIterator, z_list, sub, allow, ce_flags); \
+       SPL_ADD_CLASS(EmptyIterator, 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); \
index fc9c315ea64e9313d3db8b2fbd52d0658d77183e..ed7c3da3eaeed12d52d208b44a5bb1aa62d2c24e 100755 (executable)
@@ -59,7 +59,9 @@ void spl_register_std_class(zend_class_entry ** ppce, char * class_name, void *
        *ppce = zend_register_internal_class(&ce TSRMLS_CC);
 
        /* entries changed by initialize */
-       (*ppce)->create_object = obj_ctor;
+       if (obj_ctor) {
+               (*ppce)->create_object = obj_ctor;
+       }
 }
 /* }}} */
 
index 410bbb6d8ddb46064daca5dfcfc8401867768286..ed81cf7af86cf58edc58beee1acd43a1d97db562 100755 (executable)
@@ -48,6 +48,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;
+zend_class_entry *spl_ce_EmptyIterator;
 
 function_entry spl_funcs_RecursiveIterator[] = {
        SPL_ABSTRACT_ME(RecursiveIterator, hasChildren,  NULL)
@@ -1465,7 +1466,6 @@ SPL_METHOD(InfiniteIterator, next)
                        spl_dual_it_fetch(intern, 0 TSRMLS_CC);
                }
        }
-
 } /* }}} */
 
 static zend_function_entry spl_funcs_InfiniteIterator[] = {
@@ -1473,6 +1473,47 @@ static zend_function_entry spl_funcs_InfiniteIterator[] = {
        SPL_ME(InfiniteIterator, next,             NULL, ZEND_ACC_PUBLIC)
 };
 
+/* {{{ proto EmptyIterator::rewind()
+   Does nothing  */
+SPL_METHOD(EmptyIterator, rewind)
+{
+} /* }}} */
+
+/* {{{ proto EmptyIterator::valid()
+   Return false */
+SPL_METHOD(EmptyIterator, valid)
+{
+       RETURN_FALSE;
+} /* }}} */
+
+/* {{{ proto EmptyIterator::key()
+   Throws exception */
+SPL_METHOD(EmptyIterator, key)
+{
+       zend_throw_exception(NULL, "Accessing the key of an EmptyIterator", 0 TSRMLS_CC);
+} /* }}} */
+
+/* {{{ proto EmptyIterator::current()
+   Throws exception */
+SPL_METHOD(EmptyIterator, current)
+{
+       zend_throw_exception(NULL, "Accessing the value of an EmptyIterator", 0 TSRMLS_CC);
+} /* }}} */
+
+/* {{{ proto EmptyIterator::next()
+   Does nothing */
+SPL_METHOD(EmptyIterator, next)
+{
+} /* }}} */
+
+static zend_function_entry spl_funcs_EmptyIterator[] = {
+       SPL_ME(EmptyIterator, rewind,           NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(EmptyIterator, valid,            NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(EmptyIterator, key,              NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(EmptyIterator, current,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(EmptyIterator, next,             NULL, ZEND_ACC_PUBLIC)
+};
+
 /* {{{ array iterator_to_array(IteratorAggregate it) 
    Copy the iterator into an array */
 PHP_FUNCTION(iterator_to_array)
@@ -1607,6 +1648,9 @@ PHP_MINIT_FUNCTION(spl_iterators)
        REGISTER_SPL_IMPLEMENTS(NoRewindIterator, OuterIterator);
 
        REGISTER_SPL_SUB_CLASS_EX(InfiniteIterator, IteratorIterator, spl_dual_it_new, spl_funcs_InfiniteIterator);
+       
+       REGISTER_SPL_STD_CLASS_EX(EmptyIterator, NULL, spl_funcs_EmptyIterator);
+       REGISTER_SPL_ITERATOR(EmptyIterator);
 
        return SUCCESS;
 }
index 5a7391e520e49a680d719bc4094dabf6f9bf388a..185bf54b598e647a7d53695b1c6245a59fcf4293 100755 (executable)
@@ -36,6 +36,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;
+extern zend_class_entry *spl_ce_EmptyIterator;
 
 PHP_MINIT_FUNCTION(spl_iterators);
 
diff --git a/ext/spl/tests/iterator_009.phpt b/ext/spl/tests/iterator_009.phpt
new file mode 100755 (executable)
index 0000000..27a3e06
--- /dev/null
@@ -0,0 +1,47 @@
+--TEST--
+SPL: EmptyIterator
+--SKIPIF--
+<?php if (!extension_loaded("spl")) print "skip"; ?>
+--FILE--
+<?php
+
+class EmptyIteratorEx extends EmptyIterator
+{
+       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();
+       }
+}
+
+foreach (new EmptyIteratorEx() as $v) {
+       var_dump($v);
+}
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECT--
+EmptyIteratorEx::rewind
+EmptyIteratorEx::valid
+===DONE===