forked from OSchip/llvm-project
Add generic support for hashing StringRef objects using the new hashing library.
llvm-svn: 152003
This commit is contained in:
parent
97b9359623
commit
ca99ad3f0d
|
@ -19,6 +19,7 @@ namespace llvm {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class SmallVectorImpl;
|
class SmallVectorImpl;
|
||||||
class APInt;
|
class APInt;
|
||||||
|
class hash_code;
|
||||||
|
|
||||||
/// StringRef - Represent a constant reference to a string, i.e. a character
|
/// StringRef - Represent a constant reference to a string, i.e. a character
|
||||||
/// array and a length, which need not be null terminated.
|
/// array and a length, which need not be null terminated.
|
||||||
|
@ -490,6 +491,9 @@ namespace llvm {
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
/// \brief Compute a hash_code for a StringRef.
|
||||||
|
hash_code hash_value(StringRef S);
|
||||||
|
|
||||||
// StringRefs can be treated like a POD type.
|
// StringRefs can be treated like a POD type.
|
||||||
template <typename T> struct isPodLike;
|
template <typename T> struct isPodLike;
|
||||||
template <> struct isPodLike<StringRef> { static const bool value = true; };
|
template <> struct isPodLike<StringRef> { static const bool value = true; };
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
#include "llvm/ADT/APInt.h"
|
#include "llvm/ADT/APInt.h"
|
||||||
#include "llvm/ADT/OwningPtr.h"
|
#include "llvm/ADT/OwningPtr.h"
|
||||||
|
#include "llvm/ADT/Hashing.h"
|
||||||
#include "llvm/ADT/edit_distance.h"
|
#include "llvm/ADT/edit_distance.h"
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
|
|
||||||
|
@ -447,3 +448,9 @@ bool StringRef::getAsInteger(unsigned Radix, APInt &Result) const {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Implementation of StringRef hashing.
|
||||||
|
hash_code llvm::hash_value(StringRef S) {
|
||||||
|
return hash_combine_range(S.begin(), S.end());
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
|
#include "llvm/ADT/Hashing.h"
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
@ -291,4 +292,22 @@ TEST(StringRefTest, Misc) {
|
||||||
EXPECT_EQ("hello", OS.str());
|
EXPECT_EQ("hello", OS.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(StringRefTest, Hashing) {
|
||||||
|
EXPECT_EQ(hash_value(std::string()), hash_value(StringRef()));
|
||||||
|
EXPECT_EQ(hash_value(std::string()), hash_value(StringRef("")));
|
||||||
|
std::string S = "hello world";
|
||||||
|
hash_code H = hash_value(S);
|
||||||
|
EXPECT_EQ(H, hash_value(StringRef("hello world")));
|
||||||
|
EXPECT_EQ(H, hash_value(StringRef(S)));
|
||||||
|
EXPECT_NE(H, hash_value(StringRef("hello worl")));
|
||||||
|
EXPECT_EQ(hash_value(std::string("hello worl")),
|
||||||
|
hash_value(StringRef("hello worl")));
|
||||||
|
EXPECT_NE(H, hash_value(StringRef("hello world ")));
|
||||||
|
EXPECT_EQ(hash_value(std::string("hello world ")),
|
||||||
|
hash_value(StringRef("hello world ")));
|
||||||
|
EXPECT_EQ(H, hash_value(StringRef("hello world\0")));
|
||||||
|
EXPECT_NE(hash_value(std::string("ello worl")),
|
||||||
|
hash_value(StringRef("hello world").slice(1, -1)));
|
||||||
|
}
|
||||||
|
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
|
Loading…
Reference in New Issue