1#ifndef NNGN_UTILS_RANGES_H
2#define NNGN_UTILS_RANGES_H
25 constexpr auto begin(
void)
const {
return this->
b; }
26 constexpr auto begin(
void) {
return this->
b; }
27 constexpr auto end(
void)
const {
return this->
e; }
28 constexpr auto end(
void) {
return this->
e; }
30 std::ranges::iterator_t<T>
b,
e;
41 template<std::ranges::range R>
44 if constexpr(std::ranges::sized_range<R>)
45 ret.reserve(std::ranges::size(
FWD(r)));
46 for(
auto &&x :
FWD(r))
65template<std::
size_t N>
67 return [&
s]<
auto ...I>(std::index_sequence<I...>) {
68 return std::array{
s[I]...};
69 }(std::make_index_sequence<N>{});
72template<std::
size_t N>
74 return to_array<N - 1>(
static_cast<const char*
>(
s));
77template<std::
size_t N>
78consteval auto to_array(
const std::ranges::contiguous_range
auto &r) {
79 return to_array<N>(std::data(r));
82template<std::
size_t N, std::ranges::view V>
84 using T = std::ranges::range_value_t<V>;
85 std::array<T, N> ret = {};
86 std::copy_n(std::ranges::begin(
v), N,
begin(ret));
91 const std::ranges::contiguous_range
auto &r,
const auto &x)
93 return std::ranges::less_equal{}(&*std::ranges::cbegin(r), &x)
94 && std::ranges::less{}(&x, &*std::ranges::cend(r));
98 const std::ranges::contiguous_range
auto &r,
const auto &x)
100 return std::ranges::less_equal{}(&*std::ranges::cbegin(r), &x)
101 && std::ranges::less_equal{}(&x, &*std::ranges::cend(r));
104template<std::ranges::forward_range R,
typename Proj = std::
identity>
106 return std::adjacent_find(
107 std::ranges::begin(
FWD(r)), std::ranges::end(
FWD(r)),
108 [proj]<
typename T>(
const T &lhs,
const T &rhs) {
109 return proj(lhs) + proj(T{1}) != proj(rhs);
114template<std::ranges::range R>
115constexpr void iota(R &&r, std::ranges::range_value_t<R> &&x = {}) {
116 std::iota(std::ranges::begin(r), std::ranges::end(r),
FWD(x));
119constexpr auto reduce(std::ranges::range
auto &&r) {
120 return std::reduce(std::ranges::begin(r), std::ranges::end(r));
124 std::ranges::range
auto &&r,
auto &&
init = {},
auto &&op = std::plus<>{})
127 std::ranges::begin(r), std::ranges::end(r),
133 auto last =
v->end() - 1;
134 *p = std::move(*last);
139 std::input_iterator I,
140 std::output_iterator<std::iter_value_t<I>> O>
142 std::generate(df, dl, [i =
f,
f,
l](
void)
mutable {
150constexpr T *
memcpy(T *dst, std::ranges::contiguous_range
auto &&r) {
151 const auto n = std::span{r}.size_bytes();
152 std::memcpy(dst, std::data(
FWD(r)), n);
153 return cast<char*>(dst) + n;
157constexpr T *
memmove(T *dst, std::ranges::contiguous_range
auto &&r) {
158 const auto n = std::span{r}.size_bytes();
159 std::memmove(dst, std::data(
FWD(r)), n);
160 return cast<char*>(dst) + n;
168template<
typename T>
inline constexpr bool enable_view;
169template<
typename T>
inline constexpr bool enable_borrowed_range;
174inline constexpr bool enable_view<nngn::owning_view<T>> =
true;
178inline constexpr bool enable_borrowed_range<nngn::owning_view<T>> =
true;
constexpr auto end(void) const
Definition: ranges.h:27
constexpr auto begin(void)
Definition: ranges.h:26
constexpr auto end(void)
Definition: ranges.h:28
constexpr auto begin(void) const
Definition: ranges.h:25
constexpr owning_view(const T &)=delete
constexpr owning_view(T &&r)
Definition: ranges.h:24
std::ranges::iterator_t< T > b
Definition: ranges.h:30
std::ranges::iterator_t< T > e
Definition: ranges.h:30
assert
Definition: debug.lua:3
end
Definition: entities.lua:9
function g l
Definition: plot.lua:8
void const_time_erase(auto *v, auto *p)
Definition: ranges.h:131
constexpr const R * begin(const T< R > &v)
Definition: vec.h:207
constexpr auto reduce(std::ranges::range auto &&r)
Definition: ranges.h:119
consteval auto to_array(const char *s)
Definition: ranges.h:66
constexpr void fill_with_pattern(I f, I l, O df, O dl)
Definition: ranges.h:141
void set_capacity(V *v, size_t n)
Definition: ranges.h:59
constexpr bool in_range(const std::ranges::contiguous_range auto &r, const auto &x)
Definition: ranges.h:97
constexpr bool is_sequence(R &&r, Proj proj={})
Definition: ranges.h:105
constexpr void iota(R &&r, std::ranges::range_value_t< R > &&x={})
Definition: ranges.h:115
constexpr T * memcpy(T *dst, std::ranges::contiguous_range auto &&r)
Definition: ranges.h:150
constexpr bool contains(const std::ranges::contiguous_range auto &r, const auto &x)
Definition: ranges.h:90
typedef const_iterator
Definition: ranges.h:17
constexpr T * memmove(T *dst, std::ranges::contiguous_range auto &&r)
Definition: ranges.h:157
move
Definition: camera.lua:43
v[1]
Definition: math.lua:19
friend auto operator|(R &&r, range_to)
Definition: ranges.h:42
std::chrono::seconds s
Definition: timing.cpp:6
#define FWD(...)
Definition: utils.h:18