Function std.range.iota
Construct a range of values that span the given starting and stopping values.
Prototypes
auto iota(B, E, S)( B begin, E end, S step ) if ((isIntegral!(CommonType!(B, E)) || isPointer!(CommonType!(B, E))) && isIntegral!S); auto iota(B, E)( B begin, E end ) if (isFloatingPoint!(CommonType!(B, E))); auto iota(B, E)( B begin, E end ) if (isIntegral!(CommonType!(B, E)) || isPointer!(CommonType!(B, E))); auto iota(E)( E end ); auto iota(B, E, S)( B begin, E end, S step ) if (isFloatingPoint!(CommonType!(B, E, S))); auto iota(B, E)( B begin, E end ) if (!isIntegral!(CommonType!(B, E)) && !isFloatingPoint!(CommonType!(B, E)) && !isPointer!(CommonType!(B, E)) && is(typeof((ref B b) { ++b; } )) && (is(typeof(B.init < E.init)) || is(typeof(B.init == E.init))));
Parameters
Name | Description |
---|---|
begin | The starting value. |
end | The value that serves as the stopping criterion. This value is not included in the range. |
step | The value to add to the current value at each iteration. |
Returns
A range that goes through the numbers
, begin
,
begin
+ step
, begin
+ 2 * step
...
, up to and excluding
.
end
The two-argument overloads have
. If step
= 1
or begin
< end
&& step
<
0
or begin
> end
&& step
> 0
, then an empty range
is returned. If begin
== end
then step
== 0
is an error.
begin
== end
For built-in types, the range returned is a random access range. For
user-defined types that support ++
, the range is an input
range.
Example
void main() { import std.stdio; // The following groups all produce the same output of: // 0 1 2 3 4 foreach (i; 0..5) writef("%s ", i); writeln(); import std.range : iota; foreach (i; iota(0, 5)) writef("%s ", i); writeln(); writefln("%(%s %|%)", iota(0, 5)); import std.algorithm : map, copy; import std.format; iota(0, 5).map!(i => format("%s ", i)).copy(stdout.lockingTextWriter()); writeln(); }
Example
import std.algorithm : equal; import std.math : approxEqual; auto r = iota(0, 10, 1); assert(equal(r, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9][])); r = iota(0, 11, 3); assert(equal(r, [0, 3, 6, 9][])); assert(r[2] == 6); auto rf = iota(0.0, 0.5, 0.1); assert(approxEqual(rf, [0.0, 0.1, 0.2, 0.3, 0.4]));
Example
User-defined types such as std.bigint.BigInt
are also supported, as long
as they can be incremented with ++
and compared with <
or ==
.
import std.algorithm.comparison : equal; import std.bigint; auto s = BigInt(1_000_000_000_000); auto e = BigInt(1_000_000_000_003); auto r = iota(s, e); assert(r.equal([ BigInt(1_000_000_000_000), BigInt(1_000_000_000_001), BigInt(1_000_000_000_002) ]));
Authors
Andrei Alexandrescu, David Simcha, and Jonathan M Davis. Credit for some of the ideas in building this module goes to Leonardo Maffi.