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