From 010b16510f8c00b714d62566505dd2a855b5e344 Mon Sep 17 00:00:00 2001 From: Ivo Ihlemann <38039109+ivoihlemann@users.noreply.github.com> Date: Thu, 29 Oct 2020 10:02:44 +0100 Subject: [PATCH 1/2] add overload for etl::equal that compares lengths (#294) * add overload for etl::equal that compares lengths accoring to std::equal (https://en.cppreference.com/w/cpp/algorithm/equal) * add test for equal overload that compares lengths --- include/etl/algorithm.h | 13 +++++++++++++ test/test_algorithm.cpp | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index d0d8eaba..b65e9ebb 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -800,6 +800,19 @@ namespace etl } #endif +template +ETL_NODISCARD +bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2) +{ + if (etl::distance(first1, last1) != + etl::distance(first2, last2)) + { + return false; + } + return etl::equal(first1, last1, first2); +} + + #if ETL_NOT_USING_STL //*************************************************************************** // lexicographical_compare diff --git a/test/test_algorithm.cpp b/test/test_algorithm.cpp index aefc9c50..1db1efef 100644 --- a/test/test_algorithm.cpp +++ b/test/test_algorithm.cpp @@ -703,6 +703,10 @@ namespace { CHECK(etl::equal(std::begin(dataV), std::end(dataV), std::begin(dataL))); CHECK(!etl::equal(std::begin(dataSL), std::end(dataSL), std::begin(dataL))); + + int small[] = { dataS[0] }; + CHECK(etl::equal(std::begin(dataV), std::end(dataV), std::begin(dataL), std::end(dataL))); + CHECK(!etl::equal(std::begin(dataS), std::end(dataS), std::begin(small), std::end(small))); } //************************************************************************* From e122e4b18cf745326367f37bda13a1da8fb5b9d1 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Thu, 29 Oct 2020 09:29:01 +0000 Subject: [PATCH 2/2] Added STL/No STL options --- include/etl/algorithm.h | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index b65e9ebb..5debe70e 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -789,6 +789,15 @@ namespace etl return (memcmp(first1, first2, sizeof(value_t) * (last1 - first1)) == 0); } + + template + ETL_NODISCARD + bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2) + { + return (etl::distance(first1, last1) == etl::distance(first2, last2)) && + etl::equal(first1, last1, first2); + } + #else //*************************************************************************** // equal @@ -798,20 +807,24 @@ namespace etl { return std::equal(first1, last1, first2); } + +#if ETL_CPP14_SUPPORTED + template + ETL_NODISCARD + bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2) + { + return std::equal(first1, last1, first2, last2); + } +#else + template + ETL_NODISCARD + bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2) + { + return (etl::distance(first1, last1) == etl::distance(first2, last2)) && + etl::equal(first1, last1, first2); + } +#endif #endif - -template -ETL_NODISCARD -bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2) -{ - if (etl::distance(first1, last1) != - etl::distance(first2, last2)) - { - return false; - } - return etl::equal(first1, last1, first2); -} - #if ETL_NOT_USING_STL //***************************************************************************