[libcxx-commits] [libcxx] 6721bcf - [libc++] Accept iterators instead of raw pointers in __uninitialized_allocator_relocate (#114552)
via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Nov 14 02:22:52 PST 2024
Author: Louis Dionne
Date: 2024-11-14T11:22:48+01:00
New Revision: 6721bcfd1b6494e9643a04a13144f282979544ad
URL: https://github.com/llvm/llvm-project/commit/6721bcfd1b6494e9643a04a13144f282979544ad
DIFF: https://github.com/llvm/llvm-project/commit/6721bcfd1b6494e9643a04a13144f282979544ad.diff
LOG: [libc++] Accept iterators instead of raw pointers in __uninitialized_allocator_relocate (#114552)
This generalizes the algorithm a bit. Unfortunately, we can't make
the call sites cleaner inside std::vector because the arguments being
passed can all be fancy pointers, which may not be contiguous iterators.
Added:
Modified:
libcxx/include/__memory/uninitialized_algorithms.h
Removed:
################################################################################
diff --git a/libcxx/include/__memory/uninitialized_algorithms.h b/libcxx/include/__memory/uninitialized_algorithms.h
index 627ee44e808d9c..3960ab6d84dba7 100644
--- a/libcxx/include/__memory/uninitialized_algorithms.h
+++ b/libcxx/include/__memory/uninitialized_algorithms.h
@@ -612,20 +612,22 @@ struct __allocator_has_trivial_destroy<allocator<_Tp>, _Up> : true_type {};
// [__first, __last) doesn't contain any objects
//
// The strong exception guarantee is provided if any of the following are true:
-// - is_nothrow_move_constructible<_Tp>
-// - is_copy_constructible<_Tp>
-// - __libcpp_is_trivially_relocatable<_Tp>
-template <class _Alloc, class _Tp>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void
-__uninitialized_allocator_relocate(_Alloc& __alloc, _Tp* __first, _Tp* __last, _Tp* __result) {
+// - is_nothrow_move_constructible<_ValueType>
+// - is_copy_constructible<_ValueType>
+// - __libcpp_is_trivially_relocatable<_ValueType>
+template <class _Alloc, class _ContiguousIterator>
+_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void __uninitialized_allocator_relocate(
+ _Alloc& __alloc, _ContiguousIterator __first, _ContiguousIterator __last, _ContiguousIterator __result) {
+ static_assert(__libcpp_is_contiguous_iterator<_ContiguousIterator>::value, "");
+ using _ValueType = typename iterator_traits<_ContiguousIterator>::value_type;
static_assert(__is_cpp17_move_insertable<_Alloc>::value,
"The specified type does not meet the requirements of Cpp17MoveInsertable");
- if (__libcpp_is_constant_evaluated() || !__libcpp_is_trivially_relocatable<_Tp>::value ||
- !__allocator_has_trivial_move_construct<_Alloc, _Tp>::value ||
- !__allocator_has_trivial_destroy<_Alloc, _Tp>::value) {
+ if (__libcpp_is_constant_evaluated() || !__libcpp_is_trivially_relocatable<_ValueType>::value ||
+ !__allocator_has_trivial_move_construct<_Alloc, _ValueType>::value ||
+ !__allocator_has_trivial_destroy<_Alloc, _ValueType>::value) {
auto __destruct_first = __result;
- auto __guard =
- std::__make_exception_guard(_AllocatorDestroyRangeReverse<_Alloc, _Tp*>(__alloc, __destruct_first, __result));
+ auto __guard = std::__make_exception_guard(
+ _AllocatorDestroyRangeReverse<_Alloc, _ContiguousIterator>(__alloc, __destruct_first, __result));
auto __iter = __first;
while (__iter != __last) {
#if _LIBCPP_HAS_EXCEPTIONS
@@ -640,7 +642,9 @@ __uninitialized_allocator_relocate(_Alloc& __alloc, _Tp* __first, _Tp* __last, _
std::__allocator_destroy(__alloc, __first, __last);
} else {
// Casting to void* to suppress clang complaining that this is technically UB.
- __builtin_memcpy(static_cast<void*>(__result), __first, sizeof(_Tp) * (__last - __first));
+ __builtin_memcpy(static_cast<void*>(std::__to_address(__result)),
+ std::__to_address(__first),
+ sizeof(_ValueType) * (__last - __first));
}
}
More information about the libcxx-commits
mailing list