This is the first part of making SmallString::str() return std::string, adding
SmallString support to raw_ostream and Twine so that we would be able to remove
str() usage for these frequent cases. I broke this from
http://reviews.llvm.org/D6336 for easier review.
http://reviews.llvm.org/D6372
Files:
include/llvm/ADT/Twine.h
include/llvm/Support/raw_ostream.h
lib/Support/Twine.cpp
Index: include/llvm/ADT/Twine.h
===================================================================
--- include/llvm/ADT/Twine.h
+++ include/llvm/ADT/Twine.h
@@ -7,12 +7,13 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_ADT_TWINE_H
-#define LLVM_ADT_TWINE_H
-
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/DataTypes.h"
-#include "llvm/Support/ErrorHandling.h"
+#ifndef LLVM_ADT_TWINE_H
+#define LLVM_ADT_TWINE_H
+
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/DataTypes.h"
+#include "llvm/Support/ErrorHandling.h"
#include <cassert>
#include <string>
@@ -97,12 +98,15 @@
/// A pointer to an std::string instance.
StdStringKind,
- /// A pointer to a StringRef instance.
- StringRefKind,
-
- /// A char value reinterpreted as a pointer, to render as a character.
- CharKind,
-
+ /// A pointer to a StringRef instance.
+ StringRefKind,
+
+ /// A pointer to a SmallString instance.
+ SmallStringKind,
+
+ /// A char value reinterpreted as a pointer, to render as a character.
+ CharKind,
+
/// An unsigned int value reinterpreted as a pointer, to render as an
/// unsigned decimal integer.
DecUIKind,
@@ -133,12 +137,13 @@
union Child
{
const Twine *twine;
- const char *cString;
- const std::string *stdString;
- const StringRef *stringRef;
- char character;
- unsigned int decUI;
- int decI;
+ const char *cString;
+ const std::string *stdString;
+ const StringRef *stringRef;
+ const SmallVectorImpl<char> *smallString;
+ char character;
+ unsigned int decUI;
+ int decI;
const unsigned long *decUL;
const long *decL;
const unsigned long long *decULL;
@@ -286,12 +291,19 @@
/*implicit*/ Twine(const StringRef &Str)
: LHSKind(StringRefKind), RHSKind(EmptyKind) {
LHS.stringRef = &Str;
- assert(isValid() && "Invalid twine!");
- }
-
- /// Construct from a char.
- explicit Twine(char Val)
- : LHSKind(CharKind), RHSKind(EmptyKind) {
+ assert(isValid() && "Invalid twine!");
+ }
+
+ /// Construct from a SmallString.
+ /*implicit*/ Twine(const SmallVectorImpl<char> &Str)
+ : LHSKind(SmallStringKind), RHSKind(EmptyKind) {
+ LHS.smallString = &Str;
+ assert(isValid() && "Invalid twine!");
+ }
+
+ /// Construct from a char.
+ explicit Twine(char Val)
+ : LHSKind(CharKind), RHSKind(EmptyKind) {
LHS.character = Val;
}
@@ -399,12 +411,13 @@
switch (getLHSKind()) {
case EmptyKind:
- case CStringKind:
- case StdStringKind:
- case StringRefKind:
- return true;
- default:
- return false;
+ case CStringKind:
+ case StdStringKind:
+ case StringRefKind:
+ case SmallStringKind:
+ return true;
+ default:
+ return false;
}
}
@@ -432,12 +445,12 @@
switch (getLHSKind()) {
default: llvm_unreachable("Out of sync with isSingleStringRef");
case EmptyKind: return StringRef();
- case CStringKind: return StringRef(LHS.cString);
- case StdStringKind: return StringRef(*LHS.stdString);
- case StringRefKind: return *LHS.stringRef;
- }
- }
-
+ case CStringKind: return StringRef(LHS.cString);
+ case StdStringKind: return StringRef(*LHS.stdString);
+ case StringRefKind: return *LHS.stringRef;
+ case SmallStringKind:return StringRef(LHS.smallString->data(),LHS.smallString->size());
+ }
+ }
/// toStringRef - This returns the twine as a single StringRef if it can be
/// represented as such. Otherwise the twine is written into the given
/// SmallVector and a StringRef to the SmallVector's data is returned.
Index: include/llvm/Support/raw_ostream.h
===================================================================
--- include/llvm/Support/raw_ostream.h
+++ include/llvm/Support/raw_ostream.h
@@ -14,6 +14,7 @@
#ifndef LLVM_SUPPORT_RAW_OSTREAM_H
#define LLVM_SUPPORT_RAW_OSTREAM_H
+#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/DataTypes.h"
@@ -185,6 +186,10 @@
return write(Str.data(), Str.length());
}
+ raw_ostream &operator<<(const llvm::SmallVectorImpl<char> &Str) {
+ return write(Str.data(), Str.size());
+ }
+
raw_ostream &operator<<(unsigned long N);
raw_ostream &operator<<(long N);
raw_ostream &operator<<(unsigned long long N);
Index: lib/Support/Twine.cpp
===================================================================
--- lib/Support/Twine.cpp
+++ lib/Support/Twine.cpp
@@ -69,12 +69,15 @@
case Twine::StdStringKind:
OS << *Ptr.stdString;
break;
- case Twine::StringRefKind:
- OS << *Ptr.stringRef;
- break;
- case Twine::CharKind:
- OS << Ptr.character;
- break;
+ case Twine::StringRefKind:
+ OS << *Ptr.stringRef;
+ break;
+ case Twine::SmallStringKind:
+ OS << *Ptr.smallString;
+ break;
+ case Twine::CharKind:
+ OS << Ptr.character;
+ break;
case Twine::DecUIKind:
OS << Ptr.decUI;
break;
@@ -119,12 +122,16 @@
<< Ptr.stdString << "\"";
break;
case Twine::StringRefKind:
- OS << "stringref:\""
- << Ptr.stringRef << "\"";
- break;
- case Twine::CharKind:
- OS << "char:\"" << Ptr.character << "\"";
- break;
+ OS << "stringref:\""
+ << Ptr.stringRef << "\"";
+ break;
+ case Twine::SmallStringKind:
+ OS << "smallstring:\""
+ << Ptr.smallString << "\"";
+ break;
+ case Twine::CharKind:
+ OS << "char:\"" << Ptr.character << "\"";
+ break;
case Twine::DecUIKind:
OS << "decUI:\"" << Ptr.decUI << "\"";
break;
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits