diff options
-rw-r--r-- | llvm/include/llvm/ADT/SmallVector.h | 90 | ||||
-rw-r--r-- | llvm/unittests/ADT/SmallVectorTest.cpp | 8 |
2 files changed, 53 insertions, 45 deletions
diff --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h index da4ac10..af9bbb6 100644 --- a/llvm/include/llvm/ADT/SmallVector.h +++ b/llvm/include/llvm/ADT/SmallVector.h @@ -236,51 +236,6 @@ public: this->setEnd(this->end()-1); this->end()->~T(); } - -#if LLVM_HAS_VARIADIC_TEMPLATES - template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) { - if (LLVM_UNLIKELY(this->EndX >= this->CapacityX)) - this->grow(); - ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...); - this->setEnd(this->end() + 1); - } -#else -private: - template <typename Constructor> void emplace_back_impl(Constructor construct) { - if (LLVM_UNLIKELY(this->EndX >= this->CapacityX)) - this->grow(); - construct((void *)this->end()); - this->setEnd(this->end() + 1); - } - -public: - void emplace_back() { - emplace_back_impl([](void *Mem) { ::new (Mem) T(); }); - } - template <typename T1> void emplace_back(T1 &&A1) { - emplace_back_impl([&](void *Mem) { ::new (Mem) T(std::forward<T1>(A1)); }); - } - template <typename T1, typename T2> void emplace_back(T1 &&A1, T2 &&A2) { - emplace_back_impl([&](void *Mem) { - ::new (Mem) T(std::forward<T1>(A1), std::forward<T2>(A2)); - }); - } - template <typename T1, typename T2, typename T3> - void emplace_back(T1 &&A1, T2 &&A2, T3 &&A3) { - T(std::forward<T1>(A1), std::forward<T2>(A2), std::forward<T3>(A3)); - emplace_back_impl([&](void *Mem) { - ::new (Mem) - T(std::forward<T1>(A1), std::forward<T2>(A2), std::forward<T3>(A3)); - }); - } - template <typename T1, typename T2, typename T3, typename T4> - void emplace_back(T1 &&A1, T2 &&A2, T3 &&A3, T4 &&A4) { - emplace_back_impl([&](void *Mem) { - ::new (Mem) T(std::forward<T1>(A1), std::forward<T2>(A2), - std::forward<T3>(A3), std::forward<T4>(A4)); - }); - } -#endif // LLVM_HAS_VARIADIC_TEMPLATES }; // Define this out-of-line to dissuade the C++ compiler from inlining it. @@ -677,6 +632,51 @@ public: return I; } +#if LLVM_HAS_VARIADIC_TEMPLATES + template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) { + if (LLVM_UNLIKELY(this->EndX >= this->CapacityX)) + this->grow(); + ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...); + this->setEnd(this->end() + 1); + } +#else +private: + template <typename Constructor> void emplace_back_impl(Constructor construct) { + if (LLVM_UNLIKELY(this->EndX >= this->CapacityX)) + this->grow(); + construct((void *)this->end()); + this->setEnd(this->end() + 1); + } + +public: + void emplace_back() { + emplace_back_impl([](void *Mem) { ::new (Mem) T(); }); + } + template <typename T1> void emplace_back(T1 &&A1) { + emplace_back_impl([&](void *Mem) { ::new (Mem) T(std::forward<T1>(A1)); }); + } + template <typename T1, typename T2> void emplace_back(T1 &&A1, T2 &&A2) { + emplace_back_impl([&](void *Mem) { + ::new (Mem) T(std::forward<T1>(A1), std::forward<T2>(A2)); + }); + } + template <typename T1, typename T2, typename T3> + void emplace_back(T1 &&A1, T2 &&A2, T3 &&A3) { + T(std::forward<T1>(A1), std::forward<T2>(A2), std::forward<T3>(A3)); + emplace_back_impl([&](void *Mem) { + ::new (Mem) + T(std::forward<T1>(A1), std::forward<T2>(A2), std::forward<T3>(A3)); + }); + } + template <typename T1, typename T2, typename T3, typename T4> + void emplace_back(T1 &&A1, T2 &&A2, T3 &&A3, T4 &&A4) { + emplace_back_impl([&](void *Mem) { + ::new (Mem) T(std::forward<T1>(A1), std::forward<T2>(A2), + std::forward<T3>(A3), std::forward<T4>(A4)); + }); + } +#endif // LLVM_HAS_VARIADIC_TEMPLATES + SmallVectorImpl &operator=(const SmallVectorImpl &RHS); SmallVectorImpl &operator=(SmallVectorImpl &&RHS); diff --git a/llvm/unittests/ADT/SmallVectorTest.cpp b/llvm/unittests/ADT/SmallVectorTest.cpp index f6e9bb9..170a30b 100644 --- a/llvm/unittests/ADT/SmallVectorTest.cpp +++ b/llvm/unittests/ADT/SmallVectorTest.cpp @@ -896,6 +896,14 @@ TEST(SmallVectorTest, EmplaceBack) { EXPECT_TRUE(V.back().A2.State == EAS_RValue); EXPECT_TRUE(V.back().A3.State == EAS_LValue); } + { + SmallVector<int, 1> V; + V.emplace_back(); + V.emplace_back(42); + EXPECT_EQ(2U, V.size()); + EXPECT_EQ(0, V[0]); + EXPECT_EQ(42, V[1]); + } } } // end namespace |