xref: /llvm-project/libcxx/include/__algorithm/reverse.h (revision 7b4622514d232ce5f7110dd8b20d90e81127c467)
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_REVERSE_H
10134723edSLouis Dionne #define _LIBCPP___ALGORITHM_REVERSE_H
11134723edSLouis Dionne 
126adbc83eSChristopher Di Bella #include <__algorithm/iter_swap.h>
1368264b64SNikolas Klauser #include <__algorithm/iterator_operations.h>
144d81a46fSArthur O'Dwyer #include <__config>
15134723edSLouis Dionne #include <__iterator/iterator_traits.h>
1668264b64SNikolas Klauser #include <__utility/move.h>
17134723edSLouis Dionne 
18134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
19134723edSLouis Dionne #  pragma GCC system_header
20134723edSLouis Dionne #endif
21134723edSLouis Dionne 
22*7b462251SLouis Dionne _LIBCPP_PUSH_MACROS
23*7b462251SLouis Dionne #include <__undef_macros>
24*7b462251SLouis Dionne 
25134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
26134723edSLouis Dionne 
2768264b64SNikolas Klauser template <class _AlgPolicy, class _BidirectionalIterator>
289783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
__reverse_impl(_BidirectionalIterator __first,_BidirectionalIterator __last,bidirectional_iterator_tag)299783f28cSLouis Dionne __reverse_impl(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag) {
309783f28cSLouis Dionne   while (__first != __last) {
31134723edSLouis Dionne     if (__first == --__last)
32134723edSLouis Dionne       break;
3368264b64SNikolas Klauser     _IterOps<_AlgPolicy>::iter_swap(__first, __last);
34134723edSLouis Dionne     ++__first;
35134723edSLouis Dionne   }
36134723edSLouis Dionne }
37134723edSLouis Dionne 
3868264b64SNikolas Klauser template <class _AlgPolicy, class _RandomAccessIterator>
399783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
__reverse_impl(_RandomAccessIterator __first,_RandomAccessIterator __last,random_access_iterator_tag)409783f28cSLouis Dionne __reverse_impl(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag) {
41134723edSLouis Dionne   if (__first != __last)
42134723edSLouis Dionne     for (; __first < --__last; ++__first)
4368264b64SNikolas Klauser       _IterOps<_AlgPolicy>::iter_swap(__first, __last);
4468264b64SNikolas Klauser }
4568264b64SNikolas Klauser 
4668264b64SNikolas Klauser template <class _AlgPolicy, class _BidirectionalIterator, class _Sentinel>
__reverse(_BidirectionalIterator __first,_Sentinel __last)479783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __reverse(_BidirectionalIterator __first, _Sentinel __last) {
4868264b64SNikolas Klauser   using _IterCategory = typename _IterOps<_AlgPolicy>::template __iterator_category<_BidirectionalIterator>;
4968264b64SNikolas Klauser   std::__reverse_impl<_AlgPolicy>(std::move(__first), std::move(__last), _IterCategory());
50134723edSLouis Dionne }
51134723edSLouis Dionne 
52134723edSLouis Dionne template <class _BidirectionalIterator>
539783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
reverse(_BidirectionalIterator __first,_BidirectionalIterator __last)549783f28cSLouis Dionne reverse(_BidirectionalIterator __first, _BidirectionalIterator __last) {
5568264b64SNikolas Klauser   std::__reverse<_ClassicAlgPolicy>(std::move(__first), std::move(__last));
56134723edSLouis Dionne }
57134723edSLouis Dionne 
58134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD
59134723edSLouis Dionne 
60*7b462251SLouis Dionne _LIBCPP_POP_MACROS
61*7b462251SLouis Dionne 
62134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_REVERSE_H
63