diff options
Diffstat (limited to 'contrib/llvm-project/llvm/include/llvm/ADT/SmallString.h')
-rw-r--r-- | contrib/llvm-project/llvm/include/llvm/ADT/SmallString.h | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/contrib/llvm-project/llvm/include/llvm/ADT/SmallString.h b/contrib/llvm-project/llvm/include/llvm/ADT/SmallString.h index cd6f2173d04f..5a56321ae492 100644 --- a/contrib/llvm-project/llvm/include/llvm/ADT/SmallString.h +++ b/contrib/llvm-project/llvm/include/llvm/ADT/SmallString.h @@ -30,63 +30,56 @@ public: /// Initialize from a StringRef. SmallString(StringRef S) : SmallVector<char, InternalLen>(S.begin(), S.end()) {} + /// Initialize by concatenating a list of StringRefs. + SmallString(std::initializer_list<StringRef> Refs) + : SmallVector<char, InternalLen>() { + this->append(Refs); + } + /// Initialize with a range. template<typename ItTy> SmallString(ItTy S, ItTy E) : SmallVector<char, InternalLen>(S, E) {} - // Note that in order to add new overloads for append & assign, we have to - // duplicate the inherited versions so as not to inadvertently hide them. - /// @} /// @name String Assignment /// @{ - /// Assign from a repeated element. - void assign(size_t NumElts, char Elt) { - this->SmallVectorImpl<char>::assign(NumElts, Elt); - } - - /// Assign from an iterator pair. - template<typename in_iter> - void assign(in_iter S, in_iter E) { - this->clear(); - SmallVectorImpl<char>::append(S, E); - } + using SmallVector<char, InternalLen>::assign; /// Assign from a StringRef. void assign(StringRef RHS) { - this->clear(); - SmallVectorImpl<char>::append(RHS.begin(), RHS.end()); + SmallVectorImpl<char>::assign(RHS.begin(), RHS.end()); } - /// Assign from a SmallVector. - void assign(const SmallVectorImpl<char> &RHS) { + /// Assign from a list of StringRefs. + void assign(std::initializer_list<StringRef> Refs) { this->clear(); - SmallVectorImpl<char>::append(RHS.begin(), RHS.end()); + append(Refs); } /// @} /// @name String Concatenation /// @{ - /// Append from an iterator pair. - template<typename in_iter> - void append(in_iter S, in_iter E) { - SmallVectorImpl<char>::append(S, E); - } - - void append(size_t NumInputs, char Elt) { - SmallVectorImpl<char>::append(NumInputs, Elt); - } + using SmallVector<char, InternalLen>::append; /// Append from a StringRef. void append(StringRef RHS) { SmallVectorImpl<char>::append(RHS.begin(), RHS.end()); } - /// Append from a SmallVector. - void append(const SmallVectorImpl<char> &RHS) { - SmallVectorImpl<char>::append(RHS.begin(), RHS.end()); + /// Append from a list of StringRefs. + void append(std::initializer_list<StringRef> Refs) { + size_t SizeNeeded = this->size(); + for (const StringRef &Ref : Refs) + SizeNeeded += Ref.size(); + this->reserve(SizeNeeded); + auto CurEnd = this->end(); + for (const StringRef &Ref : Refs) { + this->uninitialized_copy(Ref.begin(), Ref.end(), CurEnd); + CurEnd += Ref.size(); + } + this->set_size(SizeNeeded); } /// @} @@ -280,9 +273,9 @@ public: } // Extra operators. - const SmallString &operator=(StringRef RHS) { - this->clear(); - return *this += RHS; + SmallString &operator=(StringRef RHS) { + this->assign(RHS); + return *this; } SmallString &operator+=(StringRef RHS) { |