Created
February 8, 2010 14:02
-
-
Save qnighy/298157 to your computer and use it in GitHub Desktop.
C Preprocessor Metaprogramming
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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