How would you do this in D?
Jonathan M Davis
jmdavisProg at gmx.com
Tue May 10 17:52:41 PDT 2011
On 2011-05-10 17:32, Jose Armando Garcia wrote:
> 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() {}
> ---
My suggestion would be to use a string mixin. It would do essentially the same
thing that the macro does.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list