mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
ADT: Use 'using' to inherit assign and append in SmallString
Rather than reimplement, use a `using` declaration to bring in `SmallVectorImpl<char>`'s assign and append implementations in `SmallString`. The `SmallString` versions were missing reference invalidation assertions from `SmallVector`. This patch also fixes a bug in `llvm::FileCollector::addFileImpl`, which was a copy/paste from `clang::ModuleDependencyCollector::copyToRoot`, both caught by the no-longer-skipped assertions. As a drive-by, this also sinks the `const SmallVectorImpl&` versions of these methods down into `SmallVectorImpl`, since I imagine they'd be useful elsewhere. Differential Revision: https://reviews.llvm.org/D95202
This commit is contained in:
parent
e27b35d042
commit
e675c8ca11
@ -40,35 +40,15 @@ public:
|
|||||||
template<typename ItTy>
|
template<typename ItTy>
|
||||||
SmallString(ItTy S, ItTy E) : SmallVector<char, InternalLen>(S, E) {}
|
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
|
/// @name String Assignment
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/// Assign from a repeated element.
|
using SmallVector<char, InternalLen>::assign;
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Assign from a StringRef.
|
/// Assign from a StringRef.
|
||||||
void assign(StringRef RHS) {
|
void assign(StringRef RHS) {
|
||||||
this->clear();
|
SmallVectorImpl<char>::assign(RHS.begin(), RHS.end());
|
||||||
SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Assign from a SmallVector.
|
|
||||||
void assign(const SmallVectorImpl<char> &RHS) {
|
|
||||||
this->clear();
|
|
||||||
SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Assign from a list of StringRefs.
|
/// Assign from a list of StringRefs.
|
||||||
@ -81,26 +61,13 @@ public:
|
|||||||
/// @name String Concatenation
|
/// @name String Concatenation
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/// Append from an iterator pair.
|
using SmallVector<char, InternalLen>::append;
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Append from a StringRef.
|
/// Append from a StringRef.
|
||||||
void append(StringRef RHS) {
|
void append(StringRef RHS) {
|
||||||
SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
|
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.
|
/// Append from a list of StringRefs.
|
||||||
void append(std::initializer_list<StringRef> Refs) {
|
void append(std::initializer_list<StringRef> Refs) {
|
||||||
size_t SizeNeeded = this->size();
|
size_t SizeNeeded = this->size();
|
||||||
|
@ -664,6 +664,8 @@ public:
|
|||||||
append(IL.begin(), IL.end());
|
append(IL.begin(), IL.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void append(const SmallVectorImpl &RHS) { append(RHS.begin(), RHS.end()); }
|
||||||
|
|
||||||
void assign(size_type NumElts, ValueParamT Elt) {
|
void assign(size_type NumElts, ValueParamT Elt) {
|
||||||
// Note that Elt could be an internal reference.
|
// Note that Elt could be an internal reference.
|
||||||
if (NumElts > this->capacity()) {
|
if (NumElts > this->capacity()) {
|
||||||
@ -698,6 +700,8 @@ public:
|
|||||||
append(IL);
|
append(IL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void assign(const SmallVectorImpl &RHS) { assign(RHS.begin(), RHS.end()); }
|
||||||
|
|
||||||
iterator erase(const_iterator CI) {
|
iterator erase(const_iterator CI) {
|
||||||
// Just cast away constness because this is a non-const member function.
|
// Just cast away constness because this is a non-const member function.
|
||||||
iterator I = const_cast<iterator>(CI);
|
iterator I = const_cast<iterator>(CI);
|
||||||
|
@ -86,17 +86,18 @@ void FileCollector::addFileImpl(StringRef SrcPath) {
|
|||||||
sys::path::native(AbsoluteSrc);
|
sys::path::native(AbsoluteSrc);
|
||||||
|
|
||||||
// Remove redundant leading "./" pieces and consecutive separators.
|
// Remove redundant leading "./" pieces and consecutive separators.
|
||||||
AbsoluteSrc = sys::path::remove_leading_dotslash(AbsoluteSrc);
|
StringRef TrimmedAbsoluteSrc =
|
||||||
|
sys::path::remove_leading_dotslash(AbsoluteSrc);
|
||||||
|
|
||||||
// Canonicalize the source path by removing "..", "." components.
|
// Canonicalize the source path by removing "..", "." components.
|
||||||
SmallString<256> VirtualPath = AbsoluteSrc;
|
SmallString<256> VirtualPath = TrimmedAbsoluteSrc;
|
||||||
sys::path::remove_dots(VirtualPath, /*remove_dot_dot=*/true);
|
sys::path::remove_dots(VirtualPath, /*remove_dot_dot=*/true);
|
||||||
|
|
||||||
// If a ".." component is present after a symlink component, remove_dots may
|
// If a ".." component is present after a symlink component, remove_dots may
|
||||||
// lead to the wrong real destination path. Let the source be canonicalized
|
// lead to the wrong real destination path. Let the source be canonicalized
|
||||||
// like that but make sure we always use the real path for the destination.
|
// like that but make sure we always use the real path for the destination.
|
||||||
SmallString<256> CopyFrom;
|
SmallString<256> CopyFrom;
|
||||||
if (!getRealPath(AbsoluteSrc, CopyFrom))
|
if (!getRealPath(TrimmedAbsoluteSrc, CopyFrom))
|
||||||
CopyFrom = VirtualPath;
|
CopyFrom = VirtualPath;
|
||||||
|
|
||||||
SmallString<256> DstPath = StringRef(Root);
|
SmallString<256> DstPath = StringRef(Root);
|
||||||
|
@ -485,6 +485,15 @@ TYPED_TEST(SmallVectorTest, AppendRepeatedNonForwardIterator) {
|
|||||||
this->assertValuesInOrder(this->theVector, 3u, 1, 7, 7);
|
this->assertValuesInOrder(this->theVector, 3u, 1, 7, 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(SmallVectorTest, AppendSmallVector) {
|
||||||
|
SCOPED_TRACE("AppendSmallVector");
|
||||||
|
|
||||||
|
SmallVector<Constructable, 3> otherVector = {7, 7};
|
||||||
|
this->theVector.push_back(Constructable(1));
|
||||||
|
this->theVector.append(otherVector);
|
||||||
|
this->assertValuesInOrder(this->theVector, 3u, 1, 7, 7);
|
||||||
|
}
|
||||||
|
|
||||||
// Assign test
|
// Assign test
|
||||||
TYPED_TEST(SmallVectorTest, AssignTest) {
|
TYPED_TEST(SmallVectorTest, AssignTest) {
|
||||||
SCOPED_TRACE("AssignTest");
|
SCOPED_TRACE("AssignTest");
|
||||||
@ -513,6 +522,15 @@ TYPED_TEST(SmallVectorTest, AssignNonIterTest) {
|
|||||||
this->assertValuesInOrder(this->theVector, 2u, 7, 7);
|
this->assertValuesInOrder(this->theVector, 2u, 7, 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(SmallVectorTest, AssignSmallVector) {
|
||||||
|
SCOPED_TRACE("AssignSmallVector");
|
||||||
|
|
||||||
|
SmallVector<Constructable, 3> otherVector = {7, 7};
|
||||||
|
this->theVector.push_back(Constructable(1));
|
||||||
|
this->theVector.assign(otherVector);
|
||||||
|
this->assertValuesInOrder(this->theVector, 2u, 7, 7);
|
||||||
|
}
|
||||||
|
|
||||||
// Move-assign test
|
// Move-assign test
|
||||||
TYPED_TEST(SmallVectorTest, MoveAssignTest) {
|
TYPED_TEST(SmallVectorTest, MoveAssignTest) {
|
||||||
SCOPED_TRACE("MoveAssignTest");
|
SCOPED_TRACE("MoveAssignTest");
|
||||||
|
Loading…
Reference in New Issue
Block a user