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