#include<iostream>
using namespace std;
#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define IIF(c) PRIMITIVE_CAT(IIF_, c)
#define IIF_0(t, ...) __VA_ARGS__
#define IIF_1(t, ...) t
#define A() 1
//This correctly expands to true
//IIF(1)(true, false)
// And this will also now correctly expand to true
// IIF(A())(true, false)
#define COMPL(b) PRIMITIVE_CAT(COMPL_, b)
#define COMPL_0 1
#define COMPL_1 0
#define BITAND(x) PRIMITIVE_CAT(BITAND_, x)
#define BITAND_0(y) 0
#define BITAND_1(y) y
#define INC(x) PRIMITIVE_CAT(INC_, x)
#define INC_0 1
#define INC_1 2
#define INC_2 3
#define INC_3 4
#define INC_4 5
#define INC_5 6
#define INC_6 7
#define INC_7 8
#define INC_8 9
#define INC_9 9
#define DEC(x) PRIMITIVE_CAT(DEC_, x)
#define DEC_0 0
#define DEC_1 0
#define DEC_2 1;
#define DEC_3 2
#define DEC_4 3;
#define DEC_5 4
#define DEC_6 5;
#define DEC_7 6
#define DEC_8 7;
#define DEC_9 8
#define CHECK_N(x, n, ...) n
#define CHECK(...) CHECK_N(__VA_ARGS__, 0,)
#define PROBE(x) x, 1,
#define IS_PAREN(x) CHECK(IS_PAREN_PROBE x)
#define IS_PAREN_PROBE(...) PROBE(~)
// IS_PAREN(()) // Expands to 1
// IS_PAREN(xxx) // Expands to 0
#define NOT(x) CHECK(PRIMITIVE_CAT(NOT_, x))
#define NOT_0 PROBE(~)
#define BOOL(x) COMPL(NOT(x))
#define IF(c) IIF(BOOL(c))
#define EAT(...)
#define EXPAND(...) __VA_ARGS__
#define WHEN(c) IF(c)(EXPAND, EAT)
#define EMPTY()
#define DEFER(id) id EMPTY()
#define OBSTRUCT(...) __VA_ARGS__ DEFER(EMPTY)()
#define EXPAND(...) __VA_ARGS__
#define EVAL(...) EVAL1(EVAL1(EVAL1(__VA_ARGS__)))
#define EVAL1(...) EVAL2(EVAL2(EVAL2(__VA_ARGS__)))
#define EVAL2(...) EVAL3(EVAL3(EVAL3(__VA_ARGS__)))
#define EVAL3(...) EVAL4(EVAL4(EVAL4(__VA_ARGS__)))
#define EVAL4(...) EVAL5(EVAL5(EVAL5(__VA_ARGS__)))
#define EVAL5(...) __VA_ARGS__
#define REPEAT(count, macro, ...) \
WHEN(count) \
( \
OBSTRUCT(REPEAT_INDIRECT) () \
( \
DEC(count), macro, __VA_ARGS__ \
) \
OBSTRUCT(macro) \
( \
DEC(count), __VA_ARGS__ \
) \
)
#define REPEAT_INDIRECT() REPEAT
//Пример использования этого макроса
#define M(i, _) i
int main()
{
//EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7
//long f = FACT(6);
//cout<<"FACT(6) : "<< f;
int n=8;
cout<<"count : "<< EVAL(REPEAT(8, M, ~));
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIENBVChhLCAuLi4pIFBSSU1JVElWRV9DQVQoYSwgX19WQV9BUkdTX18pCiNkZWZpbmUgUFJJTUlUSVZFX0NBVChhLCAuLi4pIGEgIyMgX19WQV9BUkdTX18KCiNkZWZpbmUgSUlGKGMpIFBSSU1JVElWRV9DQVQoSUlGXywgYykKI2RlZmluZSBJSUZfMCh0LCAuLi4pIF9fVkFfQVJHU19fCiNkZWZpbmUgSUlGXzEodCwgLi4uKSB0CgojZGVmaW5lIEEoKSAxCi8vVGhpcyBjb3JyZWN0bHkgZXhwYW5kcyB0byB0cnVlCi8vSUlGKDEpKHRydWUsIGZhbHNlKSAKLy8gQW5kIHRoaXMgd2lsbCBhbHNvIG5vdyBjb3JyZWN0bHkgZXhwYW5kIHRvIHRydWUKLy8gSUlGKEEoKSkodHJ1ZSwgZmFsc2UpIAoKI2RlZmluZSBDT01QTChiKSBQUklNSVRJVkVfQ0FUKENPTVBMXywgYikKI2RlZmluZSBDT01QTF8wIDEKI2RlZmluZSBDT01QTF8xIDAKCiNkZWZpbmUgQklUQU5EKHgpIFBSSU1JVElWRV9DQVQoQklUQU5EXywgeCkKI2RlZmluZSBCSVRBTkRfMCh5KSAwCiNkZWZpbmUgQklUQU5EXzEoeSkgeQoKI2RlZmluZSBJTkMoeCkgUFJJTUlUSVZFX0NBVChJTkNfLCB4KQojZGVmaW5lIElOQ18wIDEKI2RlZmluZSBJTkNfMSAyCiNkZWZpbmUgSU5DXzIgMwojZGVmaW5lIElOQ18zIDQKI2RlZmluZSBJTkNfNCA1CiNkZWZpbmUgSU5DXzUgNgojZGVmaW5lIElOQ182IDcKI2RlZmluZSBJTkNfNyA4CiNkZWZpbmUgSU5DXzggOQojZGVmaW5lIElOQ185IDkKCiNkZWZpbmUgREVDKHgpIFBSSU1JVElWRV9DQVQoREVDXywgeCkKI2RlZmluZSBERUNfMCAwCiNkZWZpbmUgREVDXzEgMAojZGVmaW5lIERFQ18yIDE7CiNkZWZpbmUgREVDXzMgMgojZGVmaW5lIERFQ180IDM7CiNkZWZpbmUgREVDXzUgNAojZGVmaW5lIERFQ182IDU7CiNkZWZpbmUgREVDXzcgNgojZGVmaW5lIERFQ184IDc7CiNkZWZpbmUgREVDXzkgOAoKI2RlZmluZSBDSEVDS19OKHgsIG4sIC4uLikgbgojZGVmaW5lIENIRUNLKC4uLikgQ0hFQ0tfTihfX1ZBX0FSR1NfXywgMCwpCiNkZWZpbmUgUFJPQkUoeCkgeCwgMSwKCiNkZWZpbmUgSVNfUEFSRU4oeCkgQ0hFQ0soSVNfUEFSRU5fUFJPQkUgeCkKI2RlZmluZSBJU19QQVJFTl9QUk9CRSguLi4pIFBST0JFKH4pCi8vIElTX1BBUkVOKCgpKSAvLyBFeHBhbmRzIHRvIDEKLy8gSVNfUEFSRU4oeHh4KSAvLyBFeHBhbmRzIHRvIDAKCiNkZWZpbmUgTk9UKHgpIENIRUNLKFBSSU1JVElWRV9DQVQoTk9UXywgeCkpCiNkZWZpbmUgTk9UXzAgUFJPQkUofikKCiNkZWZpbmUgQk9PTCh4KSBDT01QTChOT1QoeCkpCiNkZWZpbmUgSUYoYykgSUlGKEJPT0woYykpCgojZGVmaW5lIEVBVCguLi4pCiNkZWZpbmUgRVhQQU5EKC4uLikgX19WQV9BUkdTX18KI2RlZmluZSBXSEVOKGMpIElGKGMpKEVYUEFORCwgRUFUKQoKI2RlZmluZSBFTVBUWSgpCiNkZWZpbmUgREVGRVIoaWQpIGlkIEVNUFRZKCkKI2RlZmluZSBPQlNUUlVDVCguLi4pIF9fVkFfQVJHU19fIERFRkVSKEVNUFRZKSgpCiNkZWZpbmUgRVhQQU5EKC4uLikgX19WQV9BUkdTX18KCiNkZWZpbmUgRVZBTCguLi4pICBFVkFMMShFVkFMMShFVkFMMShfX1ZBX0FSR1NfXykpKQojZGVmaW5lIEVWQUwxKC4uLikgRVZBTDIoRVZBTDIoRVZBTDIoX19WQV9BUkdTX18pKSkKI2RlZmluZSBFVkFMMiguLi4pIEVWQUwzKEVWQUwzKEVWQUwzKF9fVkFfQVJHU19fKSkpCiNkZWZpbmUgRVZBTDMoLi4uKSBFVkFMNChFVkFMNChFVkFMNChfX1ZBX0FSR1NfXykpKQojZGVmaW5lIEVWQUw0KC4uLikgRVZBTDUoRVZBTDUoRVZBTDUoX19WQV9BUkdTX18pKSkKI2RlZmluZSBFVkFMNSguLi4pIF9fVkFfQVJHU19fCgojZGVmaW5lIFJFUEVBVChjb3VudCwgbWFjcm8sIC4uLikgXAogICAgV0hFTihjb3VudCkgXAogICAgKCBcCiAgICAgICAgT0JTVFJVQ1QoUkVQRUFUX0lORElSRUNUKSAoKSBcCiAgICAgICAgKCBcCiAgICAgICAgICAgIERFQyhjb3VudCksIG1hY3JvLCBfX1ZBX0FSR1NfXyBcCiAgICAgICAgKSBcCiAgICAgICAgT0JTVFJVQ1QobWFjcm8pIFwKICAgICAgICAoIFwKICAgICAgICAgICAgREVDKGNvdW50KSwgX19WQV9BUkdTX18gXAogICAgICAgICkgXAogICAgKQojZGVmaW5lIFJFUEVBVF9JTkRJUkVDVCgpIFJFUEVBVAoKLy/Qn9GA0LjQvNC10YAg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0Y3RgtC+0LPQviDQvNCw0LrRgNC+0YHQsAojZGVmaW5lIE0oaSwgXykgaQoKaW50IG1haW4oKQp7Ci8vRVZBTChSRVBFQVQoOCwgTSwgfikpIC8vIDAgMSAyIDMgNCA1IDYgNwogICAgLy9sb25nIGYgPSBGQUNUKDYpOwogICAgLy9jb3V0PDwiRkFDVCg2KSA6ICI8PCBmOwogICAgaW50IG49ODsKICAgIGNvdXQ8PCJjb3VudCA6ICI8PCBFVkFMKFJFUEVBVCg4LCBNLCB+KSk7CiAgICByZXR1cm4gMDsKfQo=