util/Intrusive{List,HashSet}: add "tag" for base hooks
This commit is contained in:

committed by
Max Kellermann

parent
57d9cffc42
commit
10940da381
@@ -149,3 +149,74 @@ TEST(IntrusiveHashSet, Multi)
|
||||
ASSERT_EQ(set.remove_and_dispose_key(b, [](auto*){}), 0U);
|
||||
ASSERT_EQ(set.find(b), set.end());
|
||||
}
|
||||
|
||||
TEST(IntrusiveHashSet, Tag)
|
||||
{
|
||||
struct A {};
|
||||
struct B {};
|
||||
|
||||
struct TaggedItem final
|
||||
: IntrusiveHashSetHook<IntrusiveHookMode::NORMAL, A>,
|
||||
IntrusiveHashSetHook<IntrusiveHookMode::NORMAL, B> {
|
||||
int a, b;
|
||||
|
||||
TaggedItem(int _a, int _b) noexcept
|
||||
:a(_a), b(_b) {}
|
||||
};
|
||||
|
||||
struct GetA {
|
||||
int operator()(const TaggedItem &item) const noexcept {
|
||||
return item.a;
|
||||
}
|
||||
};
|
||||
|
||||
struct GetB {
|
||||
int operator()(const TaggedItem &item) const noexcept {
|
||||
return item.b;
|
||||
}
|
||||
};
|
||||
|
||||
TaggedItem one{1, 11}, two{2, 22};
|
||||
|
||||
IntrusiveHashSet<TaggedItem, 3,
|
||||
IntrusiveHashSetOperators<std::hash<int>,
|
||||
std::equal_to<int>,
|
||||
GetA>,
|
||||
IntrusiveHashSetBaseHookTraits<TaggedItem, A>> a;
|
||||
|
||||
IntrusiveHashSet<TaggedItem, 3,
|
||||
IntrusiveHashSetOperators<std::hash<int>,
|
||||
std::equal_to<int>,
|
||||
GetB>,
|
||||
IntrusiveHashSetBaseHookTraits<TaggedItem, B>> b;
|
||||
|
||||
EXPECT_TRUE(a.empty());
|
||||
EXPECT_TRUE(b.empty());
|
||||
|
||||
a.insert(one);
|
||||
a.insert(two);
|
||||
|
||||
EXPECT_FALSE(a.empty());
|
||||
EXPECT_TRUE(b.empty());
|
||||
|
||||
b.insert(one);
|
||||
|
||||
EXPECT_FALSE(a.empty());
|
||||
EXPECT_FALSE(b.empty());
|
||||
|
||||
a.clear();
|
||||
|
||||
EXPECT_TRUE(a.empty());
|
||||
EXPECT_FALSE(b.empty());
|
||||
|
||||
a.insert(two);
|
||||
a.insert(one);
|
||||
|
||||
EXPECT_FALSE(a.empty());
|
||||
EXPECT_FALSE(b.empty());
|
||||
|
||||
b.erase(b.iterator_to(one));
|
||||
|
||||
EXPECT_FALSE(a.empty());
|
||||
EXPECT_TRUE(b.empty());
|
||||
}
|
||||
|
@@ -166,6 +166,51 @@ TEST(IntrusiveList, AutoUnlink)
|
||||
ASSERT_TRUE(b.is_linked());
|
||||
}
|
||||
|
||||
TEST(IntrusiveList, Tag)
|
||||
{
|
||||
struct A {};
|
||||
struct B {};
|
||||
|
||||
struct TaggedItem
|
||||
: public IntrusiveListHook<IntrusiveHookMode::NORMAL, A>,
|
||||
public IntrusiveListHook<IntrusiveHookMode::NORMAL, B> {};
|
||||
|
||||
TaggedItem one, two;
|
||||
|
||||
IntrusiveList<TaggedItem, IntrusiveListBaseHookTraits<TaggedItem, A>> a;
|
||||
IntrusiveList<TaggedItem, IntrusiveListBaseHookTraits<TaggedItem, B>> b;
|
||||
|
||||
EXPECT_TRUE(a.empty());
|
||||
EXPECT_TRUE(b.empty());
|
||||
|
||||
a.push_back(one);
|
||||
a.push_back(two);
|
||||
|
||||
EXPECT_FALSE(a.empty());
|
||||
EXPECT_TRUE(b.empty());
|
||||
|
||||
b.push_back(one);
|
||||
|
||||
EXPECT_FALSE(a.empty());
|
||||
EXPECT_FALSE(b.empty());
|
||||
|
||||
a.clear();
|
||||
|
||||
EXPECT_TRUE(a.empty());
|
||||
EXPECT_FALSE(b.empty());
|
||||
|
||||
a.push_back(two);
|
||||
a.push_back(one);
|
||||
|
||||
EXPECT_FALSE(a.empty());
|
||||
EXPECT_FALSE(b.empty());
|
||||
|
||||
b.erase(b.iterator_to(one));
|
||||
|
||||
EXPECT_FALSE(a.empty());
|
||||
EXPECT_TRUE(b.empty());
|
||||
}
|
||||
|
||||
TEST(IntrusiveList, Merge)
|
||||
{
|
||||
using Item = CharItem<IntrusiveHookMode::NORMAL>;
|
||||
|
Reference in New Issue
Block a user