Another foreach idea.
Derek Parnell
derek at psych.ward
Wed Jun 7 23:45:35 PDT 2006
On Wed, 07 Jun 2006 22:56:50 -0700, Kirk McDonald wrote:
> Kirk McDonald wrote:
> Oh! I did some thinking and improved it a little. It's a struct now ...
Hope you don't mind but I turned your code into a templated version...
//------- file: ranger.d ----------------
struct range_struct(T) {
public:
T m_start, m_end, m_step;
// Compares whether i has reached the end
private bool cmp(T i) {
if (m_step > 0 && i < m_end) return true;
else if (m_step < 0 && i > m_end) return true;
else return false;
}
int opApply(int delegate(inout T) dg) {
int result = 0;
for (T i=m_start; this.cmp(i); i+=m_step) {
result = dg(i);
if (result) break;
}
return result;
}
int opApply(int delegate(inout int, inout T) dg) {
int result = 0;
int cnt;
for (T i=m_start; this.cmp(i); i+=m_step) {
result = dg(cnt, i);
if (result) break;
cnt++;
}
return result;
}
}
template range_t(T)
{
range_struct!(T) range(T start, T end, T step=1) {
range_struct!(T) r;
r.m_start = start;
r.m_end = end;
r.m_step = step;
return r;
}
range_struct!(T) range(T end) {
return range(0, end, 1);
}
}
alias range_t!(char).range range;
alias range_t!(int).range range;
alias range_t!(real).range range;
//--------- FILE END -----------
// -------file: test.d ---------
import std.stdio;
import ranger;
void main() {
foreach(i; range(10)) {
writefln("i %s", i);
}
foreach(j; range(10, 20)) {
writefln("j %s", j);
}
foreach(q, k; range(10.0, 0.0, -0.9)) {
writefln("k %s %s", q, k);
}
foreach(q, l; range('A', cast(char)('Z'+1))) {
writefln("l %s %s", q, l);
}
}
//--------- FILE END -----------
When run with ...
build c:\temp\test.d -exec
I get ...
Path and Version : y:\util\build.exe v3.00(1964)
built on Tue Jun 6 10:38:29 2006
i 0
i 1
i 2
i 3
i 4
i 5
i 6
i 7
i 8
i 9
j 10
j 11
j 12
j 13
j 14
j 15
j 16
j 17
j 18
j 19
k 0 10
k 1 9.1
k 2 8.2
k 3 7.3
k 4 6.4
k 5 5.5
k 6 4.6
k 7 3.7
k 8 2.8
k 9 1.9
k 10 1
k 11 0.1
l 0 A
l 1 B
l 2 C
l 3 D
l 4 E
l 5 F
l 6 G
l 7 H
l 8 I
l 9 J
l 10 K
l 11 L
l 12 M
l 13 N
l 14 O
l 15 P
l 16 Q
l 17 R
l 18 S
l 19 T
l 20 U
l 21 V
l 22 W
l 23 X
l 24 Y
l 25 Z
Neat eh?
--
Derek
(skype: derek.j.parnell)
Melbourne, Australia
"Down with mediocrity!"
8/06/2006 4:41:43 PM
More information about the Digitalmars-d
mailing list