From 3f9b990a72803c4fcf58dadc1f3a94fb817c55a5 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Tue, 23 Apr 2024 09:54:53 +0100 Subject: [PATCH] #815 etl::remove_if calls predicate twice for first iterator, where predicate returns true. --- include/etl/algorithm.h | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index d2de538f..43ec1668 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -2022,19 +2022,18 @@ namespace etl ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T& value) { + first = etl::find(first, last, value); + if (first != last) { TIterator itr = first; - while (itr != last) + while (++itr != last) { if (!(*itr == value)) { - *first = etl::move(*itr); - ++first; + *first++ = etl::move(*itr); } - - ++itr; } } @@ -2049,23 +2048,22 @@ namespace etl ETL_CONSTEXPR14 TIterator remove_if(TIterator first, TIterator last, TUnaryPredicate predicate) { + first = etl::find_if(first, last, predicate); + if (first != last) { TIterator itr = first; - while (itr != last) + while (++itr != last) { if (!predicate(*itr)) { - *first = etl::move(*itr); - ++first; + *first++ = etl::move(*itr); } - - ++itr; } } - return first; + return first; } }