Twine.h revision 0165a2ca897598bb95baec031362921565e24f2b
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" 1437e3fe9ad7d7cb350cbbce0695c68d652d624bb4Benjamin Kramer#include "llvm/Support/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 102763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// A pointer to a uint64_t value, to render as an unsigned decimal 103763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// integer. 1040165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar UDec32Kind, 105763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 1060165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// A pointer to a uint64_t value, to render as a signed decimal integer. 1070165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar SDec32Kind, 1080165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 1090165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// A pointer to a uint64_t value, to render as an unsigned decimal 110763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// integer. 1110165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar UDec64Kind, 112763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 113763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// A pointer to a uint64_t value, to render as a signed decimal integer. 1140165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar SDec64Kind, 1150165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 1160165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// A pointer to a uint64_t value, to render as an unsigned hexadecimal 1170165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// integer. 1180165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar UHexKind 1192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar }; 1202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar private: 1222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// LHS - The prefix in the concatenation, which may be uninitialized for 1232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Null or Empty kinds. 1242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar const void *LHS; 1252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// RHS - The suffix in the concatenation, which may be uninitialized for 1262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Null or Empty kinds. 1272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar const void *RHS; 1282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// LHSKind - The NodeKind of the left hand side, \see getLHSKind(). 1292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind LHSKind : 8; 1302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// RHSKind - The NodeKind of the left hand side, \see getLHSKind(). 1312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind RHSKind : 8; 1322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar private: 1342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct a nullary twine; the kind must be NullKind or EmptyKind. 1352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar explicit Twine(NodeKind Kind) 1362538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHSKind(Kind), RHSKind(EmptyKind) { 1372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isNullary() && "Invalid kind!"); 1382538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1392538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct a binary twine. 1412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar explicit Twine(const Twine &_LHS, const Twine &_RHS) 1422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(&_LHS), RHS(&_RHS), LHSKind(TwineKind), RHSKind(TwineKind) { 1432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 1442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1452538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct a twine from explicit values. 147050578fb4a006d7a183662f83fc22f7c78475605Daniel Dunbar explicit Twine(const void *_LHS, NodeKind _LHSKind, 148050578fb4a006d7a183662f83fc22f7c78475605Daniel Dunbar const void *_RHS, NodeKind _RHSKind) 1492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(_LHS), RHS(_RHS), LHSKind(_LHSKind), RHSKind(_RHSKind) { 1502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 1512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isNull - Check for the null twine. 1542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isNull() const { 1552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getLHSKind() == NullKind; 1562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isEmpty - Check for the empty twine. 1592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isEmpty() const { 1602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getLHSKind() == EmptyKind; 1612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isNullary - Check if this is a nullary twine (null or empty). 1642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isNullary() const { 1652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return isNull() || isEmpty(); 1662538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isUnary - Check if this is a unary twine. 1692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isUnary() const { 1702538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getRHSKind() == EmptyKind && !isNullary(); 1712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1722538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1732538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isBinary - Check if this is a binary twine. 1742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isBinary() const { 1752538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getLHSKind() != NullKind && getRHSKind() != EmptyKind; 1762538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1772538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1782538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isValid - Check if this is a valid twine (satisfying the invariants on 1792538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// order and number of arguments). 1802538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isValid() const { 1812538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Nullary twines always have Empty on the RHS. 1822538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isNullary() && getRHSKind() != EmptyKind) 1832538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 1842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Null should never appear on the RHS. 1862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getRHSKind() == NullKind) 1872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 1882538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1892538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // The RHS cannot be non-empty if the LHS is empty. 1902538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getRHSKind() != EmptyKind && getLHSKind() == EmptyKind) 1912538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 1922538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1932538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // A twine child should always be binary. 1942538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getLHSKind() == TwineKind && 1952538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar !static_cast<const Twine*>(LHS)->isBinary()) 1962538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 1972538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getRHSKind() == TwineKind && 1982538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar !static_cast<const Twine*>(RHS)->isBinary()) 1992538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 2002538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2012538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return true; 2022538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2032538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2042538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// getLHSKind - Get the NodeKind of the left-hand side. 2052538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind getLHSKind() const { return LHSKind; } 2062538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2072538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// getRHSKind - Get the NodeKind of the left-hand side. 2082538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind getRHSKind() const { return RHSKind; } 2092538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2102538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// printOneChild - Print one child from a twine. 2112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void printOneChild(raw_ostream &OS, const void *Ptr, NodeKind Kind) const; 2122538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// printOneChildRepr - Print the representation of one child from a twine. 2142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void printOneChildRepr(raw_ostream &OS, const void *Ptr, 2152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind Kind) const; 2162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar public: 2182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name Constructors 2192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 2202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from an empty string. 2222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine() : LHSKind(EmptyKind), RHSKind(EmptyKind) { 2232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from a C string. 2272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 2282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// We take care here to optimize "" into the empty twine -- this will be 2292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// optimized out for string constants. This allows Twine arguments have 2302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// default "" values, without introducing unnecessary string constants. 2312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const char *Str) 2322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : RHSKind(EmptyKind) { 2332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (Str[0] != '\0') { 2342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar LHS = Str; 2352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar LHSKind = CStringKind; 2362538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } else 2372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar LHSKind = EmptyKind; 2382538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2392538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from an std::string. 2432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const std::string &Str) 2442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(&Str), LHSKind(StdStringKind), RHSKind(EmptyKind) { 2452538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2472538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from a StringRef. 2492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const StringRef &Str) 2502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(&Str), LHSKind(StringRefKind), RHSKind(EmptyKind) { 2512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2540165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as an unsigned decimal integer. 2550165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar Twine(const uint32_t &Val) 2560165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar : LHS(&Val), LHSKind(UDec32Kind), RHSKind(EmptyKind) { 2570165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 2580165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 2590165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as a signed decimal integer. 2600165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar Twine(const int32_t &Val) 2610165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar : LHS(&Val), LHSKind(SDec32Kind), RHSKind(EmptyKind) { 2620165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 2630165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 2640165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as an unsigned decimal integer. 2650165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar Twine(const uint64_t &Val) 2660165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar : LHS(&Val), LHSKind(UDec64Kind), RHSKind(EmptyKind) { 2670165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 2680165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 2690165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as a signed decimal integer. 2700165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar Twine(const int64_t &Val) 2710165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar : LHS(&Val), LHSKind(SDec64Kind), RHSKind(EmptyKind) { 2720165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 2730165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 2742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // FIXME: Unfortunately, to make sure this is as efficient as possible we 2752538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // need extra binary constructors from particular types. We can't rely on 2762538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // the compiler to be smart enough to fold operator+()/concat() down to the 2772538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // right thing. Yet. 2782538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2792538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct as the concatenation of a C string and a StringRef. 2802538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const char *_LHS, const StringRef &_RHS) 2812538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(_LHS), RHS(&_RHS), LHSKind(CStringKind), RHSKind(StringRefKind) { 2822538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2832538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct as the concatenation of a StringRef and a C string. 2862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const StringRef &_LHS, const char *_RHS) 2872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(&_LHS), RHS(_RHS), LHSKind(StringRefKind), RHSKind(CStringKind) { 2882538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2892538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2902538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 291763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// Create a 'null' string, which is an empty string that always 292763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// concatenates to form another empty string. 293763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar static Twine createNull() { 294763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar return Twine(NullKind); 295763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar } 296763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 297763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// @} 298763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// @name Numeric Conversions 299763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// @{ 300763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 301763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar // Construct a twine to print \arg Val as an unsigned hexadecimal integer. 302763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar static Twine utohexstr(const uint64_t &Val) { 303763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar return Twine(&Val, UHexKind, 0, EmptyKind); 304763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar } 305763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 306763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar // Construct a twine to print \arg Val as an unsigned hexadecimal 307763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar // integer. This routine is provided as a convenience to sign extend values 308763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar // before printing. 309763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar static Twine itohexstr(const int64_t &Val) { 310763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar return Twine(&Val, UHexKind, 0, EmptyKind); 311763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar } 312763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 3132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 3142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name String Operations 3152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 3162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar Twine concat(const Twine &Suffix) const; 3182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 3202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name Output & Conversion. 3212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 3222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// str - Return the twine contents as a std::string. 3242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar std::string str() const; 3252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// toVector - Write the concatenated string into the given SmallString or 3272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// SmallVector. 3282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void toVector(SmallVectorImpl<char> &Out) const; 3292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// print - Write the concatenated string represented by this twine to the 3312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// stream \arg OS. 3322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void print(raw_ostream &OS) const; 3332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// dump - Dump the concatenated string represented by this twine to stderr. 3352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void dump() const; 3362538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// print - Write the representation of this twine to the stream \arg OS. 3382538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void printRepr(raw_ostream &OS) const; 3392538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// dumpRepr - Dump the representation of this twine to stderr. 3412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void dumpRepr() const; 3422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 3442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar }; 3452538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name Twine Inline Implementations 3472538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 3482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine Twine::concat(const Twine &Suffix) const { 3502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concatenation with null is null. 3512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isNull() || Suffix.isNull()) 3522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(NullKind); 3532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concatenation with empty yields the other side. 3552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isEmpty()) 3562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Suffix; 3572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (Suffix.isEmpty()) 3582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return *this; 3592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Otherwise we need to create a new node, taking care to fold in unary 3612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // twines. 3622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar const void *NewLHS = this, *NewRHS = &Suffix; 3632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind NewLHSKind = TwineKind, NewRHSKind = TwineKind; 3642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isUnary()) { 3652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewLHS = LHS; 3662538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewLHSKind = getLHSKind(); 3672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (Suffix.isUnary()) { 3692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewRHS = Suffix.LHS; 3702538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewRHSKind = Suffix.getLHSKind(); 3712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3722538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3732538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(NewLHS, NewLHSKind, NewRHS, NewRHSKind); 3742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3752538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3762538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine operator+(const Twine &LHS, const Twine &RHS) { 3772538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return LHS.concat(RHS); 3782538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3792538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3802538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Additional overload to guarantee simplified codegen; this is equivalent to 3812538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concat(). 3822538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3832538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine operator+(const char *LHS, const StringRef &RHS) { 3842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(LHS, RHS); 3852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Additional overload to guarantee simplified codegen; this is equivalent to 3882538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concat(). 3892538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3902538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine operator+(const StringRef &LHS, const char *RHS) { 3912538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(LHS, RHS); 3922538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3932538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3942538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline raw_ostream &operator<<(raw_ostream &OS, const Twine &RHS) { 3952538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar RHS.print(OS); 3962538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return OS; 3972538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3982538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3992538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 4002538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 4012538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4022538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#endif 403