173ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===// 273ebcabfSKonstantin Varlamov // 373ebcabfSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 473ebcabfSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information. 573ebcabfSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 673ebcabfSKonstantin Varlamov // 773ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===// 873ebcabfSKonstantin Varlamov 973ebcabfSKonstantin Varlamov #ifndef _LIBCPP___ALGORITHM_RANGES_UNIQUE_H 1073ebcabfSKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_UNIQUE_H 1173ebcabfSKonstantin Varlamov 1272f57e3aSHui Xie #include <__algorithm/iterator_operations.h> 1373ebcabfSKonstantin Varlamov #include <__algorithm/make_projected.h> 1473ebcabfSKonstantin Varlamov #include <__algorithm/unique.h> 1573ebcabfSKonstantin Varlamov #include <__config> 1673ebcabfSKonstantin Varlamov #include <__functional/identity.h> 1773ebcabfSKonstantin Varlamov #include <__functional/invoke.h> 1873ebcabfSKonstantin Varlamov #include <__functional/ranges_operations.h> 1973ebcabfSKonstantin Varlamov #include <__iterator/concepts.h> 2073ebcabfSKonstantin Varlamov #include <__iterator/iterator_traits.h> 2173ebcabfSKonstantin Varlamov #include <__iterator/permutable.h> 2273ebcabfSKonstantin Varlamov #include <__iterator/projected.h> 2373ebcabfSKonstantin Varlamov #include <__ranges/access.h> 2473ebcabfSKonstantin Varlamov #include <__ranges/concepts.h> 2573ebcabfSKonstantin Varlamov #include <__ranges/dangling.h> 2673ebcabfSKonstantin Varlamov #include <__ranges/subrange.h> 2773ebcabfSKonstantin Varlamov #include <__utility/forward.h> 2873ebcabfSKonstantin Varlamov #include <__utility/move.h> 29d5e26775SNikolas Klauser #include <__utility/pair.h> 3073ebcabfSKonstantin Varlamov 3173ebcabfSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 3273ebcabfSKonstantin Varlamov # pragma GCC system_header 3373ebcabfSKonstantin Varlamov #endif 3473ebcabfSKonstantin Varlamov 357b462251SLouis Dionne _LIBCPP_PUSH_MACROS 367b462251SLouis Dionne #include <__undef_macros> 377b462251SLouis Dionne 384f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 3973ebcabfSKonstantin Varlamov 4073ebcabfSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD 4173ebcabfSKonstantin Varlamov 4273ebcabfSKonstantin Varlamov namespace ranges { 43*d10dc5a0SChristopher Di Bella struct __unique { 445aa03b64SLouis Dionne template <permutable _Iter, 4572f57e3aSHui Xie sentinel_for<_Iter> _Sent, 4672f57e3aSHui Xie class _Proj = identity, 4773ebcabfSKonstantin Varlamov indirect_equivalence_relation<projected<_Iter, _Proj>> _Comp = ranges::equal_to> 4883bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr subrange<_Iter> 4972f57e3aSHui Xie operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { 505aa03b64SLouis Dionne auto __ret = 515aa03b64SLouis Dionne std::__unique<_RangeAlgPolicy>(std::move(__first), std::move(__last), std::__make_projected(__comp, __proj)); 5272f57e3aSHui Xie return {std::move(__ret.first), std::move(__ret.second)}; 5373ebcabfSKonstantin Varlamov } 5473ebcabfSKonstantin Varlamov 555aa03b64SLouis Dionne template <forward_range _Range, 5672f57e3aSHui Xie class _Proj = identity, 5773ebcabfSKonstantin Varlamov indirect_equivalence_relation<projected<iterator_t<_Range>, _Proj>> _Comp = ranges::equal_to> 5873ebcabfSKonstantin Varlamov requires permutable<iterator_t<_Range>> 5983bc7b57SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr borrowed_subrange_t<_Range> 6072f57e3aSHui Xie operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { 6172f57e3aSHui Xie auto __ret = std::__unique<_RangeAlgPolicy>( 62db7d7959SKonstantin Varlamov ranges::begin(__range), ranges::end(__range), std::__make_projected(__comp, __proj)); 6372f57e3aSHui Xie return {std::move(__ret.first), std::move(__ret.second)}; 6473ebcabfSKonstantin Varlamov } 6573ebcabfSKonstantin Varlamov }; 6673ebcabfSKonstantin Varlamov 6773ebcabfSKonstantin Varlamov inline namespace __cpo { 68*d10dc5a0SChristopher Di Bella inline constexpr auto unique = __unique{}; 6973ebcabfSKonstantin Varlamov } // namespace __cpo 7073ebcabfSKonstantin Varlamov } // namespace ranges 7173ebcabfSKonstantin Varlamov 7273ebcabfSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD 7373ebcabfSKonstantin Varlamov 744f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 7573ebcabfSKonstantin Varlamov 767b462251SLouis Dionne _LIBCPP_POP_MACROS 777b462251SLouis Dionne 7873ebcabfSKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_UNIQUE_H 79