Commit 2e07490d authored by Scott Violet's avatar Scott Violet Committed by Commit Bot

Updates UniquePtrMatcher to have deleter

This way UniquePtrMatcher can be used with containers that use a
deleter other than the default.

BUG=none
TEST=none

Change-Id: I4fcea47ea6d756f2ee68ebe94df70c5cd6e0bdc5
Reviewed-on: https://chromium-review.googlesource.com/1033692
Commit-Queue: Scott Violet <sky@chromium.org>
Reviewed-by: default avatarNico Weber <thakis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#554832}
parent 9dc131d6
...@@ -56,19 +56,21 @@ struct UniquePtrComparator { ...@@ -56,19 +56,21 @@ struct UniquePtrComparator {
// Example of erasing from container: // Example of erasing from container:
// EraseIf(v, MatchesUniquePtr(element)); // EraseIf(v, MatchesUniquePtr(element));
// //
template <class T> template <class T, class Deleter = std::default_delete<T>>
struct UniquePtrMatcher { struct UniquePtrMatcher {
explicit UniquePtrMatcher(T* t) : t_(t) {} explicit UniquePtrMatcher(T* t) : t_(t) {}
bool operator()(const std::unique_ptr<T>& o) { return o.get() == t_; } bool operator()(const std::unique_ptr<T, Deleter>& o) {
return o.get() == t_;
}
private: private:
T* const t_; T* const t_;
}; };
template <class T> template <class T, class Deleter = std::default_delete<T>>
UniquePtrMatcher<T> MatchesUniquePtr(T* t) { UniquePtrMatcher<T, Deleter> MatchesUniquePtr(T* t) {
return UniquePtrMatcher<T>(t); return UniquePtrMatcher<T, Deleter>(t);
} }
} // namespace base } // namespace base
......
...@@ -93,5 +93,42 @@ TEST(UniquePtrMatcherTest, Basic) { ...@@ -93,5 +93,42 @@ TEST(UniquePtrMatcherTest, Basic) {
} }
} }
class TestDeleter {
public:
void operator()(Foo* foo) { delete foo; }
};
TEST(UniquePtrMatcherTest, Deleter) {
using UniqueFoo = std::unique_ptr<Foo, TestDeleter>;
std::vector<UniqueFoo> v;
UniqueFoo foo_ptr1(new Foo);
Foo* foo1 = foo_ptr1.get();
v.push_back(std::move(foo_ptr1));
UniqueFoo foo_ptr2(new Foo);
Foo* foo2 = foo_ptr2.get();
v.push_back(std::move(foo_ptr2));
{
auto iter = std::find_if(v.begin(), v.end(),
UniquePtrMatcher<Foo, TestDeleter>(foo1));
ASSERT_TRUE(iter != v.end());
EXPECT_EQ(foo1, iter->get());
}
{
auto iter = std::find_if(v.begin(), v.end(),
UniquePtrMatcher<Foo, TestDeleter>(foo2));
ASSERT_TRUE(iter != v.end());
EXPECT_EQ(foo2, iter->get());
}
{
auto iter = std::find_if(v.begin(), v.end(),
MatchesUniquePtr<Foo, TestDeleter>(foo2));
ASSERT_TRUE(iter != v.end());
EXPECT_EQ(foo2, iter->get());
}
}
} // namespace } // namespace
} // namespace base } // namespace base
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment