Twine.h revision 3f25ee080ca7c92ff735df29c78e7cfbd62c8cb6
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" 141f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#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. 45326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer /// 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 1023f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner /// A char value reinterpreted as a pointer, to render as a character. 1033f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner CharKind, 1043f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner 105326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer /// An unsigned int value reinterpreted as a pointer, to render as an 106ea03e10facd07f0b239dcc3a5e31346686acae3cChris Lattner /// unsigned decimal integer. 1072d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecUIKind, 108763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 109ea03e10facd07f0b239dcc3a5e31346686acae3cChris Lattner /// An int value reinterpreted as a pointer, to render as a signed 110ea03e10facd07f0b239dcc3a5e31346686acae3cChris Lattner /// decimal integer. 1112d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecIKind, 1120165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 1132d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to an unsigned long value, to render as an unsigned decimal 114763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// integer. 1152d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecULKind, 116763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 1172d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to a long value, to render as a signed decimal integer. 1182d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecLKind, 1192d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar 1202d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to an unsigned long long value, to render as an unsigned 1212d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// decimal integer. 1222d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecULLKind, 1232d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar 1242d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// A pointer to a long long value, to render as a signed decimal integer. 1252d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar DecLLKind, 1260165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 1270165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// A pointer to a uint64_t value, to render as an unsigned hexadecimal 1280165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// integer. 1290165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar UHexKind 1302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar }; 1312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1323f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner union Child 1333f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner { 1343f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const Twine *twine; 1353f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const char *cString; 1363f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const std::string *stdString; 1373f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const StringRef *stringRef; 1383f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner char character; 1393f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner unsigned int decUI; 1403f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner int decI; 1413f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const unsigned long *decUL; 1423f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const long *decL; 1433f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const unsigned long long *decULL; 1443f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const long long *decLL; 1453f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner const uint64_t *uHex; 1463f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner }; 1473f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner 1482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar private: 1492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// LHS - The prefix in the concatenation, which may be uninitialized for 1502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Null or Empty kinds. 1513f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner Child LHS; 1522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// RHS - The suffix in the concatenation, which may be uninitialized for 1532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Null or Empty kinds. 1543f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner Child RHS; 1553f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner // enums stored as unsigned chars to save on space while some compilers 1563f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner // don't support specifying the backing type for an enum 1572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// LHSKind - The NodeKind of the left hand side, \see getLHSKind(). 158b80077aae9fe51af78e6e25e26d09bf8efcd8244Daniel Dunbar unsigned char LHSKind; 1592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// RHSKind - The NodeKind of the left hand side, \see getLHSKind(). 160b80077aae9fe51af78e6e25e26d09bf8efcd8244Daniel Dunbar unsigned char RHSKind; 1612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar private: 1632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct a nullary twine; the kind must be NullKind or EmptyKind. 1642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar explicit Twine(NodeKind Kind) 1652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHSKind(Kind), RHSKind(EmptyKind) { 1662538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isNullary() && "Invalid kind!"); 1672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct a binary twine. 1702538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar explicit Twine(const Twine &_LHS, const Twine &_RHS) 1713f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(TwineKind), RHSKind(TwineKind) { 1723f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.twine = &_LHS; 1733f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner RHS.twine = &_RHS; 1742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 1752538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1762538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1772538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct a twine from explicit values. 1783f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner explicit Twine(Child _LHS, NodeKind _LHSKind, 1793f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner Child _RHS, NodeKind _RHSKind) 1802538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : LHS(_LHS), RHS(_RHS), LHSKind(_LHSKind), RHSKind(_RHSKind) { 1812538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 1822538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1832538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isNull - Check for the null twine. 1852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isNull() const { 1862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getLHSKind() == NullKind; 1872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1882538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1892538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isEmpty - Check for the empty twine. 1902538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isEmpty() const { 1912538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getLHSKind() == EmptyKind; 1922538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1932538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1942538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isNullary - Check if this is a nullary twine (null or empty). 1952538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isNullary() const { 1962538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return isNull() || isEmpty(); 1972538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 1982538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 1992538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isUnary - Check if this is a unary twine. 2002538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isUnary() const { 2012538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getRHSKind() == EmptyKind && !isNullary(); 2022538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2032538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2042538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isBinary - Check if this is a binary twine. 2052538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isBinary() const { 2062538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return getLHSKind() != NullKind && getRHSKind() != EmptyKind; 2072538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2082538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2092538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// isValid - Check if this is a valid twine (satisfying the invariants on 2102538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// order and number of arguments). 2112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar bool isValid() const { 2122538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Nullary twines always have Empty on the RHS. 2132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isNullary() && getRHSKind() != EmptyKind) 2142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 2152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Null should never appear on the RHS. 2172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getRHSKind() == NullKind) 2182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 2192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // The RHS cannot be non-empty if the LHS is empty. 2212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getRHSKind() != EmptyKind && getLHSKind() == EmptyKind) 2222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 2232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // A twine child should always be binary. 2252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getLHSKind() == TwineKind && 2263f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner !LHS.twine->isBinary()) 2272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 2282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (getRHSKind() == TwineKind && 2293f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner !RHS.twine->isBinary()) 2302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return false; 2312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return true; 2332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// getLHSKind - Get the NodeKind of the left-hand side. 236b80077aae9fe51af78e6e25e26d09bf8efcd8244Daniel Dunbar NodeKind getLHSKind() const { return (NodeKind) LHSKind; } 2372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2382538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// getRHSKind - Get the NodeKind of the left-hand side. 239b80077aae9fe51af78e6e25e26d09bf8efcd8244Daniel Dunbar NodeKind getRHSKind() const { return (NodeKind) RHSKind; } 2402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// printOneChild - Print one child from a twine. 2423f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner void printOneChild(raw_ostream &OS, Child Ptr, NodeKind Kind) const; 2432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// printOneChildRepr - Print the representation of one child from a twine. 2453f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner void printOneChildRepr(raw_ostream &OS, Child Ptr, 2462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind Kind) const; 2472538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar public: 2492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name Constructors 2502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 2512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from an empty string. 2532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine() : LHSKind(EmptyKind), RHSKind(EmptyKind) { 2542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from a C string. 2582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// 2592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// We take care here to optimize "" into the empty twine -- this will be 2602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// optimized out for string constants. This allows Twine arguments have 2612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// default "" values, without introducing unnecessary string constants. 2622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const char *Str) 2632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar : RHSKind(EmptyKind) { 2642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (Str[0] != '\0') { 2653f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.cString = Str; 2662538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar LHSKind = CStringKind; 2672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } else 2682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar LHSKind = EmptyKind; 2692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2702538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2722538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2732538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from an std::string. 2742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const std::string &Str) 2753f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(StdStringKind), RHSKind(EmptyKind) { 2763f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.stdString = &Str; 2772538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2782538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2792538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2802538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct from a StringRef. 2812538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const StringRef &Str) 2823f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(StringRefKind), RHSKind(EmptyKind) { 2833f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.stringRef = &Str; 2842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 2852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 2862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 2873f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner /// Construct from a char. 2883f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner explicit Twine(char Val) 2893f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(CharKind), RHSKind(EmptyKind) { 2903f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.character = Val; 2913f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner } 2923f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner 2933f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner /// Construct from a signed char. 2943f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner explicit Twine(signed char Val) 2953f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(CharKind), RHSKind(EmptyKind) { 2963f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.character = static_cast<char>(Val); 2973f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner } 2983f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner 2993f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner /// Construct from an unsigned char. 3003f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner explicit Twine(unsigned char Val) 3013f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(CharKind), RHSKind(EmptyKind) { 3023f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.character = static_cast<char>(Val); 3033f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner } 3043f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner 3050165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as an unsigned decimal integer. 306326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer explicit Twine(unsigned Val) 3073f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(DecUIKind), RHSKind(EmptyKind) { 3083f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.decUI = Val; 3092d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar } 3102d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar 3112d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// Construct a twine to print \arg Val as a signed decimal integer. 312326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer explicit Twine(int Val) 3133f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(DecIKind), RHSKind(EmptyKind) { 3143f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.decI = Val; 3152d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar } 3162d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar 3172d8bc0fe70c55664b89605dbfa5c2f591446469cDaniel Dunbar /// Construct a twine to print \arg Val as an unsigned decimal integer. 318326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer explicit Twine(const unsigned long &Val) 3193f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(DecULKind), RHSKind(EmptyKind) { 3203f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.decUL = &Val; 3210165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 3220165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 3230165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as a signed decimal integer. 324326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer explicit Twine(const long &Val) 3253f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(DecLKind), RHSKind(EmptyKind) { 3263f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.decL = &Val; 3270165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 3280165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 3290165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as an unsigned decimal integer. 330326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer explicit Twine(const unsigned long long &Val) 3313f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(DecULLKind), RHSKind(EmptyKind) { 3323f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.decULL = &Val; 3330165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 3340165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 3350165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar /// Construct a twine to print \arg Val as a signed decimal integer. 336326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer explicit Twine(const long long &Val) 3373f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(DecLLKind), RHSKind(EmptyKind) { 3383f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.decLL = &Val; 3390165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar } 3400165a2ca897598bb95baec031362921565e24f2bDaniel Dunbar 3412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // FIXME: Unfortunately, to make sure this is as efficient as possible we 3422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // need extra binary constructors from particular types. We can't rely on 3432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // the compiler to be smart enough to fold operator+()/concat() down to the 3442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // right thing. Yet. 3452538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct as the concatenation of a C string and a StringRef. 3472538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const char *_LHS, const StringRef &_RHS) 3483f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(CStringKind), RHSKind(StringRefKind) { 3493f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.cString = _LHS; 3503f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner RHS.stringRef = &_RHS; 3512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 3522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 3542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Construct as the concatenation of a StringRef and a C string. 3552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /*implicit*/ Twine(const StringRef &_LHS, const char *_RHS) 3563f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner : LHSKind(StringRefKind), RHSKind(CStringKind) { 3573f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.stringRef = &_LHS; 3583f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner RHS.cString = _RHS; 3592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar assert(isValid() && "Invalid twine!"); 3602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 3612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 362763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// Create a 'null' string, which is an empty string that always 363763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// concatenates to form another empty string. 364763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar static Twine createNull() { 365763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar return Twine(NullKind); 366763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar } 367763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 368763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// @} 369763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// @name Numeric Conversions 370763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar /// @{ 371763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 372763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar // Construct a twine to print \arg Val as an unsigned hexadecimal integer. 373763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar static Twine utohexstr(const uint64_t &Val) { 3743f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner Child LHS, RHS; 3753f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner LHS.uHex = &Val; 3763f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner RHS.twine = 0; 3773f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner return Twine(LHS, UHexKind, RHS, EmptyKind); 378763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar } 379763457e70bc9c5c2def89d24a133808b8a971f9fDaniel Dunbar 3802538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 3815149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// @name Predicate Operations 3825149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// @{ 3835149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar 3845149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// isTriviallyEmpty - Check if this twine is trivially empty; a false 3855149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// return value does not necessarily mean the twine is empty. 3865149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar bool isTriviallyEmpty() const { 3875149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar return isNullary(); 3885149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar } 389326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 390bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner /// isSingleStringRef - Return true if this twine can be dynamically 391bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner /// accessed as a single StringRef value with getSingleStringRef(). 392bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner bool isSingleStringRef() const { 393bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner if (getRHSKind() != EmptyKind) return false; 394326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 395bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner switch (getLHSKind()) { 396bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case EmptyKind: 397bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case CStringKind: 398bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case StdStringKind: 399bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case StringRefKind: 400bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner return true; 401bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner default: 402bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner return false; 403bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner } 404bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner } 4055149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar 4065149932068f535e1ff13b91c9669f55718c60a07Daniel Dunbar /// @} 4072538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name String Operations 4082538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 4092538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4102538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar Twine concat(const Twine &Suffix) const; 4112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4122538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 4132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name Output & Conversion. 4142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 4152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// str - Return the twine contents as a std::string. 4172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar std::string str() const; 4182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// toVector - Write the concatenated string into the given SmallString or 4202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// SmallVector. 4212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void toVector(SmallVectorImpl<char> &Out) const; 4222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 423bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner /// getSingleStringRef - This returns the twine as a single StringRef. This 424bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner /// method is only valid if isSingleStringRef() is true. 425bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner StringRef getSingleStringRef() const { 426bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner assert(isSingleStringRef() &&"This cannot be had as a single stringref!"); 427bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner switch (getLHSKind()) { 428bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner default: assert(0 && "Out of sync with isSingleStringRef"); 429bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner case EmptyKind: return StringRef(); 4303f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner case CStringKind: return StringRef(LHS.cString); 4313f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner case StdStringKind: return StringRef(*LHS.stdString); 4323f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner case StringRefKind: return *LHS.stringRef; 433bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner } 434bf86e5df180139310bf2f0d71bef58e208dce31dChris Lattner } 435b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer 436b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer /// toStringRef - This returns the twine as a single StringRef if it can be 437b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer /// represented as such. Otherwise the twine is written into the given 438b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer /// SmallVector and a StringRef to the SmallVector's data is returned. 439b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer StringRef toStringRef(SmallVectorImpl<char> &Out) const; 440b357e06f672996400343d38b08014a5b6a7d5b2dBenjamin Kramer 4417dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer /// toNullTerminatedStringRef - This returns the twine as a single null 4427dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer /// terminated StringRef if it can be represented as such. Otherwise the 4437dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer /// twine is written into the given SmallVector and a StringRef to the 4447dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer /// SmallVector's data is returned. 4457dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer /// 4467dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer /// The returned StringRef's size does not include the null terminator. 4477dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer StringRef toNullTerminatedStringRef(SmallVectorImpl<char> &Out) const; 4487dc7ac3cb20b7ef8e6febe0ac3bc430230f29893Michael J. Spencer 4492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// print - Write the concatenated string represented by this twine to the 4502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// stream \arg OS. 4512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void print(raw_ostream &OS) const; 4522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// dump - Dump the concatenated string represented by this twine to stderr. 4542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void dump() const; 4552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// print - Write the representation of this twine to the stream \arg OS. 4572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void printRepr(raw_ostream &OS) const; 4582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// dumpRepr - Dump the representation of this twine to stderr. 4602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar void dumpRepr() const; 4612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 4632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar }; 4642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4652538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @name Twine Inline Implementations 4662538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @{ 4672538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4682538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine Twine::concat(const Twine &Suffix) const { 4692538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concatenation with null is null. 4702538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isNull() || Suffix.isNull()) 4712538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(NullKind); 4722538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4732538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Concatenation with empty yields the other side. 4742538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isEmpty()) 4752538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Suffix; 4762538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (Suffix.isEmpty()) 4772538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return *this; 4782538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4792538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // Otherwise we need to create a new node, taking care to fold in unary 4802538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar // twines. 4813f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner Child NewLHS, NewRHS; 4823f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner NewLHS.twine = this; 4833f25ee080ca7c92ff735df29c78e7cfbd62c8cb6Chris Lattner NewRHS.twine = &Suffix; 4842538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NodeKind NewLHSKind = TwineKind, NewRHSKind = TwineKind; 4852538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (isUnary()) { 4862538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewLHS = LHS; 4872538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewLHSKind = getLHSKind(); 4882538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4892538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar if (Suffix.isUnary()) { 4902538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewRHS = Suffix.LHS; 4912538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar NewRHSKind = Suffix.getLHSKind(); 4922538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4932538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4942538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(NewLHS, NewLHSKind, NewRHS, NewRHSKind); 4952538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 4962538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 4972538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine operator+(const Twine &LHS, const Twine &RHS) { 4982538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return LHS.concat(RHS); 4992538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 5002538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 5012538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Additional overload to guarantee simplified codegen; this is equivalent to 5022538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concat(). 5032538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 5042538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine operator+(const char *LHS, const StringRef &RHS) { 5052538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(LHS, RHS); 5062538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 5072538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 5082538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// Additional overload to guarantee simplified codegen; this is equivalent to 5092538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// concat(). 5102538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 5112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline Twine operator+(const StringRef &LHS, const char *RHS) { 5122538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return Twine(LHS, RHS); 5132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 5142538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 5152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar inline raw_ostream &operator<<(raw_ostream &OS, const Twine &RHS) { 5162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar RHS.print(OS); 5172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar return OS; 5182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar } 5192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 5202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar /// @} 5212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar} 5222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar 5232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#endif 524