VCCC  2024.05
VisualCamp Common C++ library
reverse.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2/3/24.
3 //
4 
5 #ifndef VCCC_RANGES_VIEWS_REVERSE_HPP
6 #define VCCC_RANGES_VIEWS_REVERSE_HPP
7 
8 #include <iterator>
9 #include <type_traits>
10 #include <utility>
11 
21 
22 namespace vccc {
23 namespace ranges {
24 namespace views {
25 namespace detail {
26 
27 using vccc::detail::return_category;
28 
29 class reverse_adaptor_object : public range_adaptor_closure<reverse_adaptor_object> {
30  template<typename R>
31  struct is_reverse_subrange : return_category<0> {};
32  template<typename I, subrange_kind K>
33  struct is_reverse_subrange<subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K>>
34  : return_category<2, subrange<I, I, K>> {};
35 
36  template<typename R>
37  using reverse_tag = std::conditional_t<
39  is_reverse_subrange<remove_cvref_t<R>>
40  >;
41 
42  template<typename R>
43  constexpr auto call(R&& r, return_category<1>) const {
44  return std::forward<decltype(std::forward<R>(r).base())>(std::forward<R>(r).base());
45  }
46 
47  template<typename R, typename I>
48  constexpr auto call(R&& r, return_category<2, subrange<I, I, subrange_kind::sized>>) const {
49  return subrange<I, I, subrange_kind::sized>(r.end().base(), r.begin().base(), r.size());
50  }
51 
52  template<typename R, typename I>
53  constexpr auto call(R&& r, return_category<2, subrange<I, I, subrange_kind::unsized>>) const {
54  return subrange<I, I, subrange_kind::unsized>(r.end().base(), r.begin().base());
55  }
56 
57  template<typename R>
58  constexpr auto call(R&& r, return_category<0>) const {
59  return reverse_view<all_t<R>>(std::forward<R>(r));
60  }
61 
62  public:
64  constexpr auto operator()(R&& r) const {
65  return call(std::forward<R>(r), reverse_tag<R>{});
66  }
67 };
68 
69 } // namespace detail
70 
73 
75 
77 
78 } // namespace views
79 } // namespace ranges
80 } // namespace vccc
81 
82 #endif // VCCC_RANGES_VIEWS_REVERSE_HPP
A range adaptor that represents a view of underlying view with reversed order.
Definition: reverse_view.hpp:60
Definition: subrange.hpp:151
constexpr auto operator()(R &&r) const
Definition: reverse.hpp:64
constexpr VCCC_INLINE_OR_STATIC detail::reverse_adaptor_object reverse
Definition: reverse.hpp:74
#define VCCC_INLINE_OR_STATIC
Definition: inline_or_static.hpp:9
Definition: matrix.hpp:495
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: is_specialization.hpp:30
helper base class template for defining a range adaptor closure object
Definition: range_adaptor_closure.hpp:96