From 80afae478b06f4408a964ba89f75b1f58d075cc0 Mon Sep 17 00:00:00 2001 From: CismonX Date: Mon, 14 May 2018 16:20:07 +0800 Subject: [PATCH] Add `reverse()` and `reversed()`. --- src/collections_methods.c | 26 ++++++++++++++++++++++++-- tests/032-reverse-reversed.phpt | 13 +++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 tests/032-reverse-reversed.phpt diff --git a/src/collections_methods.c b/src/collections_methods.c index 5753d30..f4af12a 100644 --- a/src/collections_methods.c +++ b/src/collections_methods.c @@ -1255,12 +1255,34 @@ PHP_METHOD(Collection, retainAll) PHP_METHOD(Collection, reverse) { - + zend_array* current = COLLECTION_FETCH_CURRENT(); + ARRAY_NEW_EX(reversed, current); + ZEND_HASH_REVERSE_FOREACH_BUCKET(current, Bucket* bucket) + ADDREF_IF_REFCOUNTED(bucket->val); + if (bucket->key) + zend_hash_add(reversed, bucket->key, &bucket->val); + else + zend_hash_next_index_insert(reversed, &bucket->val); + ZEND_HASH_FOREACH_END(); + if (GC_REFCOUNT(current) > 1) + GC_DELREF(current); + else + zend_array_destroy(current); + COLLECTION_FETCH_CURRENT() = reversed; } PHP_METHOD(Collection, reversed) { - + zend_array* current = COLLECTION_FETCH_CURRENT(); + ARRAY_NEW_EX(reversed, current); + ZEND_HASH_REVERSE_FOREACH_BUCKET(current, Bucket* bucket) + ADDREF_IF_REFCOUNTED(bucket->val); + if (bucket->key) + zend_hash_add(reversed, bucket->key, &bucket->val); + else + zend_hash_next_index_insert(reversed, &bucket->val); + ZEND_HASH_FOREACH_END(); + RETVAL_NEW_COLLECTION(reversed); } PHP_METHOD(Collection, shuffle) diff --git a/tests/032-reverse-reversed.phpt b/tests/032-reverse-reversed.phpt new file mode 100644 index 0000000..21ee017 --- /dev/null +++ b/tests/032-reverse-reversed.phpt @@ -0,0 +1,13 @@ +--TEST-- +Test Collection::reverse() and Collection::reversed(). +--FILE-- +reverse(); +if ($collection->toArray() != array_reverse($array)) + echo 'Collection::reverse() failed.', PHP_EOL; +if ($collection->reversed()->toArray() != $array) + echo 'Collection::reversed() failed.', PHP_EOL; +?> +--EXPECT--