diff options
author | Owen Anderson <resistor@mac.com> | 2008-07-01 23:49:59 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-07-01 23:49:59 +0000 |
commit | 72e61b85017286418ca5266c2ff7b88782e2fe00 (patch) | |
tree | 784ba87f8e823d2c4bce49917abdb0ea39a8889c /lib/Support | |
parent | aa8f8889a861aadc061aec71fb7ed7f628848a2d (diff) | |
download | external_llvm-72e61b85017286418ca5266c2ff7b88782e2fe00.zip external_llvm-72e61b85017286418ca5266c2ff7b88782e2fe00.tar.gz external_llvm-72e61b85017286418ca5266c2ff7b88782e2fe00.tar.bz2 |
Add a version of AddString that takes a const char* so we can avoid extraneous
conversions to std::string.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52995 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r-- | lib/Support/FoldingSet.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/Support/FoldingSet.cpp b/lib/Support/FoldingSet.cpp index 8014043..5f1de4a 100644 --- a/lib/Support/FoldingSet.cpp +++ b/lib/Support/FoldingSet.cpp @@ -57,6 +57,44 @@ void FoldingSetNodeID::AddFloat(float F) { void FoldingSetNodeID::AddDouble(double D) { AddInteger(DoubleToBits(D)); } + +void FoldingSetNodeID::AddString(const char *String) { + unsigned Size = static_cast<unsigned>(strlen(String)); + Bits.push_back(Size); + if (!Size) return; + + unsigned Units = Size / 4; + unsigned Pos = 0; + const unsigned *Base = (const unsigned *)String; + + // 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. + } + + Bits.push_back(V); +} + void FoldingSetNodeID::AddString(const std::string &String) { unsigned Size = static_cast<unsigned>(String.size()); Bits.push_back(Size); |