xref: /freebsd-src/contrib/llvm-project/libcxx/include/__algorithm/reverse.h (revision fe6060f10f634930ff71b7c50291ddc610da2475)
1*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
2*fe6060f1SDimitry Andric //
3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*fe6060f1SDimitry Andric //
7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8*fe6060f1SDimitry Andric 
9*fe6060f1SDimitry Andric #ifndef _LIBCPP___ALGORITHM_REVERSE_H
10*fe6060f1SDimitry Andric #define _LIBCPP___ALGORITHM_REVERSE_H
11*fe6060f1SDimitry Andric 
12*fe6060f1SDimitry Andric #include <__config>
13*fe6060f1SDimitry Andric #include <__algorithm/iter_swap.h>
14*fe6060f1SDimitry Andric #include <__iterator/iterator_traits.h>
15*fe6060f1SDimitry Andric 
16*fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
17*fe6060f1SDimitry Andric #pragma GCC system_header
18*fe6060f1SDimitry Andric #endif
19*fe6060f1SDimitry Andric 
20*fe6060f1SDimitry Andric _LIBCPP_PUSH_MACROS
21*fe6060f1SDimitry Andric #include <__undef_macros>
22*fe6060f1SDimitry Andric 
23*fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
24*fe6060f1SDimitry Andric 
25*fe6060f1SDimitry Andric template <class _BidirectionalIterator>
26*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
27*fe6060f1SDimitry Andric void
28*fe6060f1SDimitry Andric __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
29*fe6060f1SDimitry Andric {
30*fe6060f1SDimitry Andric     while (__first != __last)
31*fe6060f1SDimitry Andric     {
32*fe6060f1SDimitry Andric         if (__first == --__last)
33*fe6060f1SDimitry Andric             break;
34*fe6060f1SDimitry Andric         _VSTD::iter_swap(__first, __last);
35*fe6060f1SDimitry Andric         ++__first;
36*fe6060f1SDimitry Andric     }
37*fe6060f1SDimitry Andric }
38*fe6060f1SDimitry Andric 
39*fe6060f1SDimitry Andric template <class _RandomAccessIterator>
40*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
41*fe6060f1SDimitry Andric void
42*fe6060f1SDimitry Andric __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
43*fe6060f1SDimitry Andric {
44*fe6060f1SDimitry Andric     if (__first != __last)
45*fe6060f1SDimitry Andric         for (; __first < --__last; ++__first)
46*fe6060f1SDimitry Andric             _VSTD::iter_swap(__first, __last);
47*fe6060f1SDimitry Andric }
48*fe6060f1SDimitry Andric 
49*fe6060f1SDimitry Andric template <class _BidirectionalIterator>
50*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
51*fe6060f1SDimitry Andric void
52*fe6060f1SDimitry Andric reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
53*fe6060f1SDimitry Andric {
54*fe6060f1SDimitry Andric     _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
55*fe6060f1SDimitry Andric }
56*fe6060f1SDimitry Andric 
57*fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD
58*fe6060f1SDimitry Andric 
59*fe6060f1SDimitry Andric _LIBCPP_POP_MACROS
60*fe6060f1SDimitry Andric 
61*fe6060f1SDimitry Andric #endif // _LIBCPP___ALGORITHM_REVERSE_H
62