Can we get rid of opApply?
Max Samukha
samukha at voliacable.com.removethis
Tue Jan 20 01:51:19 PST 2009
On Tue, 20 Jan 2009 12:23:58 +0300, "Denis Koroskin"
<2korden at gmail.com> wrote:
>One nice thing that opApply capable of is it can avoid heap activity by stack-allocating data during iteration.
>
>For example, given an array of ints, iterate over string representations of them:
>
>struct IntegersAsString
>{
> void opAplly(int delegate(string s) dg)
> {
> char[16] temp;
>
> foreach (i; array) {
> int len = sprintf(temp, "%d", i);
> int result = dg(temp[0..len]);
> if (result != 0) {
> return result;
> }
> }
>
> return 0;
> }
>
> private int[] array;
>}
>
>int array = [1, 1, 2, 3, 5, 8, 13];
>
>// no heap allocation take place
>foreach (string s; IntegersAsString(array)) {
> writeln(s);
>}
>
>How would you do that with ranges?
struct IntegersAsString
{
private
{
int[] array;
char[16] temp;
}
char[] head()
{
int len = sprintf(temp.ptr, "%d", array[0]);
return temp[0..len];
}
void next()
{
array = array[1..$];
}
bool empty()
{
return array.length == 0;
}
}
void main()
{
int[] array = [1, 1, 2, 3, 5, 8, 13];
// no heap allocation take place
foreach (char[] s; IntegersAsString(array))
writefln(s);
}
More information about the Digitalmars-d
mailing list