diff --git a/rpcs3/Emu/RSX/Common/simple_array.hpp b/rpcs3/Emu/RSX/Common/simple_array.hpp index a37df9dd54..f2dc15ccdb 100644 --- a/rpcs3/Emu/RSX/Common/simple_array.hpp +++ b/rpcs3/Emu/RSX/Common/simple_array.hpp @@ -569,6 +569,21 @@ namespace rsx return ret; } + simple_array filter(std::predicate auto predicate) const + { + simple_array result; + result.reserve(size()); + + for (auto it = begin(); it != end(); ++it) + { + if (predicate(*it)) + { + result.push_back(*it); + } + } + return result; + } + simple_array& sort(std::predicate auto predicate) { if (_size < 2) diff --git a/rpcs3/tests/test_simple_array.cpp b/rpcs3/tests/test_simple_array.cpp index ebedff861d..f08455ae00 100644 --- a/rpcs3/tests/test_simple_array.cpp +++ b/rpcs3/tests/test_simple_array.cpp @@ -181,10 +181,30 @@ namespace rsx EXPECT_FALSE(arr.any([](const int& val) { return val > 5; })); } + TEST(SimpleArray, Filter) + { + const rsx::simple_array arr{ 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -2 }; + const auto result = arr.filter(FN(x > 5)); + const auto result2 = arr.filter(FN(x < 0)); + const auto result3 = arr.filter(FN(x == 10)); + + EXPECT_EQ(result.size(), 4); + EXPECT_EQ(result[0], 6); + EXPECT_EQ(result[1], 7); + EXPECT_EQ(result[2], 8); + EXPECT_EQ(result[3], 9); + + EXPECT_EQ(result2.size(), 2); + EXPECT_EQ(result2[0], -1); + EXPECT_EQ(result2[1], -2); + + EXPECT_EQ(result3.size(), 0); + } + TEST(SimpleArray, Sort) { rsx::simple_array arr{ 5, 3, 1, 4, 2 }; - arr.sort([](const int& a, const int& b) { return a < b; }); + arr.sort(FN(x < y)); for (u32 i = 0; i < arr.size(); ++i) {