Skip to content

Instantly share code, notes, and snippets.

@qnighy
Created February 8, 2010 14:02
Show Gist options
  • Select an option

  • Save qnighy/298157 to your computer and use it in GitHub Desktop.

Select an option

Save qnighy/298157 to your computer and use it in GitHub Desktop.
C Preprocessor Metaprogramming
#define IDENT(x) x
#define NOT0 1
#define NOT1 0
#define NOT_(x) NOT##x
#define NOT(x) NOT_(x)
#define AND00 0
#define AND01 0
#define AND10 0
#define AND11 1
#define AND_(x,y) AND##x##y
#define AND(x,y) AND_(x,y)
#define OR00 0
#define OR01 1
#define OR10 1
#define OR11 1
#define OR_(x,y) OR##x##y
#define OR(x,y) OR_(x,y)
#define XOR00 0
#define XOR01 1
#define XOR10 1
#define XOR11 0
#define XOR_(x,y) XOR##x##y
#define XOR(x,y) XOR_(x,y)
#define IF1(x,y) x
#define IF0(x,y) y
#define IF_(b) IF##b
#define IF(b) IF_(b)
#define T_F(x,y) x
#define T_L(x,y) y
#define PLUS_BRIDGE(x,y) (T_F x,(T_L x,y))
#define PLUS1A_000 (0,0)
#define PLUS1A_001 (0,1)
#define PLUS1A_010 (0,1)
#define PLUS1A_011 (1,0)
#define PLUS1A_100 (0,1)
#define PLUS1A_101 (1,0)
#define PLUS1A_110 (1,0)
#define PLUS1A_111 (1,1)
#define PLUS1A_(x,y,c) PLUS1A_##x##y##c
#define PLUS1A(x,y,c) PLUS1A_(x,y,c)
#define PLUS1B(x,y,c) PLUS_BRIDGE(PLUS1A(x,y,T_F c),T_L c)
#define PLUS2A(x,y,c) PLUS1B(T_F x,T_F y,PLUS1A(T_L x,T_L y,c))
#define PLUS2B(x,y,c) PLUS_BRIDGE(PLUS2A(x,y,T_F c),T_L c)
#define PLUS4A(x,y,c) PLUS2B(T_F x,T_F y,PLUS2A(T_L x,T_L y,c))
#define PLUS4B(x,y,c) PLUS_BRIDGE(PLUS4A(x,y,T_F c),T_L c)
#define PLUS8A(x,y,c) PLUS4B(T_F x,T_F y,PLUS4A(T_L x,T_L y,c))
#define PLUS8B(x,y,c) PLUS_BRIDGE(PLUS8A(x,y,T_F c),T_L c)
#define PLUS16A(x,y,c) PLUS8B(T_F x,T_F y,PLUS8A(T_L x,T_L y,c))
#define PLUS16B(x,y,c) PLUS_BRIDGE(PLUS16A(x,y,T_F c),T_L c)
#define PLUS32A(x,y,c) PLUS16B(T_F x,T_F y,PLUS16A(T_L x,T_L y,c))
#define PLUS32B(x,y,c) PLUS_BRIDGE(PLUS32A(x,y,T_F c),T_L c)
#define PLUS(x,y) IDENT(T_L PLUS32A(x,y,0))
#define PLUSC(x,y,c) IDENT(T_L PLUS32A(x,y,c))
#define BITNOT2(x) (NOT(T_F x),NOT(T_L x))
#define BITNOT4(x) (BITNOT2(T_F x),BITNOT2(T_L x))
#define BITNOT8(x) (BITNOT4(T_F x),BITNOT4(T_L x))
#define BITNOT16(x) (BITNOT8(T_F x),BITNOT8(T_L x))
#define BITNOT32(x) (BITNOT16(T_F x),BITNOT16(T_L x))
#define MINUS(x,y) PLUSC(x,BITNOT32(y),1)
#define N0 ( \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(0,0)))), \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(0,0)))))
#define N1 ( \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(0,0)))), \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(0,1)))))
#define N2 ( \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(0,0)))), \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(1,0)))))
#define N3 ( \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(0,0)))), \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(1,1)))))
#define N33 ( \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(0,0)))), \
((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(1,0)),((0,0),(0,1)))))
/*#define BITREV2(x) (T_L x,T_F x)
#define BITREV4(x) (BITREV2(T_L x),BITREV2(T_F x))
#define BITREV8(x) (BITREV4(T_L x),BITREV4(T_F x))
#define BITREV16(x) (BITREV8(T_L x),BITREV8(T_F x))
#define BITREV32(x) (BITREV16(T_L x),BITREV16(T_F x))
#define BITREV(x) BITREV32(x)*/
#define EACHBIT1(n,f,x) f(n,x)
#define EACHBIT2(n,f,x) EACHBIT1(T_L n,f,EACHBIT1(T_F n,f,x))
#define EACHBIT4(n,f,x) EACHBIT2(T_L n,f,EACHBIT2(T_F n,f,x))
#define EACHBIT8(n,f,x) EACHBIT4(T_L n,f,EACHBIT4(T_F n,f,x))
#define EACHBIT16(n,f,x) EACHBIT8(T_L n,f,EACHBIT8(T_F n,f,x))
#define EACHBIT32(n,f,x) EACHBIT16(T_L n,f,EACHBIT16(T_F n,f,x))
#define EACHBIT EACHBIT32
#define DPLUS_BRIDGE(x,y) (T_F x,(T_L x,y))
#define DPLUS1A_00 (0,0)
#define DPLUS1A_01 (0,1)
#define DPLUS1A_10 (0,2)
#define DPLUS1A_11 (0,3)
#define DPLUS1A_20 (0,4)
#define DPLUS1A_21 (0,5)
#define DPLUS1A_30 (0,6)
#define DPLUS1A_31 (0,7)
#define DPLUS1A_40 (0,8)
#define DPLUS1A_41 (0,9)
#define DPLUS1A_50 (1,0)
#define DPLUS1A_51 (1,1)
#define DPLUS1A_60 (1,2)
#define DPLUS1A_61 (1,3)
#define DPLUS1A_70 (1,4)
#define DPLUS1A_71 (1,5)
#define DPLUS1A_80 (1,6)
#define DPLUS1A_81 (1,7)
#define DPLUS1A_90 (1,8)
#define DPLUS1A_91 (1,9)
#define DPLUS1A_(x,c) DPLUS1A_##x##c
#define DPLUS1A(x,c) DPLUS1A_(x,c)
#define DPLUS1B(x,c) DPLUS_BRIDGE(DPLUS1A(x,T_F c),T_L c)
#define DPLUS2A(x,c) DPLUS1B(T_F x,DPLUS1A(T_L x,c))
#define DPLUS2B(x,c) DPLUS_BRIDGE(DPLUS2A(x,T_F c),T_L c)
#define DPLUS4A(x,c) DPLUS2B(T_F x,DPLUS2A(T_L x,c))
#define DPLUS4B(x,c) DPLUS_BRIDGE(DPLUS4A(x,T_F c),T_L c)
#define DPLUS8A(x,c) DPLUS4B(T_F x,DPLUS4A(T_L x,c))
#define DPLUS8B(x,c) DPLUS_BRIDGE(DPLUS8A(x,T_F c),T_L c)
#define DPLUS16A(x,c) DPLUS8B(T_F x,DPLUS8A(T_L x,c))
#define DPLUS16B(x,c) DPLUS_BRIDGE(DPLUS16A(x,T_F c),T_L c)
#define DPLUS(x,c) IDENT(T_L DPLUS16A(x,c))
#define TODECIMAL_D(d,x) DPLUS(x,d)
#define TODECIMAL(n) EACHBIT(n,TODECIMAL_D,((((0,0),(0,0)),((0,0),(0,0))),(((0,0),(0,0)),((0,0),(0,0)))))
#define DNONZERO0 0
#define DNONZERO1 1
#define DNONZERO2 1
#define DNONZERO3 1
#define DNONZERO4 1
#define DNONZERO5 1
#define DNONZERO6 1
#define DNONZERO7 1
#define DNONZERO8 1
#define DNONZERO9 1
#define DNONZERO_(x) DNONZERO##x
#define DNONZERO(x) DNONZERO_(x)
#define TOSTR_CAT_(a,b) a##b
#define TOSTR_CAT(a,b) TOSTR_CAT_(a,b)
#define TOSTR_D(d,x) IF(OR(T_L x,DNONZERO(d)))((TOSTR_CAT(T_F x,d),1),(T_F x,0))
#define TOSTR_ZEROCMPL(x) IF(T_L x)(T_F x,0)
#define TOSTR(n) TOSTR_ZEROCMPL(EACHBIT16(TODECIMAL(n),TOSTR_D,(,0)))
TOSTR(N0);
TOSTR(N33);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment