From 55e1bbda22f55bfce8f0e85a1e6a4b16da167ca2 Mon Sep 17 00:00:00 2001 From: CismonX Date: Wed, 11 Apr 2018 21:26:51 +0800 Subject: [PATCH] More tolerant predicate. Add `dropWhile()` and `dropLastWhile()`. --- src/collections_methods.c | 47 ++++++++++++++++++++++++++++++++++----- tests/015-drop-while.phpt | 17 ++++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 tests/015-drop-while.phpt diff --git a/src/collections_methods.c b/src/collections_methods.c index 389b411..49701d4 100644 --- a/src/collections_methods.c +++ b/src/collections_methods.c @@ -199,7 +199,7 @@ PHP_METHOD(Collection, all) CALLBACK_PASS_PAIR(bucket); zend_call_function(&fci, &fcc); zval_ptr_dtor(¶ms[0]); - if (Z_TYPE(retval) == IS_FALSE) + if (!zend_is_true(&retval)) RETURN_FALSE; ZEND_HASH_FOREACH_END(); RETURN_TRUE; @@ -219,7 +219,7 @@ PHP_METHOD(Collection, any) CALLBACK_PASS_PAIR(bucket); zend_call_function(&fci, &fcc); zval_ptr_dtor(¶ms[0]); - if (Z_TYPE(retval) == IS_TRUE) + if (zend_is_true(&retval)) RETURN_TRUE; ZEND_HASH_FOREACH_END(); RETURN_FALSE; @@ -434,8 +434,7 @@ PHP_METHOD(Collection, copyOf) ERR_BAD_SIZE(); RETURN_NULL(); } - if (new_size == 0) - { + if (new_size == 0) { ARRAY_NEW(new_collection, 0); RETURN_NEW_COLLECTION(new_collection); } @@ -545,12 +544,48 @@ PHP_METHOD(Collection, dropLast) PHP_METHOD(Collection, dropLastWhile) { - + zend_fcall_info fci; + zend_fcall_info_cache fcc; + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_FUNC(fci, fcc) + ZEND_PARSE_PARAMETERS_END(); + INIT_FCI(); + zval* current = COLLECTION_FETCH_EX(); + ARRAY_CLONE(new_collection, current); + ZEND_HASH_REVERSE_FOREACH_BUCKET(new_collection, Bucket* bucket) + ZVAL_COPY_VALUE(¶ms[0], &bucket->val); + CALLBACK_PASS_PAIR(bucket); + zend_call_function(&fci, &fcc); + zval_ptr_dtor(¶ms[0]); + if (zend_is_true(&retval)) + zend_hash_del_bucket(new_collection, bucket); + else + break; + ZEND_HASH_FOREACH_END(); + RETVAL_NEW_COLLECTION(new_collection); } PHP_METHOD(Collection, dropWhile) { - + zend_fcall_info fci; + zend_fcall_info_cache fcc; + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_FUNC(fci, fcc) + ZEND_PARSE_PARAMETERS_END(); + INIT_FCI(); + zval* current = COLLECTION_FETCH_EX(); + ARRAY_CLONE(new_collection, current); + ZEND_HASH_FOREACH_BUCKET(new_collection, Bucket* bucket) + ZVAL_COPY_VALUE(¶ms[0], &bucket->val); + CALLBACK_PASS_PAIR(bucket); + zend_call_function(&fci, &fcc); + zval_ptr_dtor(¶ms[0]); + if (zend_is_true(&retval)) + zend_hash_del_bucket(new_collection, bucket); + else + break; + ZEND_HASH_FOREACH_END(); + RETVAL_NEW_COLLECTION(new_collection); } PHP_METHOD(Collection, fill) diff --git a/tests/015-drop-while.phpt b/tests/015-drop-while.phpt new file mode 100644 index 0000000..012e046 --- /dev/null +++ b/tests/015-drop-while.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test Collection::dropWhile() and Collection::dropLastWhile(). +--FILE-- +dropWhile(function ($value) { + return $value % 2; +}); +if ($collection1->toArray() != [3 => 4, 4 => 3]) + echo 'Collection::dropWhile() failed.', PHP_EOL; +$collection2 = $collection->dropLastWhile(function ($value) { + return $value < 6; +}); +if ($collection2->toArray() != [5, 7]) + echo 'Collection::dropLastWhile() failed.', PHP_EOL; +?> +--EXPECT--