15#ifndef JOAQUINTIDES_TRANSRANGERS_HPP
16#define JOAQUINTIDES_TRANSRANGERS_HPP
29# define TRANSRANGERS_HOT __attribute__((flatten))
30# define TRANSRANGERS_HOT_MUTABLE __attribute__((flatten)) mutable
31#elif defined(__GNUC__)
32# define TRANSRANGERS_HOT __attribute__((flatten))
33# define TRANSRANGERS_HOT_MUTABLE mutable __attribute__((flatten))
35# define TRANSRANGERS_HOT [[msvc::forceinline]]
36# define TRANSRANGERS_HOT_MUTABLE mutable [[msvc::forceinline]]
48 template <
typename Range>
auto all(Range&& rng) {
51 using cursor =
decltype(begin(rng));
53 return ranger<cursor>([first = begin(rng), last = end(rng)](
auto dst)
67 using ranger =
decltype(
all(std::declval<Range&>()));
68 using cursor =
typename ranger::cursor;
76 template <
typename Range>
83 template <
typename Pred>
auto pred_box(Pred pred) {
84 return [=](
auto&&... x) ->
int {
return pred(std::forward<
decltype(x)>(x)...); };
87 template <
typename Pred,
typename Ranger>
auto filter(Pred pred_, Ranger rgr) {
88 using cursor =
typename Ranger::cursor;
91 return rgr([&](
const auto& p)
TRANSRANGERS_HOT {
return pred(*p) ? dst(p) :
true; });
95 template <
typename Cursor,
typename F,
typename =
void>
struct deref_fun {
96 decltype(
auto)
operator*()
const {
return (*
pf)(*p); }
102 template <
typename Cursor,
typename F>
104 typename std::enable_if<std::is_trivially_default_constructible<F>::value
105 && std::is_empty<F>::value>::type> {
108 decltype(
auto)
operator*()
const {
return F()(*p); }
114 template <
typename F,
typename Ranger>
auto transform(F f, Ranger rgr) {
118 return rgr([&](
const auto& p)
TRANSRANGERS_HOT {
return dst(cursor{p, &f}); });
123 template <
typename Ranger>
auto take(
int n, Ranger rgr) {
124 using cursor =
typename Ranger::cursor;
130 return dst(p) && (n != 0);
139 template <
typename Ranger>
auto concat(Ranger rgr) {
return rgr; }
141 template <
typename Ranger,
typename... Rangers>
auto concat(Ranger rgr, Rangers... rgrs) {
142 using cursor =
typename Ranger::cursor;
144 return ranger<cursor>([=, cont =
false, next =
concat(rgrs...)](
auto dst)
147 if (!(cont = rgr(dst))) return false;
154 template <
typename Ranger>
auto unique(Ranger rgr) {
155 using cursor =
typename Ranger::cursor;
165 if (!dst(p))
return false;
168 if ((*prev == *q) || dst(q)) {
181 template <
typename T>
static decltype(
auto)
adapt(T&& srgr) {
182 return std::forward<decltype(srgr)>(srgr);
212 template <
typename T>
static auto adapt(T&& srgn) {
213 return all(std::forward<
decltype(srgn)>(srgn));
225 [](
const auto&... ps) {
return std::tuple<
decltype(*ps)...>{*ps...}; }, ps);
228 std::tuple<
typename Rangers::cursor...>
ps;
280 template <
typename Ranger1,
typename Ranger2>
auto zip2(Ranger1 rgr1, Ranger2 rgr2) {
284 bool finished =
false;
286 std::get<0>(zp.ps) = p;
288 std::get<1>(zp.ps) = p;
301 template <
typename Ranger,
typename T> T
accumulate(Ranger rgr, T init) {
303 init = std::move(init) + *p;
311#undef TRANSRANGERS_HOT_MUTABLE
312#undef TRANSRANGERS_HOT
Definition transranger_view.hpp:25
auto concat(Ranger rgr)
Definition transrangers.hpp:139
auto pred_box(Pred pred)
Definition transrangers.hpp:83
auto zip2(Ranger1 rgr1, Ranger2 rgr2)
Definition transrangers.hpp:280
auto unique(Ranger rgr)
Definition transrangers.hpp:154
T accumulate(Ranger rgr, T init)
Definition transrangers.hpp:301
auto filter(Pred pred_, Ranger rgr)
Definition transrangers.hpp:87
auto all(Range &&rng)
Definition transrangers.hpp:48
auto ranger(F f)
Definition transrangers.hpp:45
auto transform(F f, Ranger rgr)
Definition transrangers.hpp:114
auto take(int n, Ranger rgr)
Definition transrangers.hpp:123
Definition transrangers.hpp:211
static auto adapt(T &&srgn)
Definition transrangers.hpp:212
Definition transrangers.hpp:66
typename ranger::cursor cursor
Definition transrangers.hpp:68
Range rng
Definition transrangers.hpp:72
auto operator()(const F &p)
Definition transrangers.hpp:70
ranger rgr
Definition transrangers.hpp:73
decltype(all(std::declval< Range & >())) ranger
Definition transrangers.hpp:67
deref_fun(Cursor p={}, F *=nullptr)
Definition transrangers.hpp:106
Cursor p
Definition transrangers.hpp:110
Definition transrangers.hpp:95
F * pf
Definition transrangers.hpp:99
Cursor p
Definition transrangers.hpp:98
Definition transrangers.hpp:180
static decltype(auto) adapt(T &&srgr)
Definition transrangers.hpp:181
Definition transrangers.hpp:41
Cursor cursor
Definition transrangers.hpp:42
Definition transrangers.hpp:222
std::tuple< typename Rangers::cursor... > ps
Definition transrangers.hpp:228
auto operator*() const
Definition transrangers.hpp:223
#define TRANSRANGERS_HOT
Definition transrangers.hpp:35
#define TRANSRANGERS_HOT_MUTABLE
Definition transrangers.hpp:36