Implement SplObjectStorage::removeAllExcept (Patch by Matthey Turland)

This commit is contained in:
Etienne Kneuss 2011-01-05 15:01:18 +00:00
parent 92ce32032d
commit 78728e33fa
3 changed files with 102 additions and 0 deletions

View File

@ -580,6 +580,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, getThis(), element->obj TSRMLS_CC)) {
spl_object_storage_detach(intern, getThis(), 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)
@ -940,6 +970,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)
SPL_ME(SplObjectStorage, getHash, arginfo_getHash, 0)

View File

@ -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)

View File

@ -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