From ccff369e3f6eff5ecb69bd7b9e095481d4476d84 Mon Sep 17 00:00:00 2001 From: Subhransu Mohanty Date: Tue, 6 Oct 2020 11:17:07 +0900 Subject: [PATCH] added Erase and EraseIf function to dali-vector These functions uses erase-remove idiom for efficient removal of more than one item from vector. The signature is same as the standard erase() and erase_if() function added to c++20. Change-Id: I2d6769cde5b6acfbb03447b6576491021ab14fe1 --- automated-tests/src/dali/utc-Dali-Vector.cpp | 102 +++++++++++++++++++++++++++ dali/public-api/common/dali-vector.h | 32 +++++++++ 2 files changed, 134 insertions(+) diff --git a/automated-tests/src/dali/utc-Dali-Vector.cpp b/automated-tests/src/dali/utc-Dali-Vector.cpp index f0dd410..7616cc0 100644 --- a/automated-tests/src/dali/utc-Dali-Vector.cpp +++ b/automated-tests/src/dali/utc-Dali-Vector.cpp @@ -1389,6 +1389,108 @@ int UtcDaliVectorMoveAssignment(void) END_TEST; } +int UtcDaliVectorEraseFreeFunction(void) +{ + tet_infoline("Testing Dali::Erase>"); + + Vector vector; + + // erasing from empty vector + Dali::Erase(vector, 2); + DALI_TEST_EQUALS(ZERO, vector.Count(), TEST_LOCATION); + DALI_TEST_EQUALS(ZERO, vector.Capacity(), TEST_LOCATION); + + + vector.PushBack(1); + vector.PushBack(2); + vector.PushBack(3); + vector.PushBack(4); + vector.PushBack(5); + vector.PushBack(3); + + // erase multiple value + Dali::Erase(vector, 3); + DALI_TEST_EQUALS(static_cast(4), vector.Count(), TEST_LOCATION); + + DALI_TEST_EQUALS(vector[0], 1, TEST_LOCATION); + DALI_TEST_EQUALS(vector[1], 2, TEST_LOCATION); + DALI_TEST_EQUALS(vector[2], 4, TEST_LOCATION); + DALI_TEST_EQUALS(vector[3], 5, TEST_LOCATION); + + + // erase an element present at start + Dali::Erase(vector, 1); + DALI_TEST_EQUALS(static_cast(3), vector.Count(), TEST_LOCATION); + DALI_TEST_EQUALS(vector[0], 2, TEST_LOCATION); + DALI_TEST_EQUALS(vector[1], 4, TEST_LOCATION); + DALI_TEST_EQUALS(vector[2], 5, TEST_LOCATION); + + // erase an element present at end + Dali::Erase(vector, 5); + DALI_TEST_EQUALS(static_cast(2), vector.Count(), TEST_LOCATION); + DALI_TEST_EQUALS(vector[0], 2, TEST_LOCATION); + DALI_TEST_EQUALS(vector[1], 4, TEST_LOCATION); + + // erase an element not present in the vector + Dali::Erase(vector, 42); + DALI_TEST_EQUALS(static_cast(2), vector.Count(), TEST_LOCATION); + DALI_TEST_EQUALS(vector[0], 2, TEST_LOCATION); + DALI_TEST_EQUALS(vector[1], 4, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliVectorEraseIfFreeFunction(void) +{ + tet_infoline("Testing Dali::EraseIf>"); + + Vector vector; + + // erasing from empty vector + Dali::EraseIf(vector, [](const auto & value) {return value == 2;}); + DALI_TEST_EQUALS(ZERO, vector.Count(), TEST_LOCATION); + DALI_TEST_EQUALS(ZERO, vector.Capacity(), TEST_LOCATION); + + + vector.PushBack(1); + vector.PushBack(2); + vector.PushBack(3); + vector.PushBack(4); + vector.PushBack(5); + vector.PushBack(3); + + // erase multiple value + Dali::EraseIf(vector, [](const auto & value) {return value == 3;}); + DALI_TEST_EQUALS(static_cast(4), vector.Count(), TEST_LOCATION); + + DALI_TEST_EQUALS(vector[0], 1, TEST_LOCATION); + DALI_TEST_EQUALS(vector[1], 2, TEST_LOCATION); + DALI_TEST_EQUALS(vector[2], 4, TEST_LOCATION); + DALI_TEST_EQUALS(vector[3], 5, TEST_LOCATION); + + + // erase an element present at start + Dali::EraseIf(vector, [](const auto & value) {return value == 1;}); + DALI_TEST_EQUALS(static_cast(3), vector.Count(), TEST_LOCATION); + DALI_TEST_EQUALS(vector[0], 2, TEST_LOCATION); + DALI_TEST_EQUALS(vector[1], 4, TEST_LOCATION); + DALI_TEST_EQUALS(vector[2], 5, TEST_LOCATION); + + // erase an element present at end + Dali::EraseIf(vector, [](const auto & value) {return value == 5;}); + DALI_TEST_EQUALS(static_cast(2), vector.Count(), TEST_LOCATION); + DALI_TEST_EQUALS(vector[0], 2, TEST_LOCATION); + DALI_TEST_EQUALS(vector[1], 4, TEST_LOCATION); + + // erase an element not present in the vector + Dali::EraseIf(vector, [](const auto & value) {return value == 42;}); + DALI_TEST_EQUALS(static_cast(2), vector.Count(), TEST_LOCATION); + DALI_TEST_EQUALS(vector[0], 2, TEST_LOCATION); + DALI_TEST_EQUALS(vector[1], 4, TEST_LOCATION); + + END_TEST; +} + /* * this does not compile at the moment * Vector< Actor > classvector; this does not compile yet either diff --git a/dali/public-api/common/dali-vector.h b/dali/public-api/common/dali-vector.h index e4bb8ce..5a61b64 100644 --- a/dali/public-api/common/dali-vector.h +++ b/dali/public-api/common/dali-vector.h @@ -847,6 +847,38 @@ public: // API }; /** + * @brief Erases all elements that compare equal to value from the vector. + * + * @SINCE_1_9.33 + * @param[in] vector The vector + * @param[in] value The value to be removed. + */ +template +inline void Erase(Dali::Vector& vector, const U& value) +{ + auto begin = vector.Begin(); + auto end = vector.End(); + + vector.Erase(std::remove(begin, end, value), end); +} + +/** + * @brief Erases all elements that satisfy the predicate from the vector. + * + * @SINCE_1_9.33 + * @param[in] vector The vector + * @param[in] predicate The predicate + */ +template +inline void EraseIf(Dali::Vector& vector, Predicate predicate) +{ + auto begin = vector.Begin(); + auto end = vector.End(); + + vector.Erase(std::remove_if(begin, end, predicate), end); +} + +/** * @} */ } // namespace Dali -- 2.7.4