How would you do this in D?
Jose Armando Garcia
jsancio at gmail.com
Tue May 10 17:32:20 PDT 2011
Hey guys,
I am trying to create a function that return true or executes
"something" the n-th time it is called from a specific call site. How
would you do that in D? In C we can do that with the help of
pre-processor macros. E.g.:
---
#include <assert.h>
#define EVERY(N, ACTION) { static int counter = 0; if(++counter > (N))
counter -= (N); if(counter == 1) (ACTION); }
int main()
{
int i = 0;
int j = 0;
while(i < 10)
{
EVERY(10, ++j);
EVERY(2, ++i);
}
assert(j == 2);
assert(i == 10);
}
---
In D, I hacked the following implementation. I don't like this
implementation for a log of reason... Am I missing some D feature? Can
someone do better?
---
int[string] map;
bool every(string file = __FILE__, int line = __LINE__)(int time)
{
// assume file ~ "+" ~ to!string(line) is unique
// assumption could be removed by using a struct
string key = file ~ "+" ~ to!string(line);
map[key] += 1;
if(map[key] > time) map[key] -= time;
return map[key] == 1;
}
unittest
{
auto i = 0;
auto j = 0;
while(i < 10)
{
if(every(10)) ++j;
if(every(2)) ++i;
}
assert(j == 2);
assert(i == 10);
}
void main() {}
---
Thanks!
-Jose
More information about the Digitalmars-d
mailing list