Twine.cpp revision 3f25ee080ca7c92ff735df29c78e7cfbd62c8cb6
12538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//===-- Twine.cpp - Fast Temporary String Concatenation -------------------===// 22538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// 32538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// The LLVM Compiler Infrastructure 42538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// 52538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// This file is distributed under the University of Illinois Open Source 62538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// License. See LICENSE.TXT for details. 72538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// 82538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//===----------------------------------------------------------------------===// 92538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 102538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include "llvm/ADT/Twine.h" 11b7be0e8afc5378c77c70e3c0fb6a03c74e551688Daniel Dunbar#include "llvm/ADT/SmallString.h" 122b965b05fcbce4a6c8bcc5570bb5a1deff2b0988David Greene#include "llvm/Support/Debug.h" 132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include "llvm/Support/raw_ostream.h" 142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarusing namespace llvm; 152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarstd::string Twine::str() const { 17331dbca73db75bbb87fcd81e2b8a68c9195de8b5Frits van Bommel // If we're storing only a std::string, just return it. 18331dbca73db75bbb87fcd81e2b8a68c9195de8b5Frits van Bommel if (LHSKind == StdStringKind && RHSKind == EmptyKind) 193f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner return *LHS.stdString; 20331dbca73db75bbb87fcd81e2b8a68c9195de8b5Frits van Bommel 21331dbca73db75bbb87fcd81e2b8a68c9195de8b5Frits van Bommel // Otherwise, flatten and copy the contents first. 22b7be0e8afc5378c77c70e3c0fb6a03c74e551688Daniel Dunbar SmallString<256> Vec; 23b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer return toStringRef(Vec).str(); 242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::toVector(SmallVectorImpl<char> &Out) const { 272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar raw_svector_ostream OS(Out); 282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar print(OS); 292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 31b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin KramerStringRef Twine::toStringRef(SmallVectorImpl<char> &Out) const { 32b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer if (isSingleStringRef()) 33b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer return getSingleStringRef(); 34b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer toVector(Out); 35b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer return StringRef(Out.data(), Out.size()); 36b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer} 37b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer 387dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. SpencerStringRef Twine::toNullTerminatedStringRef(SmallVectorImpl<char> &Out) const { 390dda5437f8044269a90acddad822866056a0c8b3Michael J. Spencer if (isUnary()) { 400dda5437f8044269a90acddad822866056a0c8b3Michael J. Spencer switch (getLHSKind()) { 410dda5437f8044269a90acddad822866056a0c8b3Michael J. Spencer case CStringKind: 420dda5437f8044269a90acddad822866056a0c8b3Michael J. Spencer // Already null terminated, yay! 433f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner return StringRef(LHS.cString); 440dda5437f8044269a90acddad822866056a0c8b3Michael J. Spencer case StdStringKind: { 453f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const std::string *str = LHS.stdString; 46331dbca73db75bbb87fcd81e2b8a68c9195de8b5Frits van Bommel return StringRef(str->c_str(), str->size()); 47331dbca73db75bbb87fcd81e2b8a68c9195de8b5Frits van Bommel } 480dda5437f8044269a90acddad822866056a0c8b3Michael J. Spencer default: 490dda5437f8044269a90acddad822866056a0c8b3Michael J. Spencer break; 500dda5437f8044269a90acddad822866056a0c8b3Michael J. Spencer } 517dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer } 527dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer toVector(Out); 537dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer Out.push_back(0); 547dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer Out.pop_back(); 557dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer return StringRef(Out.data(), Out.size()); 567dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer} 577dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer 583f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattnervoid Twine::printOneChild(raw_ostream &OS, Child Ptr, 592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind Kind) const { 602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar switch (Kind) { 612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::NullKind: break; 622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::EmptyKind: break; 63763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar case Twine::TwineKind: 643f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner Ptr.twine->print(OS); 65763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 66326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer case Twine::CStringKind: 673f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << Ptr.cString; 682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::StdStringKind: 703f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << *Ptr.stdString; 712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 722538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::StringRefKind: 733f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << *Ptr.stringRef; 743f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner break; 753f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner case Twine::CharKind: 763f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << Ptr.character; 772538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 782d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecUIKind: 793f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << Ptr.decUI; 800165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar break; 812d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecIKind: 823f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << Ptr.decI; 830165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar break; 842d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecULKind: 853f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << *Ptr.decUL; 86763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 872d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecLKind: 883f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << *Ptr.decL; 892d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar break; 902d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecULLKind: 913f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << *Ptr.decULL; 922d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar break; 932d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecLLKind: 943f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << *Ptr.decLL; 95763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 96763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar case Twine::UHexKind: 973f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS.write_hex(*Ptr.uHex); 982538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 992538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1002538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 1012538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1023f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattnervoid Twine::printOneChildRepr(raw_ostream &OS, Child Ptr, 1032538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind Kind) const { 1042538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar switch (Kind) { 1052538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::NullKind: 1062538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << "null"; break; 1072538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::EmptyKind: 1082538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << "empty"; break; 109763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar case Twine::TwineKind: 110763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar OS << "rope:"; 1113f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner Ptr.twine->printRepr(OS); 112763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 1132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::CStringKind: 114763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar OS << "cstring:\"" 1153f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner << Ptr.cString << "\""; 1162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 1172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::StdStringKind: 118763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar OS << "std::string:\"" 1193f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner << Ptr.stdString << "\""; 1202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 1212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::StringRefKind: 122763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar OS << "stringref:\"" 1233f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner << Ptr.stringRef << "\""; 1243f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner break; 1253f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner case Twine::CharKind: 1263f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << "char:\"" << Ptr.character << "\""; 1272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 1282d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecUIKind: 1293f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << "decUI:\"" << Ptr.decUI << "\""; 1302d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar break; 1312d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecIKind: 1323f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << "decI:\"" << Ptr.decI << "\""; 1332d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar break; 1342d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecULKind: 1353f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << "decUL:\"" << *Ptr.decUL << "\""; 1360165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar break; 1372d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecLKind: 1383f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << "decL:\"" << *Ptr.decL << "\""; 1390165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar break; 1402d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecULLKind: 1413f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << "decULL:\"" << *Ptr.decULL << "\""; 142763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 1432d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecLLKind: 1443f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << "decLL:\"" << *Ptr.decLL << "\""; 145763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 146763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar case Twine::UHexKind: 1473f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner OS << "uhex:\"" << Ptr.uHex << "\""; 1482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 1492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 1512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::print(raw_ostream &OS) const { 1532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar printOneChild(OS, LHS, getLHSKind()); 1542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar printOneChild(OS, RHS, getRHSKind()); 1552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 1562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::printRepr(raw_ostream &OS) const { 1582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << "(Twine "; 1592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar printOneChildRepr(OS, LHS, getLHSKind()); 1602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << " "; 1612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar printOneChildRepr(OS, RHS, getRHSKind()); 1622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << ")"; 1632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 1642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::dump() const { 1662b965b05fcbce4a6c8bcc5570bb5a1deff2b0988David Greene print(llvm::dbgs()); 1672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 1682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::dumpRepr() const { 1702b965b05fcbce4a6c8bcc5570bb5a1deff2b0988David Greene printRepr(llvm::dbgs()); 1712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 172