]> granicus.if.org Git - php/commitdiff
Implement SplObjectStorage::addAll/removeAll
authorEtienne Kneuss <colder@php.net>
Fri, 16 Jan 2009 22:20:00 +0000 (22:20 +0000)
committerEtienne Kneuss <colder@php.net>
Fri, 16 Jan 2009 22:20:00 +0000 (22:20 +0000)
ext/spl/spl_observer.c

index 9f2ceeddde1e0cb76a155e57e145d811865cca52..759c022ea0bb0841b511896eb340d9f41eb0eef6 100755 (executable)
@@ -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 */