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