17 #ifndef OPENKALMAN_COMPATIBILITY_RANGES_VIEW_INTERFACE_HPP 18 #define OPENKALMAN_COMPATIBILITY_RANGES_VIEW_INTERFACE_HPP 24 #ifdef __cpp_lib_ranges 25 using std::ranges::view_interface;
31 template<
typename Derived>
34 template<
typename D = Derived, std::enable_if_t<sized_range<D> or forward_range<D>,
int> = 0>
35 [[nodiscard]] constexpr
bool 38 auto& derived =
static_cast<D&
>(*this);
40 else return begin(derived) == end(derived);
43 template<
typename D = const Derived, std::enable_if_t<sized_range<D> or forward_range<D>,
int> = 0>
44 [[nodiscard]] constexpr
bool 47 auto& derived =
static_cast<D&
>(*this);
49 else return begin(derived) == end(derived);
53 template<
typename D = Derived, std::enable_if_t<range<D>,
int> = 0>
55 cbegin() {
return stdex::ranges::cbegin(static_cast<D&>(*
this)); }
57 template<
typename D = const Derived, std::enable_if_t<range<D>,
int> = 0>
59 cbegin()
const {
return stdex::ranges::cbegin(static_cast<D&>(*
this)); }
62 template<
typename D = Derived, std::enable_if_t<range<D>,
int> = 0>
64 cend() {
return stdex::ranges::cend(static_cast<D&>(*
this)); }
66 template<
typename D = const Derived, std::enable_if_t<range<D>,
int> = 0>
68 cend()
const {
return stdex::ranges::cend(static_cast<D&>(*
this)); }
71 template<
typename D = Derived,
typename = std::
void_t<decltype(stdex::ranges::empty(std::declval<D&>()))>>
73 operator bool() {
return not stdex::ranges::empty(static_cast<D&>(*
this)); }
75 template<
typename D = const Derived,
typename = std::
void_t<decltype(stdex::ranges::empty(std::declval<D&>()))>>
77 operator bool()
const {
return not stdex::ranges::empty(static_cast<D&>(*
this)); }
80 template<
typename D = Derived, std::enable_if_t<forward_range<D>,
int> = 0,
81 typename = std::
void_t<decltype(end(std::declval<D&>()) - begin(std::declval<D&>()))>>
83 size() {
return end(static_cast<D&>(*
this)) - begin(static_cast<D&>(*
this)); }
85 template<
typename D = const Derived, std::enable_if_t<forward_range<D>,
int> = 0,
86 typename = std::
void_t<decltype(end(std::declval<D&>()) - begin(std::declval<D&>()))>>
88 size()
const {
return end(static_cast<D&>(*
this)) - begin(static_cast<D&>(*
this)); }
91 template<
typename D = Derived, std::enable_if_t<forward_range<D>,
int> = 0>
92 constexpr decltype(
auto)
93 front() {
return *begin(static_cast<D&>(*
this)); }
95 template<
typename D = const Derived, std::enable_if_t<forward_range<D>,
int> = 0>
96 constexpr decltype(
auto)
97 front()
const {
return *begin(static_cast<D&>(*
this)); }
100 template<
typename D = Derived, std::enable_if_t<b
idirectional_range<D> and common_range<D>,
int> = 0>
101 constexpr decltype(
auto)
102 back() {
return *std::prev(end(static_cast<D&>(*
this))); }
104 template<
typename D = const Derived, std::enable_if_t<b
idirectional_range<D> and common_range<D>,
int> = 0>
105 constexpr decltype(
auto)
106 back()
const {
return *std::prev(end(static_cast<D&>(*
this))); }
109 template<
typename D = Derived, std::enable_if_t<random_access_range<D>,
int> = 0>
110 constexpr decltype(
auto)
111 operator[](range_difference_t<D> n) {
return begin(static_cast<D&>(*
this))[n]; }
113 template<
typename D = const Derived, std::enable_if_t<random_access_range<D>,
int> = 0>
114 constexpr decltype(
auto)
115 operator[](range_difference_t<D> n)
const {
return begin(static_cast<D&>(*
this))[n]; }
Definition: view_interface.hpp:32
Definition: common.hpp:200
constexpr bool size
T is either an index representing a size, or unbounded_size_t, which indicates that the size is unbou...
Definition: size.hpp:65