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>
13*1ee16f10SNikolas Klauser #include <__algorithm/iterator_operations.h>
144d81a46fSArthur O'Dwyer #include <__config>
15134723edSLouis Dionne #include <__iterator/iterator_traits.h>
16*1ee16f10SNikolas 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 
22134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
23134723edSLouis Dionne 
24*1ee16f10SNikolas Klauser template <class _AlgPolicy, class _BidirectionalIterator>
25134723edSLouis Dionne inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
26134723edSLouis Dionne void
__reverse_impl(_BidirectionalIterator __first,_BidirectionalIterator __last,bidirectional_iterator_tag)27*1ee16f10SNikolas Klauser __reverse_impl(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
28134723edSLouis Dionne {
29134723edSLouis Dionne     while (__first != __last)
30134723edSLouis Dionne     {
31134723edSLouis Dionne         if (__first == --__last)
32134723edSLouis Dionne             break;
33*1ee16f10SNikolas Klauser         _IterOps<_AlgPolicy>::iter_swap(__first, __last);
34134723edSLouis Dionne         ++__first;
35134723edSLouis Dionne     }
36134723edSLouis Dionne }
37134723edSLouis Dionne 
38*1ee16f10SNikolas Klauser template <class _AlgPolicy, class _RandomAccessIterator>
39134723edSLouis Dionne inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
40134723edSLouis Dionne void
__reverse_impl(_RandomAccessIterator __first,_RandomAccessIterator __last,random_access_iterator_tag)41*1ee16f10SNikolas Klauser __reverse_impl(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
42134723edSLouis Dionne {
43134723edSLouis Dionne     if (__first != __last)
44134723edSLouis Dionne         for (; __first < --__last; ++__first)
45*1ee16f10SNikolas Klauser             _IterOps<_AlgPolicy>::iter_swap(__first, __last);
46*1ee16f10SNikolas Klauser }
47*1ee16f10SNikolas Klauser 
48*1ee16f10SNikolas Klauser template <class _AlgPolicy, class _BidirectionalIterator, class _Sentinel>
49*1ee16f10SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
__reverse(_BidirectionalIterator __first,_Sentinel __last)50*1ee16f10SNikolas Klauser void __reverse(_BidirectionalIterator __first, _Sentinel __last) {
51*1ee16f10SNikolas Klauser   using _IterCategory = typename _IterOps<_AlgPolicy>::template __iterator_category<_BidirectionalIterator>;
52*1ee16f10SNikolas Klauser   std::__reverse_impl<_AlgPolicy>(std::move(__first), std::move(__last), _IterCategory());
53134723edSLouis Dionne }
54134723edSLouis Dionne 
55134723edSLouis Dionne template <class _BidirectionalIterator>
56134723edSLouis Dionne inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
57134723edSLouis Dionne void
reverse(_BidirectionalIterator __first,_BidirectionalIterator __last)58134723edSLouis Dionne reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
59134723edSLouis Dionne {
60*1ee16f10SNikolas Klauser   std::__reverse<_ClassicAlgPolicy>(std::move(__first), std::move(__last));
61134723edSLouis Dionne }
62134723edSLouis Dionne 
63134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD
64134723edSLouis Dionne 
65134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_REVERSE_H
66