11306b102SNikolas Klauser //===----------------------------------------------------------------------===// 21306b102SNikolas Klauser // 31306b102SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41306b102SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 51306b102SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61306b102SNikolas Klauser // 71306b102SNikolas Klauser //===----------------------------------------------------------------------===// 81306b102SNikolas Klauser 91306b102SNikolas Klauser #ifndef _LIBCPP___ALGORITHM_RANGES_COUNT_IF_H 101306b102SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_COUNT_IF_H 111306b102SNikolas Klauser 12*eab7be5dSNikolas Klauser #include <__algorithm/count_if.h> 13*eab7be5dSNikolas Klauser #include <__algorithm/iterator_operations.h> 141306b102SNikolas Klauser #include <__config> 151306b102SNikolas Klauser #include <__functional/identity.h> 161306b102SNikolas Klauser #include <__functional/ranges_operations.h> 171306b102SNikolas Klauser #include <__iterator/concepts.h> 181306b102SNikolas Klauser #include <__iterator/incrementable_traits.h> 193cd4531bSNikolas Klauser #include <__iterator/iterator_traits.h> 201306b102SNikolas Klauser #include <__iterator/projected.h> 211306b102SNikolas Klauser #include <__ranges/access.h> 221306b102SNikolas Klauser #include <__ranges/concepts.h> 231306b102SNikolas Klauser #include <__utility/move.h> 241306b102SNikolas Klauser 251306b102SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 261306b102SNikolas Klauser # pragma GCC system_header 271306b102SNikolas Klauser #endif 281306b102SNikolas Klauser 297b462251SLouis Dionne _LIBCPP_PUSH_MACROS 307b462251SLouis Dionne #include <__undef_macros> 317b462251SLouis Dionne 324f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 331306b102SNikolas Klauser 341306b102SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 351306b102SNikolas Klauser 361306b102SNikolas Klauser namespace ranges { 37d10dc5a0SChristopher Di Bella struct __count_if { 385aa03b64SLouis Dionne template <input_iterator _Iter, 395aa03b64SLouis Dionne sentinel_for<_Iter> _Sent, 405aa03b64SLouis Dionne class _Proj = identity, 411306b102SNikolas Klauser indirect_unary_predicate<projected<_Iter, _Proj>> _Predicate> 4283bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Iter> 435aa03b64SLouis Dionne operator()(_Iter __first, _Sent __last, _Predicate __pred, _Proj __proj = {}) const { 44*eab7be5dSNikolas Klauser return std::__count_if<_RangeAlgPolicy>(std::move(__first), std::move(__last), __pred, __proj); 451306b102SNikolas Klauser } 461306b102SNikolas Klauser 475aa03b64SLouis Dionne template <input_range _Range, 485aa03b64SLouis Dionne class _Proj = identity, 491306b102SNikolas Klauser indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>> _Predicate> 5083bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr range_difference_t<_Range> 515aa03b64SLouis Dionne operator()(_Range&& __r, _Predicate __pred, _Proj __proj = {}) const { 52*eab7be5dSNikolas Klauser return std::__count_if<_RangeAlgPolicy>(ranges::begin(__r), ranges::end(__r), __pred, __proj); 531306b102SNikolas Klauser } 541306b102SNikolas Klauser }; 551306b102SNikolas Klauser 561306b102SNikolas Klauser inline namespace __cpo { 57d10dc5a0SChristopher Di Bella inline constexpr auto count_if = __count_if{}; 581306b102SNikolas Klauser } // namespace __cpo 591306b102SNikolas Klauser } // namespace ranges 601306b102SNikolas Klauser 611306b102SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 621306b102SNikolas Klauser 634f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 641306b102SNikolas Klauser 657b462251SLouis Dionne _LIBCPP_POP_MACROS 667b462251SLouis Dionne 671306b102SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_COUNT_IF_H 68