Skip to content

Commit 56a7006

Browse files
committed
implmenet erase and erase_if
1 parent daf6f62 commit 56a7006

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

include/beman/inplace_vector/inplace_vector.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,6 +1078,22 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
10781078
}
10791079
};
10801080

1081+
template <typename T, std::size_t N, typename U = T>
1082+
constexpr std::size_t erase(inplace_vector<T, N> &c, const U &value) {
1083+
auto it = std::remove(c.begin(), c.end(), value);
1084+
auto r = std::distance(it, c.end());
1085+
c.erase(it, c.end());
1086+
return r;
1087+
}
1088+
1089+
template <typename T, std::size_t N, typename Predicate>
1090+
constexpr std::size_t erase_if(inplace_vector<T, N> &c, Predicate pred) {
1091+
auto it = std::remove_if(c.begin(), c.end(), pred);
1092+
auto r = std::distance(it, c.end());
1093+
c.erase(it, c.end());
1094+
return r;
1095+
}
1096+
10811097
} // namespace beman
10821098

10831099
// undefine all the internal macros

tests/beman/inplace_vector/erasure.test.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <algorithm>
12
#include <gtest/gtest.h>
23

34
#include "gtest_setup.hpp"
@@ -34,11 +35,8 @@ TYPED_TEST(Erasure, ByValue) {
3435
device.push_back(duplicates);
3536
}
3637

37-
// TODO: uncomment this after erase is implemented
38-
// beman::erase(device, duplicates);
39-
// EXPECT_EQ(uniques, device);
40-
41-
GTEST_SKIP() << "Not implemented";
38+
beman::erase(device, duplicates);
39+
EXPECT_EQ(uniques, device);
4240
}
4341

4442
TYPED_TEST(Erasure, ByPred) {
@@ -61,11 +59,10 @@ TYPED_TEST(Erasure, ByPred) {
6159
for (auto i = 0; i < static_cast<int>(device.capacity()); ++i)
6260
device.push_back(T{i});
6361

64-
// TODO: complete this when its implemented
65-
// beman::erase_if(device,
66-
// [&](auto &v) { return v.value > (device.capacity() / 2);
67-
// });
68-
69-
GTEST_SKIP() << "Not implemented";
62+
beman::erase_if(device,
63+
[&](auto &v) { return v.value > (device.capacity() / 2); });
64+
EXPECT_TRUE(std::all_of(device.begin(), device.end(), [&](auto val) {
65+
return val.value <= (device.capacity() / 2);
66+
}));
7067
}
7168
}; // namespace

0 commit comments

Comments
 (0)