Twine.cpp revision 2b965b05fcbce4a6c8bcc5570bb5a1deff2b0988
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 { 17b7be0e8afc5378c77c70e3c0fb6a03c74e551688Daniel Dunbar SmallString<256> Vec; 18b7be0e8afc5378c77c70e3c0fb6a03c74e551688Daniel Dunbar toVector(Vec); 19b7be0e8afc5378c77c70e3c0fb6a03c74e551688Daniel Dunbar return std::string(Vec.begin(), Vec.end()); 202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::toVector(SmallVectorImpl<char> &Out) const { 232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar raw_svector_ostream OS(Out); 242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar print(OS); 252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::printOneChild(raw_ostream &OS, const void *Ptr, 282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind Kind) const { 292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar switch (Kind) { 302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::NullKind: break; 312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::EmptyKind: break; 32763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar case Twine::TwineKind: 33763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar static_cast<const Twine*>(Ptr)->print(OS); 34763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::CStringKind: 362538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << static_cast<const char*>(Ptr); 372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 382538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::StdStringKind: 392538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << *static_cast<const std::string*>(Ptr); 402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::StringRefKind: 422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << *static_cast<const StringRef*>(Ptr); 432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 442d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecUIKind: 452d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << *static_cast<const unsigned int*>(Ptr); 460165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar break; 472d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecIKind: 482d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << *static_cast<const int*>(Ptr); 490165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar break; 502d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecULKind: 512d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << *static_cast<const unsigned long*>(Ptr); 52763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 532d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecLKind: 542d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << *static_cast<const long*>(Ptr); 552d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar break; 562d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecULLKind: 572d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << *static_cast<const unsigned long long*>(Ptr); 582d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar break; 592d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecLLKind: 602d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << *static_cast<const long long*>(Ptr); 61763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 62763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar case Twine::UHexKind: 630fffbafa9609e0e289ff3120ab9e23d244c1dbc0Daniel Dunbar OS.write_hex(*static_cast<const uint64_t*>(Ptr)); 642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 662538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::printOneChildRepr(raw_ostream &OS, const void *Ptr, 692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind Kind) const { 702538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar switch (Kind) { 712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::NullKind: 722538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << "null"; break; 732538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::EmptyKind: 742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << "empty"; break; 75763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar case Twine::TwineKind: 76763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar OS << "rope:"; 77763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar static_cast<const Twine*>(Ptr)->printRepr(OS); 78763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 792538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::CStringKind: 80763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar OS << "cstring:\"" 81763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar << static_cast<const char*>(Ptr) << "\""; 822538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 832538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::StdStringKind: 84763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar OS << "std::string:\"" 85763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar << static_cast<const std::string*>(Ptr) << "\""; 862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar case Twine::StringRefKind: 88763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar OS << "stringref:\"" 89763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar << static_cast<const StringRef*>(Ptr) << "\""; 902538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 912d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecUIKind: 922d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << "decUI:\"" << *static_cast<const unsigned int*>(Ptr) << "\""; 932d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar break; 942d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecIKind: 952d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << "decI:\"" << *static_cast<const int*>(Ptr) << "\""; 962d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar break; 972d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecULKind: 982d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << "decUL:\"" << *static_cast<const unsigned long*>(Ptr) << "\""; 990165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar break; 1002d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecLKind: 1012d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << "decL:\"" << *static_cast<const long*>(Ptr) << "\""; 1020165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar break; 1032d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecULLKind: 1042d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << "decULL:\"" << *static_cast<const unsigned long long*>(Ptr) << "\""; 105763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 1062d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar case Twine::DecLLKind: 1072d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << "decLL:\"" << *static_cast<const long long*>(Ptr) << "\""; 108763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar break; 109763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar case Twine::UHexKind: 1102d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar OS << "uhex:\"" << static_cast<const uint64_t*>(Ptr) << "\""; 1112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar break; 1122538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 1142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::print(raw_ostream &OS) const { 1162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar printOneChild(OS, LHS, getLHSKind()); 1172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar printOneChild(OS, RHS, getRHSKind()); 1182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 1192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::printRepr(raw_ostream &OS) const { 1212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << "(Twine "; 1222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar printOneChildRepr(OS, LHS, getLHSKind()); 1232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << " "; 1242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar printOneChildRepr(OS, RHS, getRHSKind()); 1252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar OS << ")"; 1262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 1272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::dump() const { 1292b965b05fcbce4a6c8bcc5570bb5a1deff2b0988David Greene print(llvm::dbgs()); 1302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 1312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarvoid Twine::dumpRepr() const { 1332b965b05fcbce4a6c8bcc5570bb5a1deff2b0988David Greene printRepr(llvm::dbgs()); 1342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 135