mirror of
https://github.com/php/php-src.git
synced 2024-11-28 12:26:37 +08:00
Implement SplObjectStorage::removeAllExcept (Patch by Matthey Turland)
This commit is contained in:
parent
92ce32032d
commit
78728e33fa
@ -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)
|
||||
|
27
ext/spl/tests/SplObjectStorage_removeAllExcept_basic.phpt
Normal file
27
ext/spl/tests/SplObjectStorage_removeAllExcept_basic.phpt
Normal 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)
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user