[libcxx-commits] [libcxx] [libc++] Remove assumptions that std::array::iterator is a raw pointer (PR #74624)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Dec 12 07:32:03 PST 2023
================
@@ -110,26 +111,32 @@ _LIBCPP_HIDE_FROM_ABI auto __copy(basic_string_view<_CharT> __str, output_iterat
}
}
-template <__fmt_char_type _CharT, __fmt_char_type _OutCharT = _CharT>
-_LIBCPP_HIDE_FROM_ABI auto
-__copy(const _CharT* __first, const _CharT* __last, output_iterator<const _OutCharT&> auto __out_it)
+template <contiguous_iterator _Iterator,
+ __fmt_char_type _CharT = typename iterator_traits<_Iterator>::value_type,
+ __fmt_char_type _OutCharT = _CharT>
+_LIBCPP_HIDE_FROM_ABI auto __copy(_Iterator __first, _Iterator __last, output_iterator<const _OutCharT&> auto __out_it)
-> decltype(__out_it) {
return __formatter::__copy(basic_string_view{__first, __last}, std::move(__out_it));
}
-template <__fmt_char_type _CharT, __fmt_char_type _OutCharT = _CharT>
-_LIBCPP_HIDE_FROM_ABI auto __copy(const _CharT* __first, size_t __n, output_iterator<const _OutCharT&> auto __out_it)
+template <contiguous_iterator _Iterator,
+ __fmt_char_type _CharT = typename iterator_traits<_Iterator>::value_type,
+ __fmt_char_type _OutCharT = _CharT>
+_LIBCPP_HIDE_FROM_ABI auto __copy(_Iterator __first, size_t __n, output_iterator<const _OutCharT&> auto __out_it)
-> decltype(__out_it) {
- return __formatter::__copy(basic_string_view{__first, __n}, std::move(__out_it));
+ return __formatter::__copy(basic_string_view{std::to_address(__first), __n}, std::move(__out_it));
}
/// Transform wrapper.
///
/// This uses a "mass output function" of __format::__output_buffer when possible.
-template <__fmt_char_type _CharT, __fmt_char_type _OutCharT = _CharT, class _UnaryOperation>
+template <contiguous_iterator _Iterator,
+ __fmt_char_type _CharT = typename iterator_traits<_Iterator>::value_type,
+ __fmt_char_type _OutCharT = _CharT,
+ class _UnaryOperation>
_LIBCPP_HIDE_FROM_ABI auto
-__transform(const _CharT* __first,
- const _CharT* __last,
+__transform(_Iterator __first,
----------------
ldionne wrote:
> Is there a way we can do an OOB check ahead of time?
I think that might be possible, but I would approach it from the top down. So I would write this code in a generic fashion, and then I would ensure that it ends up only being called with (optionally OOB-checked) raw pointers to reduce the number of instantiations.
Also, at the end of the day, we're not instantiating this function with more unique types before/after this patch. We're just allowing the single type it's instantiated with to go from `char*` to `array<char>::iterator` seamlessly. The only additional weight we're adding is the concept constrained signature but it should only be instantiated with one iterator type regardless.
https://github.com/llvm/llvm-project/pull/74624
More information about the libcxx-commits
mailing list