Twine.cpp revision b7be0e8afc5378c77c70e3c0fb6a03c74e551688
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" 11#include "llvm/ADT/SmallString.h" 12#include "llvm/Support/raw_ostream.h" 13using namespace llvm; 14 15std::string Twine::str() const { 16 SmallString<256> Vec; 17 toVector(Vec); 18 return std::string(Vec.begin(), Vec.end()); 19} 20 21void Twine::toVector(SmallVectorImpl<char> &Out) const { 22 raw_svector_ostream OS(Out); 23 print(OS); 24} 25 26void Twine::printOneChild(raw_ostream &OS, const void *Ptr, 27 NodeKind Kind) const { 28 switch (Kind) { 29 case Twine::NullKind: break; 30 case Twine::EmptyKind: break; 31 case Twine::TwineKind: 32 static_cast<const Twine*>(Ptr)->print(OS); 33 break; 34 case Twine::CStringKind: 35 OS << static_cast<const char*>(Ptr); 36 break; 37 case Twine::StdStringKind: 38 OS << *static_cast<const std::string*>(Ptr); 39 break; 40 case Twine::StringRefKind: 41 OS << *static_cast<const StringRef*>(Ptr); 42 break; 43 case Twine::DecUIKind: 44 OS << *static_cast<const unsigned int*>(Ptr); 45 break; 46 case Twine::DecIKind: 47 OS << *static_cast<const int*>(Ptr); 48 break; 49 case Twine::DecULKind: 50 OS << *static_cast<const unsigned long*>(Ptr); 51 break; 52 case Twine::DecLKind: 53 OS << *static_cast<const long*>(Ptr); 54 break; 55 case Twine::DecULLKind: 56 OS << *static_cast<const unsigned long long*>(Ptr); 57 break; 58 case Twine::DecLLKind: 59 OS << *static_cast<const long long*>(Ptr); 60 break; 61 case Twine::UHexKind: 62 OS.write_hex(*static_cast<const uint64_t*>(Ptr)); 63 break; 64 } 65} 66 67void Twine::printOneChildRepr(raw_ostream &OS, const void *Ptr, 68 NodeKind Kind) const { 69 switch (Kind) { 70 case Twine::NullKind: 71 OS << "null"; break; 72 case Twine::EmptyKind: 73 OS << "empty"; break; 74 case Twine::TwineKind: 75 OS << "rope:"; 76 static_cast<const Twine*>(Ptr)->printRepr(OS); 77 break; 78 case Twine::CStringKind: 79 OS << "cstring:\"" 80 << static_cast<const char*>(Ptr) << "\""; 81 break; 82 case Twine::StdStringKind: 83 OS << "std::string:\"" 84 << static_cast<const std::string*>(Ptr) << "\""; 85 break; 86 case Twine::StringRefKind: 87 OS << "stringref:\"" 88 << static_cast<const StringRef*>(Ptr) << "\""; 89 break; 90 case Twine::DecUIKind: 91 OS << "decUI:\"" << *static_cast<const unsigned int*>(Ptr) << "\""; 92 break; 93 case Twine::DecIKind: 94 OS << "decI:\"" << *static_cast<const int*>(Ptr) << "\""; 95 break; 96 case Twine::DecULKind: 97 OS << "decUL:\"" << *static_cast<const unsigned long*>(Ptr) << "\""; 98 break; 99 case Twine::DecLKind: 100 OS << "decL:\"" << *static_cast<const long*>(Ptr) << "\""; 101 break; 102 case Twine::DecULLKind: 103 OS << "decULL:\"" << *static_cast<const unsigned long long*>(Ptr) << "\""; 104 break; 105 case Twine::DecLLKind: 106 OS << "decLL:\"" << *static_cast<const long long*>(Ptr) << "\""; 107 break; 108 case Twine::UHexKind: 109 OS << "uhex:\"" << static_cast<const uint64_t*>(Ptr) << "\""; 110 break; 111 } 112} 113 114void Twine::print(raw_ostream &OS) const { 115 printOneChild(OS, LHS, getLHSKind()); 116 printOneChild(OS, RHS, getRHSKind()); 117} 118 119void Twine::printRepr(raw_ostream &OS) const { 120 OS << "(Twine "; 121 printOneChildRepr(OS, LHS, getLHSKind()); 122 OS << " "; 123 printOneChildRepr(OS, RHS, getRHSKind()); 124 OS << ")"; 125} 126 127void Twine::dump() const { 128 print(llvm::errs()); 129} 130 131void Twine::dumpRepr() const { 132 printRepr(llvm::errs()); 133} 134