mardi 28 avril 2015

Macro for run-once conditioning

I am trying to build a macro that runs a code only once. Very useful for example if you loop a code and want something inside to happen only once. The easy to use method:

static int checksum;

for( ; ; )
{
    if(checksum == 0) { checksum == 1; // ... }
}

But it is a bit wasteful and confusing. So I have this macros that use checking bits instead of checking true/false state of a variable:

#define CHECKSUM(d) static d checksum_boolean
#define CHECKSUM_IF(x) if( ~(checksum_boolean >> x) & 1) \
                    {                                               \
                        checksum_boolean |= 1 << x;
#define CHECKSUM_END }1

The 1 at the end is to force the user to put semi-colon at the end. In my compiler this is allowed.


The problem is figuring out how to do this without having the user to specify x (n bit to be checked). So he can use this:

CHECKSUM(char); // 7 run-once codes can be used

for( ; ; )
{
    CHECKSUM_IF
        // code..
    CHECKSUM_END;
}


Ideas how can I achieve this?

Aucun commentaire:

Enregistrer un commentaire