| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 1 | //===-- Twine.cpp - Fast Temporary String Concatenation -------------------===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 |  | 
|  | 10 | #include "llvm/ADT/Twine.h" | 
| Daniel Dunbar | ea579e3 | 2009-08-19 18:09:47 +0000 | [diff] [blame] | 11 | #include "llvm/ADT/SmallString.h" | 
| David Greene | f92e671 | 2010-01-05 01:28:40 +0000 | [diff] [blame] | 12 | #include "llvm/Support/Debug.h" | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 13 | #include "llvm/Support/raw_ostream.h" | 
|  | 14 | using namespace llvm; | 
|  | 15 |  | 
|  | 16 | std::string Twine::str() const { | 
| Frits van Bommel | f8bf4c2 | 2011-07-15 11:05:37 +0000 | [diff] [blame] | 17 | // If we're storing only a std::string, just return it. | 
|  | 18 | if (LHSKind == StdStringKind && RHSKind == EmptyKind) | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 19 | return *LHS.stdString; | 
| Frits van Bommel | f8bf4c2 | 2011-07-15 11:05:37 +0000 | [diff] [blame] | 20 |  | 
|  | 21 | // Otherwise, flatten and copy the contents first. | 
| Daniel Dunbar | ea579e3 | 2009-08-19 18:09:47 +0000 | [diff] [blame] | 22 | SmallString<256> Vec; | 
| Benjamin Kramer | 2e06b93 | 2010-01-13 12:45:23 +0000 | [diff] [blame] | 23 | return toStringRef(Vec).str(); | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 24 | } | 
|  | 25 |  | 
|  | 26 | void Twine::toVector(SmallVectorImpl<char> &Out) const { | 
|  | 27 | raw_svector_ostream OS(Out); | 
|  | 28 | print(OS); | 
|  | 29 | } | 
|  | 30 |  | 
| Michael J. Spencer | f2cc828 | 2010-12-01 20:37:30 +0000 | [diff] [blame] | 31 | StringRef Twine::toNullTerminatedStringRef(SmallVectorImpl<char> &Out) const { | 
| Michael J. Spencer | 73e60d0 | 2010-12-03 05:42:25 +0000 | [diff] [blame] | 32 | if (isUnary()) { | 
|  | 33 | switch (getLHSKind()) { | 
|  | 34 | case CStringKind: | 
|  | 35 | // Already null terminated, yay! | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 36 | return StringRef(LHS.cString); | 
| Michael J. Spencer | 73e60d0 | 2010-12-03 05:42:25 +0000 | [diff] [blame] | 37 | case StdStringKind: { | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 38 | const std::string *str = LHS.stdString; | 
| Frits van Bommel | f8bf4c2 | 2011-07-15 11:05:37 +0000 | [diff] [blame] | 39 | return StringRef(str->c_str(), str->size()); | 
|  | 40 | } | 
| Michael J. Spencer | 73e60d0 | 2010-12-03 05:42:25 +0000 | [diff] [blame] | 41 | default: | 
|  | 42 | break; | 
|  | 43 | } | 
| Michael J. Spencer | f2cc828 | 2010-12-01 20:37:30 +0000 | [diff] [blame] | 44 | } | 
|  | 45 | toVector(Out); | 
|  | 46 | Out.push_back(0); | 
|  | 47 | Out.pop_back(); | 
|  | 48 | return StringRef(Out.data(), Out.size()); | 
|  | 49 | } | 
|  | 50 |  | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 51 | void Twine::printOneChild(raw_ostream &OS, Child Ptr, | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 52 | NodeKind Kind) const { | 
|  | 53 | switch (Kind) { | 
|  | 54 | case Twine::NullKind: break; | 
|  | 55 | case Twine::EmptyKind: break; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 56 | case Twine::TwineKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 57 | Ptr.twine->print(OS); | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 58 | break; | 
| Michael J. Spencer | f13f442 | 2010-11-26 04:16:08 +0000 | [diff] [blame] | 59 | case Twine::CStringKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 60 | OS << Ptr.cString; | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 61 | break; | 
|  | 62 | case Twine::StdStringKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 63 | OS << *Ptr.stdString; | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 64 | break; | 
|  | 65 | case Twine::StringRefKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 66 | OS << *Ptr.stringRef; | 
|  | 67 | break; | 
| Yaron Keren | 1ee89fc | 2015-03-17 09:51:17 +0000 | [diff] [blame] | 68 | case Twine::SmallStringKind: | 
|  | 69 | OS << *Ptr.smallString; | 
|  | 70 | break; | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 71 | case Twine::CharKind: | 
|  | 72 | OS << Ptr.character; | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 73 | break; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 74 | case Twine::DecUIKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 75 | OS << Ptr.decUI; | 
| Daniel Dunbar | e8b3236 | 2009-07-30 03:47:15 +0000 | [diff] [blame] | 76 | break; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 77 | case Twine::DecIKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 78 | OS << Ptr.decI; | 
| Daniel Dunbar | e8b3236 | 2009-07-30 03:47:15 +0000 | [diff] [blame] | 79 | break; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 80 | case Twine::DecULKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 81 | OS << *Ptr.decUL; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 82 | break; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 83 | case Twine::DecLKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 84 | OS << *Ptr.decL; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 85 | break; | 
|  | 86 | case Twine::DecULLKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 87 | OS << *Ptr.decULL; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 88 | break; | 
|  | 89 | case Twine::DecLLKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 90 | OS << *Ptr.decLL; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 91 | break; | 
|  | 92 | case Twine::UHexKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 93 | OS.write_hex(*Ptr.uHex); | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 94 | break; | 
|  | 95 | } | 
|  | 96 | } | 
|  | 97 |  | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 98 | void Twine::printOneChildRepr(raw_ostream &OS, Child Ptr, | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 99 | NodeKind Kind) const { | 
|  | 100 | switch (Kind) { | 
|  | 101 | case Twine::NullKind: | 
|  | 102 | OS << "null"; break; | 
|  | 103 | case Twine::EmptyKind: | 
|  | 104 | OS << "empty"; break; | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 105 | case Twine::TwineKind: | 
|  | 106 | OS << "rope:"; | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 107 | Ptr.twine->printRepr(OS); | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 108 | break; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 109 | case Twine::CStringKind: | 
|  | 110 | OS << "cstring:\"" | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 111 | << Ptr.cString << "\""; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 112 | break; | 
|  | 113 | case Twine::StdStringKind: | 
|  | 114 | OS << "std::string:\"" | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 115 | << Ptr.stdString << "\""; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 116 | break; | 
|  | 117 | case Twine::StringRefKind: | 
|  | 118 | OS << "stringref:\"" | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 119 | << Ptr.stringRef << "\""; | 
|  | 120 | break; | 
| NAKAMURA Takumi | fb3bd71 | 2015-05-25 01:43:23 +0000 | [diff] [blame] | 121 | case Twine::SmallStringKind: | 
| NAKAMURA Takumi | 5582a6a | 2015-05-25 01:43:34 +0000 | [diff] [blame] | 122 | OS << "smallstring:\"" << *Ptr.smallString << "\""; | 
| NAKAMURA Takumi | fb3bd71 | 2015-05-25 01:43:23 +0000 | [diff] [blame] | 123 | break; | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 124 | case Twine::CharKind: | 
|  | 125 | OS << "char:\"" << Ptr.character << "\""; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 126 | break; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 127 | case Twine::DecUIKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 128 | OS << "decUI:\"" << Ptr.decUI << "\""; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 129 | break; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 130 | case Twine::DecIKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 131 | OS << "decI:\"" << Ptr.decI << "\""; | 
| Daniel Dunbar | e8b3236 | 2009-07-30 03:47:15 +0000 | [diff] [blame] | 132 | break; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 133 | case Twine::DecULKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 134 | OS << "decUL:\"" << *Ptr.decUL << "\""; | 
| Daniel Dunbar | e8b3236 | 2009-07-30 03:47:15 +0000 | [diff] [blame] | 135 | break; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 136 | case Twine::DecLKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 137 | OS << "decL:\"" << *Ptr.decL << "\""; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 138 | break; | 
|  | 139 | case Twine::DecULLKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 140 | OS << "decULL:\"" << *Ptr.decULL << "\""; | 
| Daniel Dunbar | a91dd9b | 2009-07-30 21:15:14 +0000 | [diff] [blame] | 141 | break; | 
|  | 142 | case Twine::DecLLKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 143 | OS << "decLL:\"" << *Ptr.decLL << "\""; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 144 | break; | 
|  | 145 | case Twine::UHexKind: | 
| Chris Lattner | 9650f06 | 2011-07-24 20:44:30 +0000 | [diff] [blame] | 146 | OS << "uhex:\"" << Ptr.uHex << "\""; | 
| Daniel Dunbar | b49994a | 2009-07-29 07:08:44 +0000 | [diff] [blame] | 147 | break; | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 148 | } | 
|  | 149 | } | 
|  | 150 |  | 
|  | 151 | void Twine::print(raw_ostream &OS) const { | 
|  | 152 | printOneChild(OS, LHS, getLHSKind()); | 
|  | 153 | printOneChild(OS, RHS, getRHSKind()); | 
|  | 154 | } | 
|  | 155 |  | 
|  | 156 | void Twine::printRepr(raw_ostream &OS) const { | 
|  | 157 | OS << "(Twine "; | 
|  | 158 | printOneChildRepr(OS, LHS, getLHSKind()); | 
|  | 159 | OS << " "; | 
|  | 160 | printOneChildRepr(OS, RHS, getRHSKind()); | 
|  | 161 | OS << ")"; | 
|  | 162 | } | 
|  | 163 |  | 
|  | 164 | void Twine::dump() const { | 
| Eric Christopher | a13839f | 2014-02-26 23:27:16 +0000 | [diff] [blame] | 165 | print(dbgs()); | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 166 | } | 
|  | 167 |  | 
|  | 168 | void Twine::dumpRepr() const { | 
| Eric Christopher | a13839f | 2014-02-26 23:27:16 +0000 | [diff] [blame] | 169 | printRepr(dbgs()); | 
| Daniel Dunbar | afcf5b3 | 2009-07-24 07:04:27 +0000 | [diff] [blame] | 170 | } |