digitalmars.D.learn - Create a foreach-able struct? Multi-dimensional even?
- Heywood Floyd (11/11) Aug 25 2011 Hello!
- Heywood Floyd (4/24) Aug 25 2011 Ah, I'm sorry, I found the documentation regarding opApply() now. Typica...
- travert phare.normalesup.org (Christophe) (32/33) Aug 25 2011 Sure, you have to make an opApply that takes several parameters in its
- Heywood Floyd (2/42) Aug 25 2011 Ha! Beautiful, thanks!!
Hello!
1) How do I create a struct that I can foreach over?
I get the impression opApply has something do to with this, but I can't find
any documentation on it? (And I'm abroad without my TDPL.)
2) Also, is it possible to do something like this?
MyData!(100,100,100) data;
foreach(x, y, z, ref cell; data){
cell = x*y*z;
}
(The idea here is cells are stored in a plain 1-dimensional array behind the
scenes, but iterated as a 3-dimensional array.)
Kind regards
/HF
Aug 25 2011
Heywood Floyd Wrote:
Hello!
1) How do I create a struct that I can foreach over?
I get the impression opApply has something do to with this, but I can't find
any documentation on it? (And I'm abroad without my TDPL.)
2) Also, is it possible to do something like this?
MyData!(100,100,100) data;
foreach(x, y, z, ref cell; data){
cell = x*y*z;
}
(The idea here is cells are stored in a plain 1-dimensional array behind the
scenes, but iterated as a 3-dimensional array.)
Kind regards
/HF
Ah, I'm sorry, I found the documentation regarding opApply() now. Typical. (The
site-search didn't seem to work there. Ok..)
Still, is the multi-dimensional part possible?
/HF
Aug 25 2011
Still, is the multi-dimensional part possible?Sure, you have to make an opApply that takes several parameters in its delegate. An exemple: struct TwoDArray(int nx, int ny) { int[nx][ny] data; int opApply(int delegate(ref int i, ref int j, ref int cell) { foreach (i; 0..nx) foreach (j; 0..ny) { int result = dg(i, j, data[i][j]); if (result != 0) return result; } return 0; } } // this program prints a multiplication table: int main() { TwoDArray!(10, 10) data; foreach(i, j, ref cell; data) { cell = i * j; } foreach(i, j, cell; data) { writefln("%s * %s = %s", i, j, cell); } return 0; }
Aug 25 2011
Christophe Wrote:Ha! Beautiful, thanks!!Still, is the multi-dimensional part possible?Sure, you have to make an opApply that takes several parameters in its delegate. An exemple: struct TwoDArray(int nx, int ny) { int[nx][ny] data; int opApply(int delegate(ref int i, ref int j, ref int cell) { foreach (i; 0..nx) foreach (j; 0..ny) { int result = dg(i, j, data[i][j]); if (result != 0) return result; } return 0; } } // this program prints a multiplication table: int main() { TwoDArray!(10, 10) data; foreach(i, j, ref cell; data) { cell = i * j; } foreach(i, j, cell; data) { writefln("%s * %s = %s", i, j, cell); } return 0; }
Aug 25 2011








Heywood Floyd <soul8o8 gmail.com>