llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Samarth Narang (snarang181) <details> <summary>Changes</summary> This patch improves the `append()` implementation by introducing a compile-time dispatch between random access and non-random access iterators. --- Full diff: https://github.com/llvm/llvm-project/pull/162000.diff 1 Files Affected: - (modified) clang/include/clang/AST/ASTVector.h (+19-5) ``````````diff diff --git a/clang/include/clang/AST/ASTVector.h b/clang/include/clang/AST/ASTVector.h index d5a04767ca133..ca30ec343492a 100644 --- a/clang/include/clang/AST/ASTVector.h +++ b/clang/include/clang/AST/ASTVector.h @@ -180,9 +180,21 @@ class ASTVector { size_t capacity() const { return this->capacity_ptr() - Begin; } /// append - Add the specified range to the end of the SmallVector. - template<typename in_iter> + template <typename in_iter> void append(const ASTContext &C, in_iter in_start, in_iter in_end) { - size_type NumInputs = std::distance(in_start, in_end); + using size_type = + typename std::remove_reference_t<decltype(*this)>::size_type; + using iterator_category = + typename std::iterator_traits<in_iter>::iterator_category; + + size_t NumInputs = 0; + constexpr bool is_random_access = + std::is_base_of_v<std::random_access_iterator_tag, iterator_category>; + + if constexpr (is_random_access) + NumInputs = static_cast<size_type>(in_end - in_start); + else + NumInputs = static_cast<size_type>(std::distance(in_start, in_end)); if (NumInputs == 0) return; @@ -192,9 +204,11 @@ class ASTVector { this->grow(C, this->size()+NumInputs); // Copy the new elements over. - // TODO: NEED To compile time dispatch on whether in_iter is a random access - // iterator to use the fast uninitialized_copy. - std::uninitialized_copy(in_start, in_end, this->end()); + if constexpr (is_random_access) + std::uninitialized_copy_n(in_start, NumInputs, this->end()); + else + std::uninitialized_copy(in_start, in_end, this->end()); + this->setEnd(this->end() + NumInputs); } `````````` </details> https://github.com/llvm/llvm-project/pull/162000 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
