CkPttn 1.2.4
Loading...
Searching...
No Matches
transrangers_ext.hpp
Go to the documentation of this file.
1
15#ifndef JOAQUINTIDES_TRANSRANGERS_EXT_HPP
16#define JOAQUINTIDES_TRANSRANGERS_EXT_HPP
17
18#if defined(_MSC_VER)
19# pragma once
20#endif
21
22#include "transrangers.hpp"
23
24#if defined(__clang__)
25# define TRANSRANGERS_HOT __attribute__((flatten))
26# define TRANSRANGERS_HOT_MUTABLE __attribute__((flatten)) mutable
27#elif defined(__GNUC__)
28# define TRANSRANGERS_HOT __attribute__((flatten))
29# define TRANSRANGERS_HOT_MUTABLE mutable __attribute__((flatten))
30#else
31# define TRANSRANGERS_HOT [[msvc::forceinline]]
32# define TRANSRANGERS_HOT_MUTABLE mutable [[msvc::forceinline]]
33#endif
34
35namespace transrangers {
36
44 template <typename Range> auto skip_first(Range&& rng) {
45 using std::begin;
46 using std::end;
47 using cursor = decltype(begin(rng));
48
49 // Sorry, I don't check if the second item is available.
50 return ranger<cursor>([first = ++begin(rng), last = end(rng)](auto dst)
52 auto it = first;
53 while (it != last)
54 if (!dst(it++)) {
55 first = it;
56 return false;
57 }
58 return true;
59 });
60 }
61
67 template <typename Range> struct skip_first_copy {
68 using ranger = decltype(skip_first(std::declval<Range&>()));
69 using cursor = typename ranger::cursor;
70
78 template <typename F> auto operator()(const F& p) { return rgr(p); }
79
80 Range rng;
82 };
83
91 template <typename Range>
92 typename std::enable_if<std::is_rvalue_reference<Range&&>::value, skip_first_copy<Range>>::type
93 skip_first(Range&& rng) {
94 return skip_first_copy<Range>{std::move(rng)};
95 }
96
104 template <typename Range> auto skip_last(Range&& rng) {
105 using std::begin;
106 using std::end;
107 using cursor = decltype(begin(rng));
108
109 // Sorry, I don't check if the second last item is available.
110 return ranger<cursor>([first = begin(rng), last = --end(rng)](auto dst)
112 auto it = first;
113 while (it != last)
114 if (!dst(it++)) {
115 first = it;
116 return false;
117 }
118 return true;
119 });
120 }
121
127 template <typename Range> struct skip_last_copy {
128 using ranger = decltype(skip_last(std::declval<Range&>()));
129 using cursor = typename ranger::cursor;
130
138 template <typename F> auto operator()(const F& p) { return rgr(p); }
139
140 Range rng;
142 };
143
152 template <typename Range>
153 typename std::enable_if<std::is_rvalue_reference<Range&&>::value, skip_last_copy<Range>>::type
154 skip_last(Range&& rng) {
155 return skip_last_copy<Range>{std::move(rng)};
156 }
157
166 template <typename Range> auto skip_both(Range&& rng) {
167 using std::begin;
168 using std::end;
169 using cursor = decltype(begin(rng));
170
171 // Sorry, I don't check if the second item is available.
172 return ranger<cursor>([first = ++begin(rng), last = --end(rng)](auto dst)
174 auto it = first;
175 while (it != last)
176 if (!dst(it++)) {
177 first = it;
178 return false;
179 }
180 return true;
181 });
182 }
183
189 template <typename Range> struct skip_both_copy {
190 using ranger = decltype(skip_both(std::declval<Range&>()));
191 using cursor = typename ranger::cursor;
192
200 template <typename F> auto operator()(const F& p) { return rgr(p); }
201
202 Range rng;
204 };
205
214 template <typename Range>
215 typename std::enable_if<std::is_rvalue_reference<Range&&>::value, skip_both_copy<Range>>::type
216 skip_both(Range&& rng) {
217 return skip_both_copy<Range>{std::move(rng)};
218 }
219
227 template <typename Ranger> auto enumerate(Ranger rgr) {
228 return transform(
229 [index = std::size_t(0)](auto&& value) TRANSRANGERS_HOT_MUTABLE {
230 auto old = index;
231 index += 1;
232 return std::make_pair(old, std::move(value));
233 },
234 rgr);
235 }
236
246 template <typename Ranger, typename T> T partial_sum(Ranger rgr, T init) {
247 rgr([&init](const auto& p) TRANSRANGERS_HOT {
248 init = std::move(init) + *p;
249 *p = init;
250 return true;
251 });
252 return init;
253 }
254
262 template <std::size_t I, typename Ranger, typename... Rangers> class __lambda_255_33 {
263 using cursor = zip_cursor<Ranger, Rangers...>;
264
265 public:
272 template <class type_parameter_4_0>
273 TRANSRANGERS_HOT inline auto operator()(const type_parameter_4_0& p) const {
274 std::get<I + 1>(zp.ps) = p;
275 return false;
276 }
277
278 private:
279 cursor& zp;
280
281 public:
287 __lambda_255_33(cursor& _zp) : zp{_zp} {}
288 };
289
296 template <typename Ranger, typename... Rangers> class __lambda_249_18 {
297 using cursor = zip_cursor<Ranger, Rangers...>;
298
299 public:
305 template <std::size_t... I>
306 TRANSRANGERS_HOT inline auto operator()(std::index_sequence<I...>) const {
307 return (std::get<I>(rgrs)(__lambda_255_33<I, Ranger, Rangers...>{zp}) || ...);
308 }
309
310 private:
311 cursor& zp;
312 std::tuple<Rangers...>& rgrs;
313
314 public:
321 __lambda_249_18(cursor& _zp, std::tuple<Rangers...>& _rgrs) : zp{_zp}, rgrs{_rgrs} {}
322 };
323
324 template <typename type_parameter_1_0, typename Ranger, typename... Rangers>
326 using cursor = zip_cursor<Ranger, Rangers...>;
327
328 public:
335 template <class type_parameter_2_0>
336 TRANSRANGERS_HOT inline auto operator()(const type_parameter_2_0& p) const {
337 std::get<0>(zp.ps) = p;
338 if (__lambda_249_18{zp, rgrs}(std::index_sequence_for<Rangers...>{})) {
339 finished = true;
340 return false;
341 }
342
343 return dst(zp);
344 }
345
346 private:
347 bool& finished;
348 type_parameter_1_0& dst;
349 cursor& zp;
350 std::tuple<Rangers...>& rgrs;
351
352 public:
361 __lambda_246_16(bool& _finished, type_parameter_1_0& _dst, cursor& _zp,
362 std::tuple<Rangers...>& _rgrs)
363 : finished{_finished}, dst{_dst}, zp{_zp}, rgrs{_rgrs} {}
364 };
365
372 template <typename Ranger, typename... Rangers> class __lambda_244_25 {
373 using cursor = zip_cursor<Ranger, Rangers...>;
374
375 public:
383 template <class type_parameter_1_0>
384 TRANSRANGERS_HOT inline auto operator()(type_parameter_1_0 dst) {
385 bool finished = false;
386 return rgr(__lambda_246_16{finished, dst, zp, rgrs}) || finished;
387 }
388
389 private:
390 cursor zp;
391 Ranger rgr;
392 std::tuple<Rangers...> rgrs;
393
394 public:
402 __lambda_244_25(cursor _zp, const Ranger& _rgr, const Rangers&... _rgrs)
403 : zp{_zp}, rgr{_rgr}, rgrs{_rgrs...} {}
404 };
405
418 template <typename Ranger, typename... Rangers> auto zip(Ranger rgr, Rangers... rgrs) {
419 using cursor = zip_cursor<Ranger, Rangers...>;
420 return ranger<cursor>(__lambda_244_25{cursor{}, rgr, rgrs...});
421 }
422
423} // namespace transrangers
424
425#undef TRANSRANGERS_HOT_MUTABLE
426#undef TRANSRANGERS_HOT
427#endif
Internal lambda for the zip ranger combinator.
Definition transrangers_ext.hpp:372
__lambda_244_25(cursor _zp, const Ranger &_rgr, const Rangers &... _rgrs)
Construct with initial cursor and ranger copies.
Definition transrangers_ext.hpp:402
TRANSRANGERS_HOT auto operator()(type_parameter_1_0 dst)
Invoke the zip ranger with a destination callback.
Definition transrangers_ext.hpp:384
Definition transrangers_ext.hpp:325
__lambda_246_16(bool &_finished, type_parameter_1_0 &_dst, cursor &_zp, std::tuple< Rangers... > &_rgrs)
Construct with references to shared state.
Definition transrangers_ext.hpp:361
TRANSRANGERS_HOT auto operator()(const type_parameter_2_0 &p) const
Process each element from the first ranger, gathering remaining ranger elements.
Definition transrangers_ext.hpp:336
Internal lambda for zip cursor expansion via index sequence.
Definition transrangers_ext.hpp:296
TRANSRANGERS_HOT auto operator()(std::index_sequence< I... >) const
Definition transrangers_ext.hpp:306
__lambda_249_18(cursor &_zp, std::tuple< Rangers... > &_rgrs)
Construct with references to zip cursor and ranger tuple.
Definition transrangers_ext.hpp:321
Internal lambda for zip cursor element assignment.
Definition transrangers_ext.hpp:262
TRANSRANGERS_HOT auto operator()(const type_parameter_4_0 &p) const
Definition transrangers_ext.hpp:273
__lambda_255_33(cursor &_zp)
Construct with reference to zip cursor.
Definition transrangers_ext.hpp:287
Definition transranger_view.hpp:25
auto skip_both(Range &&rng)
skip_both, skip_both_copy (assume the next and prev items are available)
Definition transrangers_ext.hpp:166
auto zip(Ranger rgr, Rangers... rgrs)
Zip multiple rangers together, advancing them in lockstep.
Definition transrangers_ext.hpp:418
auto skip_first(Range &&rng)
skip_first, skip_first_copy (assume the next item is available)
Definition transrangers_ext.hpp:44
auto enumerate(Ranger rgr)
enumerate
Definition transrangers_ext.hpp:227
auto transform(F f, Ranger rgr)
Definition transrangers.hpp:114
T partial_sum(Ranger rgr, T init)
partial sum (cummutative sum)
Definition transrangers_ext.hpp:246
auto skip_last(Range &&rng)
skip_last, skip_last_copy (assume the previous item is available)
Definition transrangers_ext.hpp:104
Owning copy adaptor for skip_both on rvalue ranges.
Definition transrangers_ext.hpp:189
ranger rgr
Definition transrangers_ext.hpp:203
decltype(skip_both(std::declval< Range & >())) ranger
Definition transrangers_ext.hpp:190
Range rng
Definition transrangers_ext.hpp:202
typename ranger::cursor cursor
Definition transrangers_ext.hpp:191
auto operator()(const F &p)
Definition transrangers_ext.hpp:200
Owning copy adaptor for skip_first on rvalue ranges.
Definition transrangers_ext.hpp:67
typename ranger::cursor cursor
Definition transrangers_ext.hpp:69
auto operator()(const F &p)
Definition transrangers_ext.hpp:78
ranger rgr
Definition transrangers_ext.hpp:81
Range rng
Definition transrangers_ext.hpp:80
decltype(skip_first(std::declval< Range & >())) ranger
Definition transrangers_ext.hpp:68
Owning copy adaptor for skip_last on rvalue ranges.
Definition transrangers_ext.hpp:127
typename ranger::cursor cursor
Definition transrangers_ext.hpp:129
ranger rgr
Definition transrangers_ext.hpp:141
auto operator()(const F &p)
Definition transrangers_ext.hpp:138
decltype(skip_last(std::declval< Range & >())) ranger
Definition transrangers_ext.hpp:128
Range rng
Definition transrangers_ext.hpp:140
std::tuple< typename Rangers::cursor... > ps
Definition transrangers.hpp:228
Transrangers: an efficient, composable design pattern for range processing.
#define TRANSRANGERS_HOT
Definition transrangers.hpp:35
#define TRANSRANGERS_HOT_MUTABLE
Definition transrangers.hpp:36