Twine.h revision b357e06f672996400343d38b08014a5b6a7d5b2d
12538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//===-- Twine.h - Fast Temporary String Concatenation -----------*- C++ -*-===// 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#ifndef LLVM_ADT_TWINE_H 112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#define LLVM_ADT_TWINE_H 122538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include "llvm/ADT/StringRef.h" 148b67f774e9c38b7718b2b300b628388f966df4e0Chandler Carruth#include "llvm/System/DataTypes.h" 152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include <cassert> 162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include <string> 172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarnamespace llvm { 192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar template <typename T> 202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar class SmallVectorImpl; 212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar class StringRef; 222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar class raw_ostream; 232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Twine - A lightweight data structure for efficiently representing the 252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concatenation of temporary values as strings. 262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// A Twine is a kind of rope, it represents a concatenated string using a 282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// binary-tree, where the string is the preorder of the nodes. Since the 292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Twine can be efficiently rendered into a buffer when its result is used, 302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// it avoids the cost of generating temporary values for intermediate string 312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// results -- particularly in cases when the Twine result is never 322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// required. By explicitly tracking the type of leaf nodes, we can also avoid 332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// the creation of temporary strings for conversions operations (such as 342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// appending an integer to a string). 352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 362538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// A Twine is not intended for use directly and should not be stored, its 372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// implementation relies on the ability to store pointers to temporary stack 382538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// objects which may be deallocated at the end of a statement. Twines should 392538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// only be used accepted as const references in arguments, when an API wishes 402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// to accept possibly-concatenated strings. 412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Twines support a special 'null' value, which always concatenates to form 432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// itself, and renders as an empty string. This can be returned from APIs to 442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// effectively nullify any concatenations performed on the result. 452538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// \b Implementation \n 472538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Given the nature of a Twine, it is not possible for the Twine's 492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concatenation method to construct interior nodes; the result must be 502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// represented inside the returned value. For this reason a Twine object 512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// actually holds two values, the left- and right-hand sides of a 522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concatenation. We also have nullary Twine objects, which are effectively 532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// sentinel values that represent empty strings. 542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Thus, a Twine can effectively have zero, one, or two children. The \see 562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isNullary(), \see isUnary(), and \see isBinary() predicates exist for 572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// testing the number of children. 582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// We maintain a number of invariants on Twine objects (FIXME: Why): 602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// - Nullary twines are always represented with their Kind on the left-hand 612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// side, and the Empty kind on the right-hand side. 622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// - Unary twines are always represented with the value on the left-hand 632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// side, and the Empty kind on the right-hand side. 642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// - If a Twine has another Twine as a child, that child should always be 652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// binary (otherwise it could have been folded into the parent). 662538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// These invariants are check by \see isValid(). 682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// \b Efficiency Considerations \n 702538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// The Twine is designed to yield efficient and small code for common 722538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// situations. For this reason, the concat() method is inlined so that 732538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concatenations of leaf nodes can be optimized into stores directly into a 742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// single stack allocated object. 752538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 762538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// In practice, not all compilers can be trusted to optimize concat() fully, 772538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// so we provide two additional methods (and accompanying operator+ 782538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// overloads) to guarantee that particularly important cases (cstring plus 792538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// StringRef) codegen as desired. 802538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar class Twine { 812538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// NodeKind - Represent the type of an argument. 822538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar enum NodeKind { 832538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// An empty string; the result of concatenating anything with it is also 842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// empty. 852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NullKind, 862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// The empty string. 882538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar EmptyKind, 892538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 90763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// A pointer to a Twine instance. 91763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar TwineKind, 92763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 932538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// A pointer to a C string instance. 942538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar CStringKind, 952538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 962538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// A pointer to an std::string instance. 972538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar StdStringKind, 982538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 992538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// A pointer to a StringRef instance. 1002538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar StringRefKind, 1012538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1022d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to an unsigned int value, to render as an unsigned decimal 103763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// integer. 1042d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecUIKind, 105763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 1062d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to an int value, to render as a signed decimal integer. 1072d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecIKind, 1080165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 1092d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to an unsigned long value, to render as an unsigned decimal 110763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// integer. 1112d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecULKind, 112763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 1132d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to a long value, to render as a signed decimal integer. 1142d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecLKind, 1152d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar 1162d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to an unsigned long long value, to render as an unsigned 1172d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// decimal integer. 1182d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecULLKind, 1192d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar 1202d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to a long long value, to render as a signed decimal integer. 1212d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecLLKind, 1220165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 1230165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// A pointer to a uint64_t value, to render as an unsigned hexadecimal 1240165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// integer. 1250165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar UHexKind 1262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar }; 1272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar private: 1292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// LHS - The prefix in the concatenation, which may be uninitialized for 1302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Null or Empty kinds. 1312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar const void *LHS; 1322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// RHS - The suffix in the concatenation, which may be uninitialized for 1332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Null or Empty kinds. 1342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar const void *RHS; 1352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// LHSKind - The NodeKind of the left hand side, \see getLHSKind(). 136b80077aae9fe51af78e6e25e26d09bf8efcd8244Daniel Dunbar unsigned char LHSKind; 1372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// RHSKind - The NodeKind of the left hand side, \see getLHSKind(). 138b80077aae9fe51af78e6e25e26d09bf8efcd8244Daniel Dunbar unsigned char RHSKind; 1392538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar private: 1412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct a nullary twine; the kind must be NullKind or EmptyKind. 1422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar explicit Twine(NodeKind Kind) 1432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHSKind(Kind), RHSKind(EmptyKind) { 1442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isNullary() && "Invalid kind!"); 1452538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1472538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct a binary twine. 1482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar explicit Twine(const Twine &_LHS, const Twine &_RHS) 1492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(&_LHS), RHS(&_RHS), LHSKind(TwineKind), RHSKind(TwineKind) { 1502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 1512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct a twine from explicit values. 154050578fb4a006d7a183662f83fc22f7c78475605Daniel Dunbar explicit Twine(const void *_LHS, NodeKind _LHSKind, 155050578fb4a006d7a183662f83fc22f7c78475605Daniel Dunbar const void *_RHS, NodeKind _RHSKind) 1562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(_LHS), RHS(_RHS), LHSKind(_LHSKind), RHSKind(_RHSKind) { 1572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 1582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isNull - Check for the null twine. 1612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isNull() const { 1622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getLHSKind() == NullKind; 1632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isEmpty - Check for the empty twine. 1662538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isEmpty() const { 1672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getLHSKind() == EmptyKind; 1682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1702538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isNullary - Check if this is a nullary twine (null or empty). 1712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isNullary() const { 1722538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return isNull() || isEmpty(); 1732538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1752538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isUnary - Check if this is a unary twine. 1762538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isUnary() const { 1772538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getRHSKind() == EmptyKind && !isNullary(); 1782538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1792538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1802538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isBinary - Check if this is a binary twine. 1812538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isBinary() const { 1822538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getLHSKind() != NullKind && getRHSKind() != EmptyKind; 1832538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isValid - Check if this is a valid twine (satisfying the invariants on 1862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// order and number of arguments). 1872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isValid() const { 1882538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Nullary twines always have Empty on the RHS. 1892538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isNullary() && getRHSKind() != EmptyKind) 1902538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 1912538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1922538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Null should never appear on the RHS. 1932538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getRHSKind() == NullKind) 1942538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 1952538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1962538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // The RHS cannot be non-empty if the LHS is empty. 1972538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getRHSKind() != EmptyKind && getLHSKind() == EmptyKind) 1982538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 1992538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2002538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // A twine child should always be binary. 2012538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getLHSKind() == TwineKind && 2022538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar !static_cast<const Twine*>(LHS)->isBinary()) 2032538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 2042538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getRHSKind() == TwineKind && 2052538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar !static_cast<const Twine*>(RHS)->isBinary()) 2062538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 2072538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2082538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return true; 2092538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2102538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// getLHSKind - Get the NodeKind of the left-hand side. 212b80077aae9fe51af78e6e25e26d09bf8efcd8244Daniel Dunbar NodeKind getLHSKind() const { return (NodeKind) LHSKind; } 2132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// getRHSKind - Get the NodeKind of the left-hand side. 215b80077aae9fe51af78e6e25e26d09bf8efcd8244Daniel Dunbar NodeKind getRHSKind() const { return (NodeKind) RHSKind; } 2162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// printOneChild - Print one child from a twine. 2182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void printOneChild(raw_ostream &OS, const void *Ptr, NodeKind Kind) const; 2192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// printOneChildRepr - Print the representation of one child from a twine. 2212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void printOneChildRepr(raw_ostream &OS, const void *Ptr, 2222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind Kind) const; 2232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar public: 2252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name Constructors 2262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 2272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from an empty string. 2292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine() : LHSKind(EmptyKind), RHSKind(EmptyKind) { 2302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from a C string. 2342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 2352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// We take care here to optimize "" into the empty twine -- this will be 2362538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// optimized out for string constants. This allows Twine arguments have 2372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// default "" values, without introducing unnecessary string constants. 2382538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const char *Str) 2392538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : RHSKind(EmptyKind) { 2402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (Str[0] != '\0') { 2412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar LHS = Str; 2422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar LHSKind = CStringKind; 2432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } else 2442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar LHSKind = EmptyKind; 2452538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2472538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from an std::string. 2502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const std::string &Str) 2512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(&Str), LHSKind(StdStringKind), RHSKind(EmptyKind) { 2522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from a StringRef. 2562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const StringRef &Str) 2572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(&Str), LHSKind(StringRefKind), RHSKind(EmptyKind) { 2582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2610165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as an unsigned decimal integer. 2622d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar explicit Twine(const unsigned int &Val) 2632d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar : LHS(&Val), LHSKind(DecUIKind), RHSKind(EmptyKind) { 2642d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar } 2652d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar 2662d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// Construct a twine to print \arg Val as a signed decimal integer. 2672d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar explicit Twine(const int &Val) 2682d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar : LHS(&Val), LHSKind(DecIKind), RHSKind(EmptyKind) { 2692d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar } 2702d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar 2712d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// Construct a twine to print \arg Val as an unsigned decimal integer. 2722d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar explicit Twine(const unsigned long &Val) 2732d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar : LHS(&Val), LHSKind(DecULKind), RHSKind(EmptyKind) { 2740165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 2750165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 2760165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as a signed decimal integer. 2772d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar explicit Twine(const long &Val) 2782d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar : LHS(&Val), LHSKind(DecLKind), RHSKind(EmptyKind) { 2790165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 2800165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 2810165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as an unsigned decimal integer. 2822d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar explicit Twine(const unsigned long long &Val) 2832d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar : LHS(&Val), LHSKind(DecULLKind), RHSKind(EmptyKind) { 2840165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 2850165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 2860165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as a signed decimal integer. 2872d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar explicit Twine(const long long &Val) 2882d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar : LHS(&Val), LHSKind(DecLLKind), RHSKind(EmptyKind) { 2890165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 2900165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 2912538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // FIXME: Unfortunately, to make sure this is as efficient as possible we 2922538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // need extra binary constructors from particular types. We can't rely on 2932538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // the compiler to be smart enough to fold operator+()/concat() down to the 2942538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // right thing. Yet. 2952538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2962538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct as the concatenation of a C string and a StringRef. 2972538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const char *_LHS, const StringRef &_RHS) 2982538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(_LHS), RHS(&_RHS), LHSKind(CStringKind), RHSKind(StringRefKind) { 2992538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 3002538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3012538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3022538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct as the concatenation of a StringRef and a C string. 3032538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const StringRef &_LHS, const char *_RHS) 3042538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(&_LHS), RHS(_RHS), LHSKind(StringRefKind), RHSKind(CStringKind) { 3052538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 3062538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3072538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 308763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// Create a 'null' string, which is an empty string that always 309763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// concatenates to form another empty string. 310763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar static Twine createNull() { 311763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar return Twine(NullKind); 312763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar } 313763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 314763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// @} 315763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// @name Numeric Conversions 316763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// @{ 317763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 318763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar // Construct a twine to print \arg Val as an unsigned hexadecimal integer. 319763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar static Twine utohexstr(const uint64_t &Val) { 320763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar return Twine(&Val, UHexKind, 0, EmptyKind); 321763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar } 322763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 3232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 3245149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// @name Predicate Operations 3255149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// @{ 3265149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar 3275149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// isTriviallyEmpty - Check if this twine is trivially empty; a false 3285149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// return value does not necessarily mean the twine is empty. 3295149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar bool isTriviallyEmpty() const { 3305149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar return isNullary(); 3315149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar } 332bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner 333bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner /// isSingleStringRef - Return true if this twine can be dynamically 334bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner /// accessed as a single StringRef value with getSingleStringRef(). 335bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner bool isSingleStringRef() const { 336bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner if (getRHSKind() != EmptyKind) return false; 337bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner 338bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner switch (getLHSKind()) { 339bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case EmptyKind: 340bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case CStringKind: 341bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case StdStringKind: 342bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case StringRefKind: 343bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner return true; 344bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner default: 345bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner return false; 346bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner } 347bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner } 3485149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar 3495149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// @} 3502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name String Operations 3512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 3522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar Twine concat(const Twine &Suffix) const; 3542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 3562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name Output & Conversion. 3572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 3582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// str - Return the twine contents as a std::string. 3602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar std::string str() const; 3612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// toVector - Write the concatenated string into the given SmallString or 3632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// SmallVector. 3642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void toVector(SmallVectorImpl<char> &Out) const; 3652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 366bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner /// getSingleStringRef - This returns the twine as a single StringRef. This 367bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner /// method is only valid if isSingleStringRef() is true. 368bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner StringRef getSingleStringRef() const { 369bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner assert(isSingleStringRef() &&"This cannot be had as a single stringref!"); 370bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner switch (getLHSKind()) { 371bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner default: assert(0 && "Out of sync with isSingleStringRef"); 372bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case EmptyKind: return StringRef(); 373bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case CStringKind: return StringRef((const char*)LHS); 374bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case StdStringKind: return StringRef(*(const std::string*)LHS); 375bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case StringRefKind: return *(const StringRef*)LHS; 376bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner } 377bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner } 378b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer 379b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer /// toStringRef - This returns the twine as a single StringRef if it can be 380b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer /// represented as such. Otherwise the twine is written into the given 381b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer /// SmallVector and a StringRef to the SmallVector's data is returned. 382b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer StringRef toStringRef(SmallVectorImpl<char> &Out) const; 383b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer 3842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// print - Write the concatenated string represented by this twine to the 3852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// stream \arg OS. 3862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void print(raw_ostream &OS) const; 3872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3882538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// dump - Dump the concatenated string represented by this twine to stderr. 3892538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void dump() const; 3902538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3912538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// print - Write the representation of this twine to the stream \arg OS. 3922538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void printRepr(raw_ostream &OS) const; 3932538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3942538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// dumpRepr - Dump the representation of this twine to stderr. 3952538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void dumpRepr() const; 3962538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3972538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 3982538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar }; 3992538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4002538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name Twine Inline Implementations 4012538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 4022538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4032538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine Twine::concat(const Twine &Suffix) const { 4042538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concatenation with null is null. 4052538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isNull() || Suffix.isNull()) 4062538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(NullKind); 4072538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4082538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concatenation with empty yields the other side. 4092538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isEmpty()) 4102538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Suffix; 4112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (Suffix.isEmpty()) 4122538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return *this; 4132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Otherwise we need to create a new node, taking care to fold in unary 4152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // twines. 4162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar const void *NewLHS = this, *NewRHS = &Suffix; 4172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind NewLHSKind = TwineKind, NewRHSKind = TwineKind; 4182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isUnary()) { 4192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewLHS = LHS; 4202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewLHSKind = getLHSKind(); 4212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (Suffix.isUnary()) { 4232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewRHS = Suffix.LHS; 4242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewRHSKind = Suffix.getLHSKind(); 4252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(NewLHS, NewLHSKind, NewRHS, NewRHSKind); 4282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine operator+(const Twine &LHS, const Twine &RHS) { 4312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return LHS.concat(RHS); 4322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Additional overload to guarantee simplified codegen; this is equivalent to 4352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concat(). 4362538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine operator+(const char *LHS, const StringRef &RHS) { 4382538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(LHS, RHS); 4392538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Additional overload to guarantee simplified codegen; this is equivalent to 4422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concat(). 4432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine operator+(const StringRef &LHS, const char *RHS) { 4452538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(LHS, RHS); 4462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4472538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline raw_ostream &operator<<(raw_ostream &OS, const Twine &RHS) { 4492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar RHS.print(OS); 4502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return OS; 4512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 4542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 4552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#endif 457