namespace factor
{
    void abort();
}

#ifdef FACTOR_DEBUG
#define FACTOR_ASSERT(condition) ((condition) \
    ? (void)0 \
    : ( \
        ::fprintf(stderr, "assertion \"%s\" failed: file \"%s\", line %d\n", \
            #condition, __FILE__, __LINE__), \
        ::factor::abort() \
    ))
#else
#define FACTOR_ASSERT(condition) ((void)0)
#endif