Sorry to flood the list, but I noticed that I left a stray reference
to removeCommon in my amended patch. Attached the fixed version. My
profound apologies.

Regards,

Matthew Turland
Index: ext/spl/tests/SplObjectStorage_removeUncommon_basic.phpt
===================================================================
--- ext/spl/tests/SplObjectStorage_removeUncommon_basic.phpt	(revision 0)
+++ ext/spl/tests/SplObjectStorage_removeUncommon_basic.phpt	(revision 0)
@@ -0,0 +1,27 @@
+--TEST--
+Check that SplObjectStorage::removeUncommon functions when receiving proper input 
+--CREDITS--
+Matthew Turland (m...@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->removeUncommon($bar);
+    var_dump($foo->contains($a));
+    var_dump($foo->contains($b));
+
+?>
+--EXPECT--
+bool(false)
+bool(true)
Index: ext/spl/tests/SplObjectStorage_removeUncommon_invalid_parameter.phpt
===================================================================
--- ext/spl/tests/SplObjectStorage_removeUncommon_invalid_parameter.phpt	(revision 0)
+++ ext/spl/tests/SplObjectStorage_removeUncommon_invalid_parameter.phpt	(revision 0)
@@ -0,0 +1,44 @@
+--TEST--
+Check that SplObjectStorage::removeUncommon generate a warning and returns NULL when passed non-object param
+--CREDITS--
+Matthew Turland (m...@matthewturland.com)
+Based on work done at PHPNW Testfest 2009 by Simon Westcott (swestc...@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->removeUncommon($input));
+}
+
+?>
+--EXPECTF--
+Warning: SplObjectStorage::removeUncommon() expects parameter 1 to be SplObjectStorage, array given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeUncommon() expects parameter 1 to be SplObjectStorage, boolean given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeUncommon() expects parameter 1 to be SplObjectStorage, %unicode_string_optional% given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeUncommon() expects parameter 1 to be SplObjectStorage, integer given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeUncommon() expects parameter 1 to be SplObjectStorage, double given in %s on line %d
+NULL
+
+Warning: SplObjectStorage::removeUncommon() expects parameter 1 to be SplObjectStorage, null given in %s on line %d
+NULL
+
Index: ext/spl/spl_observer.c
===================================================================
--- ext/spl/spl_observer.c	(revision 306446)
+++ ext/spl/spl_observer.c	(working copy)
@@ -485,6 +485,35 @@
 	RETURN_LONG(zend_hash_num_elements(&intern->storage));
 } /* }}} */
 
+/* {{{ proto bool SplObjectStorage::removeUncommon(SplObjectStorage $os)
+ Remove elements not common to both this SplObjectStorage instance and $os */
+SPL_METHOD(SplObjectStorage, removeUncommon)
+{
+	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 +856,7 @@
 	SPL_ME(SplObjectStorage,  contains,    arginfo_Object,        0)
 	SPL_ME(SplObjectStorage,  addAll,      arginfo_Object,        0)
 	SPL_ME(SplObjectStorage,  removeAll,   arginfo_Object,        0)
+	SPL_ME(SplObjectStorage,  removeUncommon, arginfo_Object,     0)
 	SPL_ME(SplObjectStorage,  getInfo,     arginfo_splobject_void,0)
 	SPL_ME(SplObjectStorage,  setInfo,     arginfo_setInfo,       0)
 	/* Countable */
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to