[clang] [NFC][clang][AST] Add compile-time dispatch for random access iterators in append() (PR #162000)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Oct 5 00:24:54 PDT 2025
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
More information about the cfe-commits
mailing list