1f8cbe3cdSNikolas Klauser //===----------------------------------------------------------------------===// 2f8cbe3cdSNikolas Klauser // 3f8cbe3cdSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f8cbe3cdSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 5f8cbe3cdSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f8cbe3cdSNikolas Klauser // 7f8cbe3cdSNikolas Klauser //===----------------------------------------------------------------------===// 8f8cbe3cdSNikolas Klauser 9f8cbe3cdSNikolas Klauser #ifndef _LIBCPP___ALGORITHM_RANGES_REMOVE_H 10f8cbe3cdSNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_REMOVE_H 11f8cbe3cdSNikolas Klauser #include <__config> 12f8cbe3cdSNikolas Klauser 13f8cbe3cdSNikolas Klauser #include <__algorithm/ranges_remove_if.h> 14f8cbe3cdSNikolas Klauser #include <__functional/identity.h> 15f8cbe3cdSNikolas Klauser #include <__functional/ranges_operations.h> 16f8cbe3cdSNikolas Klauser #include <__iterator/concepts.h> 17f8cbe3cdSNikolas Klauser #include <__iterator/permutable.h> 18f8cbe3cdSNikolas Klauser #include <__iterator/projected.h> 19f8cbe3cdSNikolas Klauser #include <__ranges/access.h> 20f8cbe3cdSNikolas Klauser #include <__ranges/concepts.h> 21f8cbe3cdSNikolas Klauser #include <__ranges/subrange.h> 22f8cbe3cdSNikolas Klauser #include <__utility/move.h> 23f8cbe3cdSNikolas Klauser 24f8cbe3cdSNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 25f8cbe3cdSNikolas Klauser # pragma GCC system_header 26f8cbe3cdSNikolas Klauser #endif 27f8cbe3cdSNikolas Klauser 287b462251SLouis Dionne _LIBCPP_PUSH_MACROS 297b462251SLouis Dionne #include <__undef_macros> 307b462251SLouis Dionne 314f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 32f8cbe3cdSNikolas Klauser 33f8cbe3cdSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 34f8cbe3cdSNikolas Klauser 35f8cbe3cdSNikolas Klauser namespace ranges { 36*d10dc5a0SChristopher Di Bella struct __remove { 37f8cbe3cdSNikolas Klauser template <permutable _Iter, sentinel_for<_Iter> _Sent, class _Type, class _Proj = identity> 38f8cbe3cdSNikolas Klauser requires indirect_binary_predicate<ranges::equal_to, projected<_Iter, _Proj>, const _Type*> 3983bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr subrange<_Iter> 405aa03b64SLouis Dionne operator()(_Iter __first, _Sent __last, const _Type& __value, _Proj __proj = {}) const { 4102540b2fSLouis Dionne auto __pred = [&](auto&& __other) -> bool { return __value == __other; }; 42f8cbe3cdSNikolas Klauser return ranges::__remove_if_impl(std::move(__first), std::move(__last), __pred, __proj); 43f8cbe3cdSNikolas Klauser } 44f8cbe3cdSNikolas Klauser 45f8cbe3cdSNikolas Klauser template <forward_range _Range, class _Type, class _Proj = identity> 465aa03b64SLouis Dionne requires permutable<iterator_t<_Range>> && 475aa03b64SLouis Dionne indirect_binary_predicate<ranges::equal_to, projected<iterator_t<_Range>, _Proj>, const _Type*> 4883bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr borrowed_subrange_t<_Range> 495aa03b64SLouis Dionne operator()(_Range&& __range, const _Type& __value, _Proj __proj = {}) const { 5002540b2fSLouis Dionne auto __pred = [&](auto&& __other) -> bool { return __value == __other; }; 51f8cbe3cdSNikolas Klauser return ranges::__remove_if_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); 52f8cbe3cdSNikolas Klauser } 53f8cbe3cdSNikolas Klauser }; 54f8cbe3cdSNikolas Klauser 55f8cbe3cdSNikolas Klauser inline namespace __cpo { 56*d10dc5a0SChristopher Di Bella inline constexpr auto remove = __remove{}; 57f8cbe3cdSNikolas Klauser } // namespace __cpo 58f8cbe3cdSNikolas Klauser } // namespace ranges 59f8cbe3cdSNikolas Klauser 60f8cbe3cdSNikolas Klauser _LIBCPP_END_NAMESPACE_STD 61f8cbe3cdSNikolas Klauser 624f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 63f8cbe3cdSNikolas Klauser 647b462251SLouis Dionne _LIBCPP_POP_MACROS 657b462251SLouis Dionne 66f8cbe3cdSNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_REMOVE_H 67