blob: 94464ffe4f0e96d93303d4d010f4e5afe6f4ac61 [file] [log] [blame]
Daniel Dunbar2538f7a2009-07-24 07:04:27 +00001//===-- 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"
Daniel Dunbarb7be0e82009-08-19 18:09:47 +000011#include "llvm/ADT/SmallString.h"
David Greene2b965b02010-01-05 01:28:40 +000012#include "llvm/Support/Debug.h"
Daniel Dunbar2538f7a2009-07-24 07:04:27 +000013#include "llvm/Support/raw_ostream.h"
14using namespace llvm;
15
16std::string Twine::str() const {
Daniel Dunbarb7be0e82009-08-19 18:09:47 +000017 SmallString<256> Vec;
18 toVector(Vec);
19 return std::string(Vec.begin(), Vec.end());
Daniel Dunbar2538f7a2009-07-24 07:04:27 +000020}
21
22void Twine::toVector(SmallVectorImpl<char> &Out) const {
23 raw_svector_ostream OS(Out);
24 print(OS);
25}
26
27void Twine::printOneChild(raw_ostream &OS, const void *Ptr,
28 NodeKind Kind) const {
29 switch (Kind) {
30 case Twine::NullKind: break;
31 case Twine::EmptyKind: break;
Daniel Dunbar763457e2009-07-29 07:08:44 +000032 case Twine::TwineKind:
33 static_cast<const Twine*>(Ptr)->print(OS);
34 break;
Daniel Dunbar2538f7a2009-07-24 07:04:27 +000035 case Twine::CStringKind:
36 OS << static_cast<const char*>(Ptr);
37 break;
38 case Twine::StdStringKind:
39 OS << *static_cast<const std::string*>(Ptr);
40 break;
41 case Twine::StringRefKind:
42 OS << *static_cast<const StringRef*>(Ptr);
43 break;
Daniel Dunbar2d8bc0f2009-07-30 21:15:14 +000044 case Twine::DecUIKind:
45 OS << *static_cast<const unsigned int*>(Ptr);
Daniel Dunbar0165a2c2009-07-30 03:47:15 +000046 break;
Daniel Dunbar2d8bc0f2009-07-30 21:15:14 +000047 case Twine::DecIKind:
48 OS << *static_cast<const int*>(Ptr);
Daniel Dunbar0165a2c2009-07-30 03:47:15 +000049 break;
Daniel Dunbar2d8bc0f2009-07-30 21:15:14 +000050 case Twine::DecULKind:
51 OS << *static_cast<const unsigned long*>(Ptr);
Daniel Dunbar763457e2009-07-29 07:08:44 +000052 break;
Daniel Dunbar2d8bc0f2009-07-30 21:15:14 +000053 case Twine::DecLKind:
54 OS << *static_cast<const long*>(Ptr);
55 break;
56 case Twine::DecULLKind:
57 OS << *static_cast<const unsigned long long*>(Ptr);
58 break;
59 case Twine::DecLLKind:
60 OS << *static_cast<const long long*>(Ptr);
Daniel Dunbar763457e2009-07-29 07:08:44 +000061 break;
62 case Twine::UHexKind:
Daniel Dunbar0fffbaf2009-07-30 18:30:19 +000063 OS.write_hex(*static_cast<const uint64_t*>(Ptr));
Daniel Dunbar2538f7a2009-07-24 07:04:27 +000064 break;
65 }
66}
67
68void Twine::printOneChildRepr(raw_ostream &OS, const void *Ptr,
69 NodeKind Kind) const {
70 switch (Kind) {
71 case Twine::NullKind:
72 OS << "null"; break;
73 case Twine::EmptyKind:
74 OS << "empty"; break;
Daniel Dunbar2538f7a2009-07-24 07:04:27 +000075 case Twine::TwineKind:
76 OS << "rope:";
77 static_cast<const Twine*>(Ptr)->printRepr(OS);
78 break;
Daniel Dunbar763457e2009-07-29 07:08:44 +000079 case Twine::CStringKind:
80 OS << "cstring:\""
81 << static_cast<const char*>(Ptr) << "\"";
82 break;
83 case Twine::StdStringKind:
84 OS << "std::string:\""
85 << static_cast<const std::string*>(Ptr) << "\"";
86 break;
87 case Twine::StringRefKind:
88 OS << "stringref:\""
89 << static_cast<const StringRef*>(Ptr) << "\"";
90 break;
Daniel Dunbar2d8bc0f2009-07-30 21:15:14 +000091 case Twine::DecUIKind:
92 OS << "decUI:\"" << *static_cast<const unsigned int*>(Ptr) << "\"";
Daniel Dunbar763457e2009-07-29 07:08:44 +000093 break;
Daniel Dunbar2d8bc0f2009-07-30 21:15:14 +000094 case Twine::DecIKind:
95 OS << "decI:\"" << *static_cast<const int*>(Ptr) << "\"";
Daniel Dunbar0165a2c2009-07-30 03:47:15 +000096 break;
Daniel Dunbar2d8bc0f2009-07-30 21:15:14 +000097 case Twine::DecULKind:
98 OS << "decUL:\"" << *static_cast<const unsigned long*>(Ptr) << "\"";
Daniel Dunbar0165a2c2009-07-30 03:47:15 +000099 break;
Daniel Dunbar2d8bc0f2009-07-30 21:15:14 +0000100 case Twine::DecLKind:
101 OS << "decL:\"" << *static_cast<const long*>(Ptr) << "\"";
102 break;
103 case Twine::DecULLKind:
104 OS << "decULL:\"" << *static_cast<const unsigned long long*>(Ptr) << "\"";
105 break;
106 case Twine::DecLLKind:
107 OS << "decLL:\"" << *static_cast<const long long*>(Ptr) << "\"";
Daniel Dunbar763457e2009-07-29 07:08:44 +0000108 break;
109 case Twine::UHexKind:
Daniel Dunbar2d8bc0f2009-07-30 21:15:14 +0000110 OS << "uhex:\"" << static_cast<const uint64_t*>(Ptr) << "\"";
Daniel Dunbar763457e2009-07-29 07:08:44 +0000111 break;
Daniel Dunbar2538f7a2009-07-24 07:04:27 +0000112 }
113}
114
115void Twine::print(raw_ostream &OS) const {
116 printOneChild(OS, LHS, getLHSKind());
117 printOneChild(OS, RHS, getRHSKind());
118}
119
120void Twine::printRepr(raw_ostream &OS) const {
121 OS << "(Twine ";
122 printOneChildRepr(OS, LHS, getLHSKind());
123 OS << " ";
124 printOneChildRepr(OS, RHS, getRHSKind());
125 OS << ")";
126}
127
128void Twine::dump() const {
David Greene2b965b02010-01-05 01:28:40 +0000129 print(llvm::dbgs());
Daniel Dunbar2538f7a2009-07-24 07:04:27 +0000130}
131
132void Twine::dumpRepr() const {
David Greene2b965b02010-01-05 01:28:40 +0000133 printRepr(llvm::dbgs());
Daniel Dunbar2538f7a2009-07-24 07:04:27 +0000134}