Skip to content

Commit bab33e2

Browse files
kuharaokblast
authored andcommitted
[ADT] Add SmallVector::assign overload for ArrayRef (llvm#164680)
We already have a matching constructor from ArrayRef, so add support for assigning from ArrayRef as well.
1 parent 725e7f4 commit bab33e2

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

llvm/include/llvm/ADT/SmallVector.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,12 @@ class SmallVectorImpl : public SmallVectorTemplateBase<T> {
734734

735735
void assign(const SmallVectorImpl &RHS) { assign(RHS.begin(), RHS.end()); }
736736

737+
template <typename U,
738+
typename = std::enable_if_t<std::is_convertible_v<U, T>>>
739+
void assign(ArrayRef<U> AR) {
740+
assign(AR.begin(), AR.end());
741+
}
742+
737743
iterator erase(const_iterator CI) {
738744
// Just cast away constness because this is a non-const member function.
739745
iterator I = const_cast<iterator>(CI);
@@ -1228,7 +1234,7 @@ class LLVM_GSL_OWNER SmallVector : public SmallVectorImpl<T>,
12281234
}
12291235

12301236
template <typename U,
1231-
typename = std::enable_if_t<std::is_convertible<U, T>::value>>
1237+
typename = std::enable_if_t<std::is_convertible_v<U, T>>>
12321238
explicit SmallVector(ArrayRef<U> A) : SmallVectorImpl<T>(N) {
12331239
this->append(A.begin(), A.end());
12341240
}

llvm/unittests/ADT/SmallVectorTest.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,15 @@ TYPED_TEST(SmallVectorTest, AssignSmallVector) {
599599
assertValuesInOrder(V, 2u, 7, 7);
600600
}
601601

602+
TYPED_TEST(SmallVectorTest, AssignArrayRef) {
603+
SCOPED_TRACE("AssignArrayRef");
604+
auto &V = this->theVector;
605+
Constructable Other[] = {7, 8, 9};
606+
V.push_back(Constructable(1));
607+
V.assign(ArrayRef(Other));
608+
assertValuesInOrder(V, 3u, 7, 8, 9);
609+
}
610+
602611
// Move-assign test
603612
TYPED_TEST(SmallVectorTest, MoveAssignTest) {
604613
SCOPED_TRACE("MoveAssignTest");

0 commit comments

Comments
 (0)