Function std.range.primitives.walkLength
This is a best-effort implementation of length
for any kind of
range.
auto walkLength(Range)
(
Range range
)
if (isInputRange!Range && !isInfinite!Range);
auto walkLength(Range)
(
Range range,
const size_t upTo
)
if (isInputRange!Range);
If hasLength!Range
, simply returns range
without
checking upTo
(when specified).
Otherwise, walks the range through its length and returns the number
of elements seen. Performes Ο(n
) evaluations of range
and range
, where n
is the effective length of range
.
The upTo
parameter is useful to "cut the losses" in case
the interest is in seeing whether the range has at least some number
of elements. If the parameter upTo
is specified, stops if upTo
steps have been taken and returns upTo
.
Infinite ranges are compatible, provided the parameter upTo
is
specified, in which case the implementation simply returns upTo.
Example
import std .range : iota;
writeln(10 .iota .walkLength); // 10
// iota has a length function, and therefore the
// doesn't have to be walked, and the upTo
// parameter is ignored
writeln(10 .iota .walkLength(5)); // 10
Authors
Andrei Alexandrescu, David Simcha, and Jonathan M Davis. Credit for some of the ideas in building this module goes to Leonardo Maffi.