1134723edSLouis Dionne //===----------------------------------------------------------------------===// 2134723edSLouis Dionne // 3134723edSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4134723edSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5134723edSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6134723edSLouis Dionne // 7134723edSLouis Dionne //===----------------------------------------------------------------------===// 8134723edSLouis Dionne 9134723edSLouis Dionne #ifndef _LIBCPP___ALGORITHM_UNIQUE_H 10134723edSLouis Dionne #define _LIBCPP___ALGORITHM_UNIQUE_H 11134723edSLouis Dionne 12134723edSLouis Dionne #include <__algorithm/adjacent_find.h> 134d81a46fSArthur O'Dwyer #include <__algorithm/comp.h> 1472f57e3aSHui Xie #include <__algorithm/iterator_operations.h> 154d81a46fSArthur O'Dwyer #include <__config> 16*eab7be5dSNikolas Klauser #include <__functional/identity.h> 17134723edSLouis Dionne #include <__iterator/iterator_traits.h> 186adbc83eSChristopher Di Bella #include <__utility/move.h> 1972f57e3aSHui Xie #include <__utility/pair.h> 20134723edSLouis Dionne 21134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 22134723edSLouis Dionne # pragma GCC system_header 23134723edSLouis Dionne #endif 24134723edSLouis Dionne 257b462251SLouis Dionne _LIBCPP_PUSH_MACROS 267b462251SLouis Dionne #include <__undef_macros> 277b462251SLouis Dionne 28134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 29134723edSLouis Dionne 30134723edSLouis Dionne // unique 31134723edSLouis Dionne 3272f57e3aSHui Xie template <class _AlgPolicy, class _Iter, class _Sent, class _BinaryPredicate> 3317e0686aSNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 std::pair<_Iter, _Iter> 3472f57e3aSHui Xie __unique(_Iter __first, _Sent __last, _BinaryPredicate&& __pred) { 35*eab7be5dSNikolas Klauser __identity __proj; 36*eab7be5dSNikolas Klauser __first = std::__adjacent_find(__first, __last, __pred, __proj); 3772f57e3aSHui Xie if (__first != __last) { 38134723edSLouis Dionne // ... a a ? ... 39134723edSLouis Dionne // f i 4072f57e3aSHui Xie _Iter __i = __first; 41134723edSLouis Dionne for (++__i; ++__i != __last;) 42134723edSLouis Dionne if (!__pred(*__first, *__i)) 4372f57e3aSHui Xie *++__first = _IterOps<_AlgPolicy>::__iter_move(__i); 44134723edSLouis Dionne ++__first; 4572f57e3aSHui Xie return std::pair<_Iter, _Iter>(std::move(__first), std::move(__i)); 46134723edSLouis Dionne } 4772f57e3aSHui Xie return std::pair<_Iter, _Iter>(__first, __first); 4872f57e3aSHui Xie } 4972f57e3aSHui Xie 5072f57e3aSHui Xie template <class _ForwardIterator, class _BinaryPredicate> 5117e0686aSNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator 5272f57e3aSHui Xie unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) { 5372f57e3aSHui Xie return std::__unique<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __pred).first; 54134723edSLouis Dionne } 55134723edSLouis Dionne 56134723edSLouis Dionne template <class _ForwardIterator> 5717e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator 5872f57e3aSHui Xie unique(_ForwardIterator __first, _ForwardIterator __last) { 59e07ca2aeSAlvin Wong return std::unique(__first, __last, __equal_to()); 60134723edSLouis Dionne } 61134723edSLouis Dionne 62134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD 63134723edSLouis Dionne 647b462251SLouis Dionne _LIBCPP_POP_MACROS 657b462251SLouis Dionne 66134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_UNIQUE_H 67