aboutsummaryrefslogtreecommitdiff
path: root/lib/Support/FoldingSet.cpp
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2009-02-07 04:57:08 +0000
committerNick Lewycky <nicholas@mxc.ca>2009-02-07 04:57:08 +0000
commitf996831427009c5abe37f0af9d9632ef60f181e2 (patch)
tree765c3b858ea2a592ad7bd4259c6b82112dc80a22 /lib/Support/FoldingSet.cpp
parentf344d83d3956255382b43690a147e1ce26b9fcd8 (diff)
Add an API for strings with possible NULLs in the middle. Refactor the other
two AddString methods to use it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64005 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/FoldingSet.cpp')
-rw-r--r--lib/Support/FoldingSet.cpp45
1 files changed, 8 insertions, 37 deletions
diff --git a/lib/Support/FoldingSet.cpp b/lib/Support/FoldingSet.cpp
index 3a1a0cd842..41c730e3e1 100644
--- a/lib/Support/FoldingSet.cpp
+++ b/lib/Support/FoldingSet.cpp
@@ -62,8 +62,8 @@ void FoldingSetNodeID::AddInteger(unsigned long long I) {
Bits.push_back(unsigned(I >> 32));
}
-void FoldingSetNodeID::AddString(const char *String) {
- unsigned Size = static_cast<unsigned>(strlen(String));
+void FoldingSetNodeID::AddString(const char *String, const char *End) {
+ unsigned Size = static_cast<unsigned>(End - String);
Bits.push_back(Size);
if (!Size) return;
@@ -77,7 +77,7 @@ void FoldingSetNodeID::AddString(const char *String) {
Pos = (Units + 1) * 4;
} else {
// Otherwise do it the hard way.
- for ( Pos += 4; Pos <= Size; Pos += 4) {
+ for (Pos += 4; Pos <= Size; Pos += 4) {
unsigned V = ((unsigned char)String[Pos - 4] << 24) |
((unsigned char)String[Pos - 3] << 16) |
((unsigned char)String[Pos - 2] << 8) |
@@ -99,41 +99,12 @@ void FoldingSetNodeID::AddString(const char *String) {
Bits.push_back(V);
}
-void FoldingSetNodeID::AddString(const std::string &String) {
- unsigned Size = static_cast<unsigned>(String.size());
- Bits.push_back(Size);
- if (!Size) return;
-
- unsigned Units = Size / 4;
- unsigned Pos = 0;
- const unsigned *Base = (const unsigned *)String.data();
-
- // If the string is aligned do a bulk transfer.
- if (!((intptr_t)Base & 3)) {
- Bits.append(Base, Base + Units);
- Pos = (Units + 1) * 4;
- } else {
- // Otherwise do it the hard way.
- for ( Pos += 4; Pos <= Size; Pos += 4) {
- unsigned V = ((unsigned char)String[Pos - 4] << 24) |
- ((unsigned char)String[Pos - 3] << 16) |
- ((unsigned char)String[Pos - 2] << 8) |
- (unsigned char)String[Pos - 1];
- Bits.push_back(V);
- }
- }
-
- // With the leftover bits.
- unsigned V = 0;
- // Pos will have overshot size by 4 - #bytes left over.
- switch (Pos - Size) {
- case 1: V = (V << 8) | (unsigned char)String[Size - 3]; // Fall thru.
- case 2: V = (V << 8) | (unsigned char)String[Size - 2]; // Fall thru.
- case 3: V = (V << 8) | (unsigned char)String[Size - 1]; break;
- default: return; // Nothing left.
- }
+void FoldingSetNodeID::AddString(const char *String) {
+ AddString(String, String + strlen(String));
+}
- Bits.push_back(V);
+void FoldingSetNodeID::AddString(const std::string &String) {
+ AddString(&*String.begin(), &*String.end());
}
/// ComputeHash - Compute a strong hash value for this FoldingSetNodeID, used to