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, 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)
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)
/* Countable */
--- /dev/null
+--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)
--- /dev/null
+--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
+