Last active
December 6, 2019 00:38
-
-
Save HamedMasafi/56a98115c3836268abe49778018aa7e4 to your computer and use it in GitHub Desktop.
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
#pragma once | |
#define CONCAT_DETAIL(l, r) l##r | |
#define CONCAT(l, r) CONCAT_DETAIL(l, r) | |
#define COUNT_N(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N | |
#define COUNT_M(...) EXPAND(COUNT_N( __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)) | |
#define VA_NARGS(...) CALL(COUNT_M,(, __VA_ARGS__)) | |
#define CALL(X,Y) X Y | |
#define EXPAND(...) __VA_ARGS__ | |
#define CALL_N(N, X, V) CALL(CONCAT(N,X),(V)) | |
//DECL | |
#define METHOD_TOKENS_DECL_1(X,name) X(void,name,EXPAND(),EXPAND(),EXPAND(),EXPAND()) | |
#define METHOD_TOKENS_DECL_2(X,ret, name) X(ret,name,EXPAND(),EXPAND(),EXPAND(),EXPAND()) | |
#define METHOD_TOKENS_DECL_3(X,name,a,b) X(void,name,EXPAND(a b),EXPAND(b),EXPAND(a),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_4(X,ret, name,a,b) X(ret,name,EXPAND(a b),EXPAND(b),EXPAND(a),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_5(X,name,a,b,c,d) X(void,name,EXPAND(a b, c d),EXPAND(b,d),EXPAND(a,c),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_6(X,ret, name,a,b,c,d) X(ret,name,EXPAND(a b, c d),EXPAND(b,d),EXPAND(a,c),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_7(X,name,a,b,c,d,e,f) X(void,name,EXPAND(a b, c d, e f),EXPAND(b,d,f),EXPAND(a,c,e),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_8(X,ret, name,a,b,c,d,e,f) X(ret,name,EXPAND(a b, c d, e f),EXPAND(b,d,f),EXPAND(a,c,e),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_9(X,name,a,b,c,d,e,f,g,h) X(void,name,EXPAND(a b, c d, e f, g h),EXPAND(b,d,f,h),EXPAND(a,c,e,g),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_10(X,ret, name,a,b,c,d,e,f,g,h) X(ret,name,EXPAND(a b, c d, e f, g h),EXPAND(b,d,f,h),EXPAND(a,c,e,g),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_11(X,name,a,b,c,d,e,f,g,h,i,j) X(void,name,EXPAND(a b, c d, e f, g h, i j),EXPAND(b,d,f,h,j),EXPAND(a,c,e,g,i),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_12(X,ret, name,a,b,c,d,e,f,g,h,i,j) X(ret,name,EXPAND(a b, c d, e f, g h, i j),EXPAND(b,d,f,h,j),EXPAND(a,c,e,g,i),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_13(X,name,a,b,c,d,e,f,g,h,i,j,k,l) X(void,name,EXPAND(a b, c d, e f, g h, i j, k l),EXPAND(b,d,f,h,j,l),EXPAND(a,c,e,g,i,k),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_14(X,ret, name,a,b,c,d,e,f,g,h,i,j,k,l) X(ret,name,EXPAND(a b, c d, e f, g h, i j, k l),EXPAND(b,d,f,h,j,l),EXPAND(a,c,e,g,i,k),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_15(X,name,a,b,c,d,e,f,g,h,i,j,k,l,m,n) X(void,name,EXPAND(a b, c d, e f, g h, i j, k l, m n),EXPAND(b,d,f,h,j,l,n),EXPAND(a,c,e,g,i,k,m),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_16(X,ret, name,a,b,c,d,e,f,g,h,i,j,k,l,m,n) X(ret,name,EXPAND(a b, c d, e f, g h, i j, k l, m n),EXPAND(b,d,f,h,j,l,n),EXPAND(a,c,e,g,i,k,m),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_17(X,name,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) X(void,name,EXPAND(a b, c d, e f, g h, i j, k l, m n, o p),EXPAND(b,d,f,h,j,l,n,p),EXPAND(a,c,e,g,i,k,m,o),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_18(X,ret, name,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) X(ret,name,EXPAND(a b, c d, e f, g h, i j, k l, m n, o p),EXPAND(b,d,f,h,j,l,n,p),EXPAND(a,c,e,g,i,k,m,o),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_19(X,name,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) X(void,name,EXPAND(a b, c d, e f, g h, i j, k l, m n, o p, q r),EXPAND(b,d,f,h,j,l,n,p,r),EXPAND(a,c,e,g,i,k,m,o,q),EXPAND(,)) | |
#define METHOD_TOKENS_DECL_20(X,ret, name,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) X(ret,name,EXPAND(a b, c d, e f, g h, i j, k l, m n, o p, q r),EXPAND(b,d,f,h,j,l,n,p,r),EXPAND(a,c,e,g,i,k,m,o,q),EXPAND(,)) | |
//IMPL | |
#define METHOD_TOKENS_IMPL_1(X,class,name) X(class,void,name,EXPAND(),EXPAND(),EXPAND(),EXPAND()) | |
#define METHOD_TOKENS_IMPL_2(X,class,ret, name) X(class,ret,name,EXPAND(),EXPAND(),EXPAND(),EXPAND()) | |
#define METHOD_TOKENS_IMPL_3(X,class,name,a,b) X(class,void,name,EXPAND(a b),EXPAND(b),EXPAND(a),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_4(X,class,ret, name,a,b) X(class,ret,name,EXPAND(a b),EXPAND(b),EXPAND(a),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_5(X,class,name,a,b,c,d) X(class,void,name,EXPAND(a b, c d),EXPAND(b,d),EXPAND(a,c),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_6(X,class,ret, name,a,b,c,d) X(class,ret,name,EXPAND(a b, c d),EXPAND(b,d),EXPAND(a,c),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_7(X,class,name,a,b,c,d,e,f) X(class,void,name,EXPAND(a b, c d, e f),EXPAND(b,d,f),EXPAND(a,c,e),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_8(X,class,ret, name,a,b,c,d,e,f) X(class,ret,name,EXPAND(a b, c d, e f),EXPAND(b,d,f),EXPAND(a,c,e),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_9(X,class,name,a,b,c,d,e,f,g,h) X(class,void,name,EXPAND(a b, c d, e f, g h),EXPAND(b,d,f,h),EXPAND(a,c,e,g),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_10(X,class,ret, name,a,b,c,d,e,f,g,h) X(class,ret,name,EXPAND(a b, c d, e f, g h),EXPAND(b,d,f,h),EXPAND(a,c,e,g),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_11(X,class,name,a,b,c,d,e,f,g,h,i,j) X(class,void,name,EXPAND(a b, c d, e f, g h, i j),EXPAND(b,d,f,h,j),EXPAND(a,c,e,g,i),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_12(X,class,ret, name,a,b,c,d,e,f,g,h,i,j) X(class,ret,name,EXPAND(a b, c d, e f, g h, i j),EXPAND(b,d,f,h,j),EXPAND(a,c,e,g,i),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_13(X,class,name,a,b,c,d,e,f,g,h,i,j,k,l) X(class,void,name,EXPAND(a b, c d, e f, g h, i j, k l),EXPAND(b,d,f,h,j,l),EXPAND(a,c,e,g,i,k),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_14(X,class,ret, name,a,b,c,d,e,f,g,h,i,j,k,l) X(class,ret,name,EXPAND(a b, c d, e f, g h, i j, k l),EXPAND(b,d,f,h,j,l),EXPAND(a,c,e,g,i,k),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_15(X,class,name,a,b,c,d,e,f,g,h,i,j,k,l,m,n) X(class,void,name,EXPAND(a b, c d, e f, g h, i j, k l, m n),EXPAND(b,d,f,h,j,l,n),EXPAND(a,c,e,g,i,k,m),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_16(X,class,ret, name,a,b,c,d,e,f,g,h,i,j,k,l,m,n) X(class,ret,name,EXPAND(a b, c d, e f, g h, i j, k l, m n),EXPAND(b,d,f,h,j,l,n),EXPAND(a,c,e,g,i,k,m),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_17(X,class,name,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) X(class,void,name,EXPAND(a b, c d, e f, g h, i j, k l, m n, o p),EXPAND(b,d,f,h,j,l,n,p),EXPAND(a,c,e,g,i,k,m,o),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_18(X,class,ret, name,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) X(class,ret,name,EXPAND(a b, c d, e f, g h, i j, k l, m n, o p),EXPAND(b,d,f,h,j,l,n,p),EXPAND(a,c,e,g,i,k,m,o),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_19(X,class,name,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) X(class,void,name,EXPAND(a b, c d, e f, g h, i j, k l, m n, o p, q r),EXPAND(b,d,f,h,j,l,n,p,r),EXPAND(a,c,e,g,i,k,m,o,q),EXPAND(,)) | |
#define METHOD_TOKENS_IMPL_20(X,class,ret, name,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) X(class,ret,name,EXPAND(a b, c d, e f, g h, i j, k l, m n, o p, q r),EXPAND(b,d,f,h,j,l,n,p,r),EXPAND(a,c,e,g,i,k,m,o,q),EXPAND(,)) | |
#define CALL_T(t) int | |
#define METHOD_CODE_DECL(ret,name,params,names,types,sep) CALL_T(ret) *name(params); | |
#define METHOD_CODE_IMPL(class,ret,name,params,names,types,sep) \ | |
CALL_T(ret) *class::name(params) \ | |
{ \ | |
qlonglong __call_id = invokeOnPeer(#name "Slot" sep names); \ | |
if (__call_id) { \ | |
auto call = new CALL_T(ret)(); \ | |
addCall(__call_id, call); \ | |
return call; \ | |
} \ | |
return nullptr; \ | |
} | |
#define METHOD_DECL_P(count,...) CALL(CONCAT(METHOD_TOKENS_DECL_,count),(METHOD_CODE_DECL,__VA_ARGS__)) | |
#define N_METHOD_DECL(...) METHOD_DECL_P(EXPAND(VA_NARGS(__VA_ARGS__)),EXPAND(__VA_ARGS__)) | |
#define METHOD_IMPL_P(count,...) CALL(CONCAT(METHOD_TOKENS_IMPL_,count),(METHOD_CODE_IMPL,__VA_ARGS__)) | |
#define N_METHOD_IMPL(class,...) METHOD_IMPL_P(EXPAND(VA_NARGS(__VA_ARGS__)),EXPAND(class,__VA_ARGS__)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment