mirror of
https://github.com/php/php-src.git
synced 2026-04-29 19:23:22 +02:00
Implement SplObjectStorage::addAll/removeAll
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Authors: Marcus Boerger <helly@php.net> |
|
||||
| Etienne Kneuss <colder@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
@@ -332,6 +333,62 @@ SPL_METHOD(SplObjectStorage, offsetGet)
|
||||
}
|
||||
} /* }}} */
|
||||
|
||||
/* {{{ proto bool SplObjectStorage::addAll(SplObjectStorage $os)
|
||||
Add all elements contained in $os */
|
||||
SPL_METHOD(SplObjectStorage, addAll)
|
||||
{
|
||||
zval *obj;
|
||||
spl_SplObjectStorage *intern = (spl_SplObjectStorage *)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
spl_SplObjectStorage *other;
|
||||
spl_SplObjectStorageElement *element;
|
||||
HashPosition pos;
|
||||
|
||||
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_ex(&other->storage, &pos);
|
||||
while (zend_hash_get_current_data_ex(&other->storage, (void **)&element, &pos) == SUCCESS) {
|
||||
spl_object_storage_attach(intern, element->obj, element->inf TSRMLS_CC);
|
||||
zend_hash_move_forward_ex(&other->storage, &pos);
|
||||
}
|
||||
|
||||
zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos);
|
||||
intern->index = 0;
|
||||
|
||||
RETURN_LONG(zend_hash_num_elements(&intern->storage));
|
||||
} /* }}} */
|
||||
|
||||
/* {{{ proto bool SplObjectStorage::removeAll(SplObjectStorage $os)
|
||||
Remove all elements contained in $os */
|
||||
SPL_METHOD(SplObjectStorage, removeAll)
|
||||
{
|
||||
zval *obj;
|
||||
spl_SplObjectStorage *intern = (spl_SplObjectStorage *)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
spl_SplObjectStorage *other;
|
||||
spl_SplObjectStorageElement *element;
|
||||
HashPosition pos;
|
||||
|
||||
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_ex(&other->storage, &pos);
|
||||
while (zend_hash_get_current_data_ex(&other->storage, (void **)&element, &pos) == SUCCESS) {
|
||||
spl_object_storage_detach(intern, element->obj TSRMLS_CC);
|
||||
zend_hash_move_forward_ex(&other->storage, &pos);
|
||||
}
|
||||
|
||||
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) U
|
||||
Determine whethe an object is contained in the storage */
|
||||
SPL_METHOD(SplObjectStorage, contains)
|
||||
@@ -907,6 +964,8 @@ static const zend_function_entry spl_funcs_SplObjectStorage[] = {
|
||||
SPL_ME(SplObjectStorage, attach, arginfo_attach, 0)
|
||||
SPL_ME(SplObjectStorage, detach, arginfo_Object, 0)
|
||||
SPL_ME(SplObjectStorage, contains, arginfo_Object, 0)
|
||||
SPL_ME(SplObjectStorage, addAll, arginfo_Object, 0)
|
||||
SPL_ME(SplObjectStorage, removeAll, arginfo_Object, 0)
|
||||
SPL_ME(SplObjectStorage, getInfo, NULL, 0)
|
||||
SPL_ME(SplObjectStorage, setInfo, arginfo_setInfo, 0)
|
||||
/* Countable */
|
||||
|
||||
Reference in New Issue
Block a user