#define IGNORE(param) do { (void)(param); } while(0)
#define IGNORE(param) do { (void)(param); } while(0)
#define LIKELY(ex) __builtin_expect((ex), 1)
#define UNLIKELY(ex) __builtin_expect((ex), 0)
//TODO: For explicitly threaded version: Make a lazy thread spawner, spawning up to 8 threads which will each work on a byte and atomically write back to a central array of `uint64_t [num_of_bytes / num_of_threads]`.
#define LIF(ex) if(LIKELY(!!(ex)))
//TODO: But how to sync the fwrites of this buffer? An atomic counter of which threads have completed their operations, and a condvar that allows the controlling thread to check if the counter is full before `fwrite_all()`ing the array, resetting the counter, and carrying on
//TODO: In explicitly threaded version, we can use an atomic (atomic.h) 64-bit integer `store()` to output those 8 bytes in `out`, which will be re-cast as `uint64_t out[restrict 1]`
}
}
staticinlineintcheck(intval,constchar*msg)
// Light assertion (likely to succeed)
staticinlineintlcheck(intval,constchar*msg)
{
{
if(val)returnval;
LIF(val)returnval;
fprintf(stderr,"error: %s\n",msg);
fprintf(stderr,"error: %s\n",msg);
exit(1);
exit(1);
}
}
@ -45,7 +47,7 @@ int main(int argc, char **argv)
{
{
IGNORE(argc);
IGNORE(argc);
constchar*mask=argv[1]&& check(strlen(argv[1])>1,"expected 2 character mask")?argv[1]:"01";
constchar*mask=argv[1]&&lcheck(strlen(argv[1])>1,"expected 2 character mask")?argv[1]:"01";