@@ -136,6 +136,28 @@ inline constexpr output_iter copy(input_iter first, input_iter last, output_iter
136136template <::std::input_iterator fwd_iter, typename T>
137137inline 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)
145167template <::std::input_iterator fwd_iter, typename T>
146168inline 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