17 #ifndef OPENKALMAN_COMPATIBILITY_RANGES_VIEW_INTERFACE_HPP 18 #define OPENKALMAN_COMPATIBILITY_RANGES_VIEW_INTERFACE_HPP 20 #ifndef __cpp_lib_ranges 22 #include <type_traits> 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);
39 if constexpr (sized_range<D>)
return ranges::size(derived) == 0;
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);
48 if constexpr (sized_range<D>)
return ranges::size(derived) == 0;
49 else return begin(derived) == end(derived);
53 template<
typename D = Derived, std::enable_if_t<range<D>,
int> = 0>
55 cbegin() {
return ranges::cbegin(static_cast<D&>(*
this)); }
57 template<
typename D = const Derived, std::enable_if_t<range<D>,
int> = 0>
59 cbegin()
const {
return ranges::cbegin(static_cast<D&>(*
this)); }
62 template<
typename D = Derived, std::enable_if_t<range<D>,
int> = 0>
64 cend() {
return ranges::cend(static_cast<D&>(*
this)); }
66 template<
typename D = const Derived, std::enable_if_t<range<D>,
int> = 0>
68 cend()
const {
return ranges::cend(static_cast<D&>(*
this)); }
71 template<
typename D = Derived,
typename = std::
void_t<decltype(ranges::empty(std::declval<D&>()))>>
73 operator bool() {
return not ranges::empty(static_cast<D&>(*
this)); }
75 template<
typename D = const Derived,
typename = std::
void_t<decltype(ranges::empty(std::declval<D&>()))>>
77 operator bool()
const {
return not 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]; }
124 #endif //OPENKALMAN_COMPATIBILITY_RANGES_VIEW_INTERFACE_HPP Definition: view_interface.hpp:32
Definition: range-access.hpp:25
constexpr bool size
T is either an index representing a size, or void which represents that there is no size...
Definition: size.hpp:32
Definitions implementing features of the c++ ranges library for compatibility.