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