Adding missing C++20 std::erase implementations (#5735)

There were already implementations for std::erase_if.
This adds the counterpart AZStd::erase versions

resolves #5734

Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com>
This commit is contained in:
lumberyard-employee-dm
2021-11-26 11:31:13 -06:00
committed by GitHub
parent 14ad3b025a
commit 97106f9e60
10 changed files with 156 additions and 7 deletions
+41 -6
View File
@@ -2376,17 +2376,52 @@ namespace UnitTest
static_assert(AZStd::wildcard_match_case(filter1, blahValue));
}
TEST_F(String, StringEraseIf_Succeeds)
TEST_F(String, StringCXX20Erase_Succeeds)
{
AZStd::string eraseIfTest = "ABC CBA";
auto eraseCount = AZStd::erase_if(eraseIfTest, [](AZStd::string::value_type ch)
{
return ch == 'C';
});
auto erasePredicate = [](AZStd::string::value_type ch)
{
return ch == 'C';
};
auto eraseCount = AZStd::erase_if(eraseIfTest, erasePredicate);
EXPECT_EQ(2, eraseCount);
EXPECT_EQ(5, eraseIfTest.size());
EXPECT_STREQ("AB BA", eraseIfTest.c_str());
// Now erase the letter 'A';
eraseCount = AZStd::erase(eraseIfTest, 'A');
EXPECT_EQ(2, eraseCount);
EXPECT_EQ(3, eraseIfTest.size());
EXPECT_EQ("B B", eraseIfTest);
}
TEST_F(String, FixedStringCXX20Erase_Succeeds)
{
// Erase 'l' from the phrase "Hello" World"
constexpr auto eraseTest = [](const char* testString) constexpr
{
AZStd::fixed_string<16> testResult{ testString };
AZStd::erase(testResult, 'l');
return testResult;
}("HelloWorld");
static_assert(eraseTest == "HeoWord");
EXPECT_EQ("HeoWord", eraseTest);
// Use erase_if to erase both 'H' and 'e' from the remaining eraseTest string
constexpr auto eraseIfTest = [](AZStd::string_view testString) constexpr
{
AZStd::fixed_string<16> testResult{ testString };
auto erasePredicate = [](char ch)
{
return ch == 'H' || ch == 'e';
};
AZStd::erase_if(testResult, erasePredicate);
return testResult;
}(eraseTest);
static_assert(eraseIfTest == "oWord");
EXPECT_EQ("oWord", eraseIfTest);
}
template <typename StringType>
@@ -796,6 +796,37 @@ namespace UnitTest
EXPECT_GT(greaterVectorDifferentSize, lessVector);
}
TEST_F(Arrays, FixedVectorCXX20Erase_Succeeds)
{
// Erase 'l' from the phrase "Hello" World"
auto eraseTest = [](AZStd::initializer_list<char> testInit) constexpr
{
AZStd::fixed_vector<char, 16> testResult{ testInit };
AZStd::erase(testResult, 'l');
return testResult;
}({ 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' });
constexpr AZStd::string_view expectedEraseString = "HeoWord";
AZStd::string_view testEraseString{ eraseTest.begin(), eraseTest.end() };
EXPECT_EQ(expectedEraseString, testEraseString);
// Use erase_if to erase both 'H' and 'e' from the remaining eraseTest string
auto eraseIfTest = [](const AZStd::fixed_vector<char, 16>& testVector) constexpr
{
AZStd::fixed_vector<char, 16> testResult{ testVector };
auto erasePredicate = [](char ch)
{
return ch == 'H' || ch == 'e';
};
AZStd::erase_if(testResult, erasePredicate);
return testResult;
}(testEraseString);
constexpr AZStd::string_view expectedEraseIfString = "oWord";
AZStd::string_view testEraseIfString{ eraseIfTest.begin(), eraseIfTest.end() };
EXPECT_EQ(expectedEraseIfString, testEraseIfString);
}
TEST_F(Arrays, VectorSwap)
{
vector<void*> vec1(42, nullptr);