17 #ifndef OPENKALMAN_COMPATIBILITY_VIEWS_SINGLE_HPP 18 #define OPENKALMAN_COMPATIBILITY_VIEWS_SINGLE_HPP 26 #ifdef __cpp_lib_ranges 27 using std::ranges::single_view;
30 using std::ranges::views::single;
38 template<std::move_constructible T> requires std::is_object_v<T>
44 static_assert(stdex::move_constructible<T> and std::is_object_v<T>);
52 single_view() requires std::default_initializable<T> =
default;
54 template<
bool Enable = true, std::enable_if_t<Enable and stdex::default_initializable<T>,
int> = 0>
65 single_view(
const T& t) requires std::copy_constructible<T> : value_ {t} {}
66 requires std::copy_constructible<T>
68 template<
bool Enable = true, std::enable_if_t<stdex::copy_constructible<T>,
int> = 0>
85 begin() noexcept {
return data(); }
89 begin() const noexcept {
return data(); }
96 end() noexcept {
return data() + 1_uz; }
100 end() const noexcept {
return data() + 1_uz; }
106 static constexpr
auto 113 static constexpr std::size_t
114 size() noexcept {
return 1_uz; }
121 data() noexcept {
return std::addressof(*value_); }
128 data() const noexcept {
return std::addressof(*value_); }
140 template<
typename Arg>
144 #ifdef __cpp_impl_three_way_comparison 146 constexpr std::partial_ordering
149 return get(lhs, std::integral_constant<std::size_t, 0>{}) <=> rhs;
156 return stdex::is_eq(operator<=>(lhs, rhs));
160 constexpr
bool operator==(
const single_view<T>& lhs,
const T& rhs) noexcept {
return get(lhs, std::integral_constant<std::size_t, 0>{}) == rhs; }
163 constexpr
bool operator!=(
const single_view<T>& lhs,
const T& rhs) noexcept {
return get(lhs, std::integral_constant<std::size_t, 0>{}) != rhs; }
166 constexpr
bool operator<(const single_view<T>& lhs,
const T& rhs) noexcept {
return get(lhs, std::integral_constant<std::size_t, 0>{}) < rhs; }
169 constexpr
bool operator>(
const single_view<T>& lhs,
const T& rhs) noexcept {
return get(lhs, std::integral_constant<std::size_t, 0>{}) > rhs; }
172 constexpr
bool operator<=(const single_view<T>& lhs,
const T& rhs) noexcept {
return get(lhs, std::integral_constant<std::size_t, 0>{}) <= rhs; }
175 constexpr
bool operator>=(
const single_view<T>& lhs,
const T& rhs) noexcept {
return get(lhs, std::integral_constant<std::size_t, 0>{}) >= rhs; }
179 constexpr
bool operator==(
const T& lhs,
const single_view<T>& rhs) noexcept {
return lhs ==
get(rhs, std::integral_constant<std::size_t, 0>{}); }
182 constexpr
bool operator!=(
const T& lhs,
const single_view<T>& rhs) noexcept {
return lhs !=
get(rhs, std::integral_constant<std::size_t, 0>{}); }
185 constexpr
bool operator<(const T& lhs, const single_view<T>& rhs) noexcept {
return lhs < get(rhs, std::integral_constant<std::size_t, 0>{}); }
188 constexpr
bool operator>(
const T& lhs,
const single_view<T>& rhs) noexcept {
return lhs >
get(rhs, std::integral_constant<std::size_t, 0>{}); }
191 constexpr
bool operator<=(const T& lhs, const single_view<T>& rhs) noexcept {
return lhs <= get(rhs, std::integral_constant<std::size_t, 0>{}); }
194 constexpr
bool operator>=(
const T& lhs,
const single_view<T>& rhs) noexcept {
return lhs >=
get(rhs, std::integral_constant<std::size_t, 0>{}); }
static constexpr auto empty() noexcept
Definition: single.hpp:107
constexpr T * end() noexcept
Equivalent to data() + 1;.
Definition: single.hpp:96
constexpr detail::single_impl single
Equivalent to std::ranges::views::single.
Definition: single.hpp:217
Definition: view_interface.hpp:32
constexpr const T * end() const noexcept
Definition: single.hpp:100
constexpr T * data() noexcept
A pointer to the contained value.
Definition: single.hpp:121
constexpr T * begin() noexcept
Equivalent to data();.
Definition: single.hpp:85
static constexpr std::size_t size() noexcept
The size of the resulting object (which is always 1)
Definition: single.hpp:114
Definition: common.hpp:200
constexpr single_view()
Default constructor.
Definition: single.hpp:56
Definition: single.hpp:203
constexpr single_view(T &&t)
Construct from an object convertible to type T.
Definition: single.hpp:78
constexpr const T * begin() const noexcept
Definition: single.hpp:89
Equivalent to std::ranges::single_view.
Definition: single.hpp:42
constexpr const T * data() const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: single.hpp:128
constexpr single_view(const T &t)
Construct from an object convertible to type T.
Definition: single.hpp:70