user72708
user72708

Reputation: 1255

From #define to function

I have this code inside a function but I am not able to understand what it does.

....
#define ascend(i) do {\
            int h = nodes[i].heavyindex;\
            int p = nodes[i].heavypos;\
            m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\
            i = paths[h].parent;\
        } while (0)
    while (nodes[a].heavyindex != nodes[b].heavyindex) {
        if (nodes[a].heavyindex > nodes[b].heavyindex) {
            ascend(a);
        } else {
            ascend(b);
        }
    }
#undef ascend
...

The code of #define, I think, is:

#define ascend(i) do {\
            int h = nodes[i].heavyindex;\
            int p = nodes[i].heavypos;\
            m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\
            i = paths[h].parent;\
        } while (0)

so the real code inside the function is only this:

while (nodes[a].heavyindex != nodes[b].heavyindex) {
        if (nodes[a].heavyindex > nodes[b].heavyindex) {
            ascend(a);
        } else {
            ascend(b);
        }
    }

1) It is right?
2) I want to move the code of the #define inside a function to better understand what it does, but how I translate the following line?

m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\ 

Upvotes: 1

Views: 129

Answers (1)

Emil Laine
Emil Laine

Reputation: 42828

  1. Yes.
  2. As mentioned by Ben Voigt in the comments, ## is the token-pasting operator. So with #define f(i) m##i defined, f(a) will expand to ma, f(b) will expand to mb, etc.

    Since that's only possible with the preprocessor, you have to think of something else to implement it as a function. Passing ma and mb by reference would be a good idea. It could look something like this:

    ascend(T& mi) {
        ...
        mi = max(mi + paths[h].ftree.sum(p), paths[h].stree.max_(0, p)); 
        ...
    }
    

    Where T is the type of ma and mb. If they're of different types, you need to make it a function template.

Upvotes: 1

Related Questions