Skip to content

Commit 470c8ae

Browse files
authored
Merge pull request #1254 from trcrsired/next
More operations for bitvec, also always use allocate_zero to allocate memory reading uninitialized memory is UB for bitvec
2 parents 47f54e9 + e5ead75 commit 470c8ae

4 files changed

Lines changed: 2504 additions & 165 deletions

File tree

include/fast_io_core_impl/freestanding/algorithm.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,28 @@ inline constexpr output_iter copy(input_iter first, input_iter last, output_iter
136136
template <::std::input_iterator fwd_iter, typename T>
137137
inline constexpr void fill(fwd_iter first, fwd_iter last, T value)
138138
{
139+
if constexpr (::std::contiguous_iterator<fwd_iter>)
140+
{
141+
if constexpr (::std::is_trivially_copyable_v<fwd_iter> &&
142+
::std::is_scalar_v<fwd_iter> && sizeof(fwd_iter) == 1)
143+
{
144+
#ifdef __cpp_if_consteval
145+
if !consteval
146+
#else
147+
if (!__builtin_is_constant_evaluated())
148+
#endif
149+
{
150+
#if FAST_IO_HAS_BUILTIN(__builtin_memset)
151+
__builtin_memset
152+
#else
153+
::std::memset
154+
#endif
155+
(::std::to_address(first),
156+
static_cast<fwd_iter>(value),
157+
static_cast<::std::size_t>(last - first));
158+
}
159+
}
160+
}
139161
for (; first != last; ++first)
140162
{
141163
*first = value;
@@ -145,6 +167,28 @@ inline constexpr void fill(fwd_iter first, fwd_iter last, T value)
145167
template <::std::input_iterator fwd_iter, typename T>
146168
inline constexpr void fill_n(fwd_iter first, ::std::size_t n, T value)
147169
{
170+
if constexpr (::std::contiguous_iterator<fwd_iter>)
171+
{
172+
if constexpr (::std::is_trivially_copyable_v<fwd_iter> &&
173+
::std::is_scalar_v<fwd_iter> && sizeof(fwd_iter) == 1)
174+
{
175+
#ifdef __cpp_if_consteval
176+
if !consteval
177+
#else
178+
if (!__builtin_is_constant_evaluated())
179+
#endif
180+
{
181+
#if FAST_IO_HAS_BUILTIN(__builtin_memset)
182+
__builtin_memset
183+
#else
184+
::std::memset
185+
#endif
186+
(::std::to_address(first),
187+
static_cast<fwd_iter>(value),
188+
n);
189+
}
190+
}
191+
}
148192
for (::std::size_t i{}; i != n; ++i)
149193
{
150194
*first = value;

0 commit comments

Comments
 (0)