Skip to content

Commit

Permalink
#1017 Fix empty range handling of min/max_element (#1018)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonasgampigbmw authored Jan 21, 2025
1 parent 4cbef7f commit b34e3a6
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 22 deletions.
56 changes: 34 additions & 22 deletions include/etl/algorithm.h
Original file line number Diff line number Diff line change
Expand Up @@ -1449,16 +1449,20 @@ namespace etl
TCompare compare)
{
TIterator minimum = begin;
++begin;

while (begin != end)
if (begin != end)
{
if (compare(*begin, *minimum))
++begin;

while (begin != end)
{
minimum = begin;
}
if (compare(*begin, *minimum))
{
minimum = begin;
}

++begin;
++begin;
}
}

return minimum;
Expand Down Expand Up @@ -1493,16 +1497,20 @@ namespace etl
TCompare compare)
{
TIterator maximum = begin;
++begin;

while (begin != end)
if (begin != end)
{
if (!compare(*begin, *maximum))
++begin;

while (begin != end)
{
maximum = begin;
}
if (!compare(*begin, *maximum))
{
maximum = begin;
}

++begin;
++begin;
}
}

return maximum;
Expand Down Expand Up @@ -1538,21 +1546,25 @@ namespace etl
{
TIterator minimum = begin;
TIterator maximum = begin;
++begin;

while (begin != end)
if (begin != end)
{
if (compare(*begin, *minimum))
{
minimum = begin;
}
++begin;

if (compare(*maximum, *begin))
while (begin != end)
{
maximum = begin;
}
if (compare(*begin, *minimum))
{
minimum = begin;
}

++begin;
if (compare(*maximum, *begin))
{
maximum = begin;
}

++begin;
}
}

return ETL_OR_STD::pair<TIterator, TIterator>(minimum, maximum);
Expand Down
28 changes: 28 additions & 0 deletions test/test_algorithm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,15 @@ namespace
CHECK_EQUAL(std::distance(data.begin(), expected), std::distance(data.begin(), result));
}

//*************************************************************************
TEST(min_element_empty)
{
Vector dataEmpty;
Vector::iterator expected = std::min_element(dataEmpty.begin(), dataEmpty.end());
Vector::iterator result = etl::min_element(dataEmpty.begin(), dataEmpty.end());
CHECK_EQUAL(std::distance(dataEmpty.end(), expected), std::distance(dataEmpty.end(), result));
}

//*************************************************************************
TEST(max_element)
{
Expand All @@ -206,6 +215,15 @@ namespace
CHECK_EQUAL(std::distance(data.begin(), expected), std::distance(data.begin(), result));
}

//*************************************************************************
TEST(max_element_empty)
{
Vector dataEmpty;
Vector::iterator expected = std::max_element(dataEmpty.begin(), dataEmpty.end());
Vector::iterator result = etl::max_element(dataEmpty.begin(), dataEmpty.end());
CHECK_EQUAL(std::distance(dataEmpty.end(), expected), std::distance(dataEmpty.end(), result));
}

//*************************************************************************
TEST(minmax_element)
{
Expand All @@ -224,6 +242,16 @@ namespace
CHECK_EQUAL(std::distance(data.begin(), expected.second), std::distance(data.begin(), result.second));
}

//*************************************************************************
TEST(minmax_element_empty)
{
Vector dataEmpty;
std::pair<Vector::iterator, Vector::iterator> expected = std::minmax_element(dataEmpty.begin(), dataEmpty.end());
std::pair<Vector::iterator, Vector::iterator> result = etl::minmax_element(dataEmpty.begin(), dataEmpty.end());
CHECK_EQUAL(std::distance(dataEmpty.begin(), expected.first), std::distance(dataEmpty.begin(), result.first));
CHECK_EQUAL(std::distance(dataEmpty.begin(), expected.second), std::distance(dataEmpty.begin(), result.second));
}

//*************************************************************************
TEST(minmax)
{
Expand Down

0 comments on commit b34e3a6

Please sign in to comment.