]> granicus.if.org Git - php/commitdiff
Implement SplObjectStorage::removeAllExcept (Patch by Matthey Turland)
authorEtienne Kneuss <colder@php.net>
Wed, 5 Jan 2011 15:01:18 +0000 (15:01 +0000)
committerEtienne Kneuss <colder@php.net>
Wed, 5 Jan 2011 15:01:18 +0000 (15:01 +0000)
ext/spl/spl_observer.c
ext/spl/tests/SplObjectStorage_removeAllExcept_basic.phpt [new file with mode: 0644]
ext/spl/tests/SplObjectStorage_removeAllExcept_invalid_parameter.phpt [new file with mode: 0644]

index 9479753ce4bb84b379c01cae2bf3b07197b8cd16..7910a0d775bb2dad763b260dba941201a6e386ab 100755 (executable)
@@ -485,6 +485,36 @@ SPL_METHOD(SplObjectStorage, removeAll)
        RETURN_LONG(zend_hash_num_elements(&intern->storage));
 } /* }}} */
 
+/* {{{ proto bool SplObjectStorage::removeAllExcept(SplObjectStorage $os)
+ Remove elements not common to both this SplObjectStorage instance and $os */
+SPL_METHOD(SplObjectStorage, removeAllExcept)
+{
+       zval *obj;
+       spl_SplObjectStorage *intern = (spl_SplObjectStorage *)zend_object_store_get_object(getThis() TSRMLS_CC);
+       spl_SplObjectStorage *other;
+       spl_SplObjectStorageElement *element;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &obj, spl_ce_SplObjectStorage) == FAILURE) {
+               return;
+       }
+
+       other = (spl_SplObjectStorage *)zend_object_store_get_object(obj TSRMLS_CC);
+
+       zend_hash_internal_pointer_reset(&intern->storage);
+       while (zend_hash_get_current_data(&intern->storage, (void **)&element) == SUCCESS) {
+               if (!spl_object_storage_contains(other, element->obj TSRMLS_CC)) {
+                       spl_object_storage_detach(intern, element->obj TSRMLS_CC);
+               }
+               zend_hash_move_forward(&intern->storage);
+       }
+
+       zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
+       intern->index = 0;
+
+       RETURN_LONG(zend_hash_num_elements(&intern->storage));
+}
+/* }}} */
+
 /* {{{ proto bool SplObjectStorage::contains($obj)
  Determine whethe an object is contained in the storage */
 SPL_METHOD(SplObjectStorage, contains)
@@ -827,6 +857,7 @@ static const zend_function_entry spl_funcs_SplObjectStorage[] = {
        SPL_ME(SplObjectStorage,  contains,    arginfo_Object,        0)
        SPL_ME(SplObjectStorage,  addAll,      arginfo_Object,        0)
        SPL_ME(SplObjectStorage,  removeAll,   arginfo_Object,        0)
+       SPL_ME(SplObjectStorage,  removeAllExcept, arginfo_Object,    0)
        SPL_ME(SplObjectStorage,  getInfo,     arginfo_splobject_void,0)
        SPL_ME(SplObjectStorage,  setInfo,     arginfo_setInfo,       0)
        /* Countable */
diff --git a/ext/spl/tests/SplObjectStorage_removeAllExcept_basic.phpt b/ext/spl/tests/SplObjectStorage_removeAllExcept_basic.phpt
new file mode 100644 (file)
index 0000000..7c8cb75
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+Check that SplObjectStorage::removeUncommon functions when receiving proper input 
+--CREDITS--
+Matthew Turland (me@matthewturland.com)
+--FILE--
+<?php
+
+    $a = (object) 'a'; 
+    $b = (object) 'b'; 
+    $c = (object) 'c'; 
+
+   $foo = new SplObjectStorage;
+    $foo->attach($a);
+    $foo->attach($b);
+
+    $bar = new SplObjectStorage;
+    $bar->attach($b);
+    $bar->attach($c);
+
+    $foo->removeAllExcept($bar);
+    var_dump($foo->contains($a));
+    var_dump($foo->contains($b));
+
+?>
+--EXPECT--
+bool(false)
+bool(true)
diff --git a/ext/spl/tests/SplObjectStorage_removeAllExcept_invalid_parameter.phpt b/ext/spl/tests/SplObjectStorage_removeAllExcept_invalid_parameter.phpt
new file mode 100644 (file)
index 0000000..62e0dde
--- /dev/null
@@ -0,0 +1,44 @@
+--TEST--
+Check that SplObjectStorage::removeAllExcept generate a warning and returns NULL when passed non-object param
+--CREDITS--
+Matthew Turland (me@matthewturland.com)
+Based on work done at PHPNW Testfest 2009 by Simon Westcott (swestcott@gmail.com)
+--FILE--
+<?php
+
+$data_provider = array(
+   array(),
+   true,
+   "string",
+   12345,
+   1.2345,
+   NULL
+);
+
+foreach($data_provider as $input) {
+
+   $s = new SplObjectStorage();
+
+   var_dump($s->removeAllExcept($input));
+}
+
+?>
+--EXPECTF--
+Warning: SplObjectStorage::removeAllExcept() expects parameter 1 to be SplObjectStorage, array given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeAllExcept() expects parameter 1 to be SplObjectStorage, boolean given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeAllExcept() expects parameter 1 to be SplObjectStorage, %unicode_string_optional% given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeAllExcept() expects parameter 1 to be SplObjectStorage, integer given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeAllExcept() expects parameter 1 to be SplObjectStorage, double given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeAllExcept() expects parameter 1 to be SplObjectStorage, null given in %s on line %d
+NULL
+