15#ifndef JOAQUINTIDES_TRANSRANGERS_EXT_HPP
16#define JOAQUINTIDES_TRANSRANGERS_EXT_HPP
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))
31# define TRANSRANGERS_HOT [[msvc::forceinline]]
32# define TRANSRANGERS_HOT_MUTABLE mutable [[msvc::forceinline]]
47 using cursor =
decltype(begin(rng));
50 return ranger<cursor>([first = ++begin(rng), last = end(rng)](
auto dst)
69 using cursor =
typename ranger::cursor;
91 template <
typename Range>
107 using cursor =
decltype(begin(rng));
110 return ranger<cursor>([first = begin(rng), last = --end(rng)](
auto dst)
152 template <
typename Range>
169 using cursor =
decltype(begin(rng));
172 return ranger<cursor>([first = ++begin(rng), last = --end(rng)](
auto dst)
214 template <
typename Range>
232 return std::make_pair(old, std::move(value));
246 template <
typename Ranger,
typename T> T
partial_sum(Ranger rgr, T init) {
248 init = std::move(init) + *p;
262 template <std::size_t I,
typename Ranger,
typename... Rangers>
class __lambda_255_33 {
272 template <
class type_parameter_4_0>
274 std::get<I + 1>(zp.
ps) = p;
305 template <std::size_t... I>
312 std::tuple<Rangers...>& rgrs;
324 template <
typename type_parameter_1_0,
typename Ranger,
typename... Rangers>
335 template <
class type_parameter_2_0>
337 std::get<0>(zp.
ps) = p;
338 if (
__lambda_249_18{zp, rgrs}(std::index_sequence_for<Rangers...>{})) {
348 type_parameter_1_0& dst;
350 std::tuple<Rangers...>& rgrs;
362 std::tuple<Rangers...>& _rgrs)
363 : finished{_finished}, dst{_dst}, zp{_zp}, rgrs{_rgrs} {}
383 template <
class type_parameter_1_0>
385 bool finished =
false;
392 std::tuple<Rangers...> rgrs;
403 : zp{_zp}, rgr{_rgr}, rgrs{_rgrs...} {}
418 template <
typename Ranger,
typename... Rangers>
auto zip(Ranger rgr, Rangers... rgrs) {
419 using cursor =
zip_cursor<Ranger, Rangers...>;
425#undef TRANSRANGERS_HOT_MUTABLE
426#undef TRANSRANGERS_HOT
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