mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[ADT] Add a 'find_as' operation to DenseSet.
This operation is analogous to its counterpart in DenseMap: It allows lookup via cheap-to-construct keys (provided that getHashValue and isEqual are implemented for the cheap key-type in the DenseMapInfo specialization). Thanks to Chandler for the review. llvm-svn: 220168
This commit is contained in:
parent
4f93ec40bc
commit
9793d69437
@ -110,6 +110,21 @@ public:
|
|||||||
const_iterator end() const { return ConstIterator(TheMap.end()); }
|
const_iterator end() const { return ConstIterator(TheMap.end()); }
|
||||||
|
|
||||||
iterator find(const ValueT &V) { return Iterator(TheMap.find(V)); }
|
iterator find(const ValueT &V) { return Iterator(TheMap.find(V)); }
|
||||||
|
|
||||||
|
/// Alternative version of find() which allows a different, and possibly less
|
||||||
|
/// expensive, key type.
|
||||||
|
/// The DenseMapInfo is responsible for supplying methods
|
||||||
|
/// getHashValue(LookupKeyT) and isEqual(LookupKeyT, KeyT) for each key type
|
||||||
|
/// used.
|
||||||
|
template <class LookupKeyT>
|
||||||
|
iterator find_as(const LookupKeyT &Val) {
|
||||||
|
return Iterator(TheMap.find_as(Val));
|
||||||
|
}
|
||||||
|
template <class LookupKeyT>
|
||||||
|
const_iterator find_as(const LookupKeyT &Val) const {
|
||||||
|
return ConstIterator(TheMap.find_as(Val));
|
||||||
|
}
|
||||||
|
|
||||||
void erase(Iterator I) { return TheMap.erase(I.I); }
|
void erase(Iterator I) { return TheMap.erase(I.I); }
|
||||||
void erase(ConstIterator CI) { return TheMap.erase(CI.I); }
|
void erase(ConstIterator CI) { return TheMap.erase(CI.I); }
|
||||||
|
|
||||||
|
@ -27,4 +27,42 @@ TEST_F(DenseSetTest, DoubleEntrySetTest) {
|
|||||||
EXPECT_EQ(0u, set.count(2));
|
EXPECT_EQ(0u, set.count(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct TestDenseSetInfo {
|
||||||
|
static inline unsigned getEmptyKey() { return ~0; }
|
||||||
|
static inline unsigned getTombstoneKey() { return ~0U - 1; }
|
||||||
|
static unsigned getHashValue(const unsigned& Val) { return Val * 37U; }
|
||||||
|
static unsigned getHashValue(const char* Val) {
|
||||||
|
return (unsigned)(Val[0] - 'a') * 37U;
|
||||||
|
}
|
||||||
|
static bool isEqual(const unsigned& LHS, const unsigned& RHS) {
|
||||||
|
return LHS == RHS;
|
||||||
|
}
|
||||||
|
static bool isEqual(const char* LHS, const unsigned& RHS) {
|
||||||
|
return (unsigned)(LHS[0] - 'a') == RHS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(DenseSetCustomTest, FindAsTest) {
|
||||||
|
DenseSet<unsigned, TestDenseSetInfo> set;
|
||||||
|
set.insert(0);
|
||||||
|
set.insert(1);
|
||||||
|
set.insert(2);
|
||||||
|
|
||||||
|
// Size tests
|
||||||
|
EXPECT_EQ(3u, set.size());
|
||||||
|
|
||||||
|
// Normal lookup tests
|
||||||
|
EXPECT_EQ(1u, set.count(1));
|
||||||
|
EXPECT_EQ(0u, *set.find(0));
|
||||||
|
EXPECT_EQ(1u, *set.find(1));
|
||||||
|
EXPECT_EQ(2u, *set.find(2));
|
||||||
|
EXPECT_TRUE(set.find(3) == set.end());
|
||||||
|
|
||||||
|
// find_as() tests
|
||||||
|
EXPECT_EQ(0u, *set.find_as("a"));
|
||||||
|
EXPECT_EQ(1u, *set.find_as("b"));
|
||||||
|
EXPECT_EQ(2u, *set.find_as("c"));
|
||||||
|
EXPECT_TRUE(set.find_as("d") == set.end());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user