17af89a37SNikolas Klauser //===----------------------------------------------------------------------===// 27af89a37SNikolas Klauser // 37af89a37SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47af89a37SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 57af89a37SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67af89a37SNikolas Klauser // 77af89a37SNikolas Klauser //===----------------------------------------------------------------------===// 87af89a37SNikolas Klauser 97af89a37SNikolas Klauser #ifndef _LIBCPP___ALGORITHM_RANGES_FILL_H 107af89a37SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_FILL_H 117af89a37SNikolas Klauser 127af89a37SNikolas Klauser #include <__algorithm/ranges_fill_n.h> 137af89a37SNikolas Klauser #include <__config> 147af89a37SNikolas Klauser #include <__iterator/concepts.h> 157af89a37SNikolas Klauser #include <__ranges/access.h> 167af89a37SNikolas Klauser #include <__ranges/concepts.h> 177af89a37SNikolas Klauser #include <__ranges/dangling.h> 187af89a37SNikolas Klauser 197af89a37SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 207af89a37SNikolas Klauser # pragma GCC system_header 217af89a37SNikolas Klauser #endif 227af89a37SNikolas Klauser 237b462251SLouis Dionne _LIBCPP_PUSH_MACROS 247b462251SLouis Dionne #include <__undef_macros> 257b462251SLouis Dionne 264f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 277af89a37SNikolas Klauser 287af89a37SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 297af89a37SNikolas Klauser 307af89a37SNikolas Klauser namespace ranges { 31*d10dc5a0SChristopher Di Bella struct __fill { 327af89a37SNikolas Klauser template <class _Type, output_iterator<const _Type&> _Iter, sentinel_for<_Iter> _Sent> 335aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr _Iter operator()(_Iter __first, _Sent __last, const _Type& __value) const { 34a7c3379cSKonstantin Varlamov if constexpr (random_access_iterator<_Iter> && sized_sentinel_for<_Sent, _Iter>) { 357af89a37SNikolas Klauser return ranges::fill_n(__first, __last - __first, __value); 367af89a37SNikolas Klauser } else { 377af89a37SNikolas Klauser for (; __first != __last; ++__first) 387af89a37SNikolas Klauser *__first = __value; 397af89a37SNikolas Klauser return __first; 407af89a37SNikolas Klauser } 417af89a37SNikolas Klauser } 427af89a37SNikolas Klauser 437af89a37SNikolas Klauser template <class _Type, output_range<const _Type&> _Range> 445aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr borrowed_iterator_t<_Range> operator()(_Range&& __range, const _Type& __value) const { 457af89a37SNikolas Klauser return (*this)(ranges::begin(__range), ranges::end(__range), __value); 467af89a37SNikolas Klauser } 477af89a37SNikolas Klauser }; 487af89a37SNikolas Klauser 497af89a37SNikolas Klauser inline namespace __cpo { 50*d10dc5a0SChristopher Di Bella inline constexpr auto fill = __fill{}; 517af89a37SNikolas Klauser } // namespace __cpo 527af89a37SNikolas Klauser } // namespace ranges 537af89a37SNikolas Klauser 547af89a37SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 557af89a37SNikolas Klauser 564f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 577af89a37SNikolas Klauser 587b462251SLouis Dionne _LIBCPP_POP_MACROS 597b462251SLouis Dionne 607af89a37SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_FILL_H 61