mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-12-27 04:36:04 +00:00
208 lines
5 KiB
C
208 lines
5 KiB
C
|
/* TuxSH: I added INC/DEC_10 to INC/DEC_32; tuples */
|
||
|
|
||
|
#ifndef FUSEE_PREPROCESSOR_H
|
||
|
#define FUSEE_PREPROCESSOR_H
|
||
|
|
||
|
/*=============================================================================
|
||
|
Copyright (c) 2015 Paul Fultz II
|
||
|
cloak.h
|
||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
|
==============================================================================*/
|
||
|
|
||
|
/*#ifndef CLOAK_GUARD_H
|
||
|
#define CLOAK_GUARD_H*/
|
||
|
|
||
|
#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
|
||
|
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
|
||
|
|
||
|
#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 10
|
||
|
#define INC_10 11
|
||
|
#define INC_11 12
|
||
|
#define INC_12 13
|
||
|
#define INC_13 14
|
||
|
#define INC_14 15
|
||
|
#define INC_15 16
|
||
|
#define INC_16 17
|
||
|
#define INC_17 18
|
||
|
#define INC_18 19
|
||
|
#define INC_19 20
|
||
|
#define INC_20 21
|
||
|
#define INC_21 22
|
||
|
#define INC_22 23
|
||
|
#define INC_23 24
|
||
|
#define INC_24 25
|
||
|
#define INC_25 26
|
||
|
#define INC_26 27
|
||
|
#define INC_27 28
|
||
|
#define INC_28 29
|
||
|
#define INC_29 30
|
||
|
#define INC_30 31
|
||
|
#define INC_31 32
|
||
|
#define INC_32 32
|
||
|
#define INC_33 33
|
||
|
|
||
|
#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 DEC_10 9
|
||
|
#define DEC_11 10
|
||
|
#define DEC_12 11
|
||
|
#define DEC_13 12
|
||
|
#define DEC_14 13
|
||
|
#define DEC_15 14
|
||
|
#define DEC_16 15
|
||
|
#define DEC_17 16
|
||
|
#define DEC_18 17
|
||
|
#define DEC_19 18
|
||
|
#define DEC_20 19
|
||
|
#define DEC_21 20
|
||
|
#define DEC_22 21
|
||
|
#define DEC_23 22
|
||
|
#define DEC_24 23
|
||
|
#define DEC_25 24
|
||
|
#define DEC_26 25
|
||
|
#define DEC_27 26
|
||
|
#define DEC_28 27
|
||
|
#define DEC_29 28
|
||
|
#define DEC_30 29
|
||
|
#define DEC_31 30
|
||
|
#define DEC_32 31
|
||
|
#define DEC_33 32
|
||
|
|
||
|
#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(~)
|
||
|
|
||
|
#define NOT(x) CHECK(PRIMITIVE_CAT(NOT_, x))
|
||
|
#define NOT_0 PROBE(~)
|
||
|
|
||
|
#define COMPL(b) PRIMITIVE_CAT(COMPL_, b)
|
||
|
#define COMPL_0 1
|
||
|
#define COMPL_1 0
|
||
|
|
||
|
#define BOOL(x) COMPL(NOT(x))
|
||
|
|
||
|
#define IIF(c) PRIMITIVE_CAT(IIF_, c)
|
||
|
#define IIF_0(t, ...) __VA_ARGS__
|
||
|
#define IIF_1(t, ...) t
|
||
|
|
||
|
#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(id) id DEFER(EMPTY)()
|
||
|
|
||
|
#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 WHILE(pred, op, ...) \
|
||
|
IF(pred(__VA_ARGS__)) \
|
||
|
( \
|
||
|
OBSTRUCT(WHILE_INDIRECT) () \
|
||
|
( \
|
||
|
pred, op, op(__VA_ARGS__) \
|
||
|
), \
|
||
|
__VA_ARGS__ \
|
||
|
)
|
||
|
#define WHILE_INDIRECT() WHILE
|
||
|
|
||
|
#define PRIMITIVE_COMPARE(x, y) IS_PAREN \
|
||
|
( \
|
||
|
COMPARE_ ## x ( COMPARE_ ## y) (()) \
|
||
|
)
|
||
|
|
||
|
#define IS_COMPARABLE(x) IS_PAREN( CAT(COMPARE_, x) (()) )
|
||
|
|
||
|
#define NOT_EQUAL(x, y) \
|
||
|
IIF(BITAND(IS_COMPARABLE(x))(IS_COMPARABLE(y)) ) \
|
||
|
( \
|
||
|
PRIMITIVE_COMPARE, \
|
||
|
1 EAT \
|
||
|
)(x, y)
|
||
|
|
||
|
#define EQUAL(x, y) COMPL(NOT_EQUAL(x, y))
|
||
|
|
||
|
#define COMMA() ,
|
||
|
|
||
|
#define COMMA_IF(n) IF(n)(COMMA, EAT)()
|
||
|
|
||
|
#define PLUS() +
|
||
|
|
||
|
#define _TUPLE_ELEM_0(a, ...) a
|
||
|
#define _TUPLE_ELEM_1(a, b, ...) b
|
||
|
#define _TUPLE_ELEM_2(a, b, c, ...) c
|
||
|
#define _TUPLE_ELEM_3(a, b, c, d, ...) d
|
||
|
#define _TUPLE_ELEM_4(a, b, c, d, e, ...) e
|
||
|
|
||
|
#define TUPLE_ELEM_0(T) EVAL(_TUPLE_ELEM_0 T)
|
||
|
#define TUPLE_ELEM_1(T) EVAL(_TUPLE_ELEM_1 T)
|
||
|
#define TUPLE_ELEM_2(T) EVAL(_TUPLE_ELEM_2 T)
|
||
|
#define TUPLE_ELEM_3(T) EVAL(_TUPLE_ELEM_3 T)
|
||
|
#define TUPLE_ELEM_4(T) EVAL(_TUPLE_ELEM_4 T)
|
||
|
|
||
|
#define _TUPLE_FOLD_LEFT_0(i, T, op) (_TUPLE_ELEM_0 CAT(T,i)) op()
|
||
|
#define _TUPLE_FOLD_LEFT_1(i, T, op) (_TUPLE_ELEM_1 CAT(T,i)) op()
|
||
|
#define _TUPLE_FOLD_LEFT_2(i, T, op) (_TUPLE_ELEM_2 CAT(T,i)) op()
|
||
|
#define _TUPLE_FOLD_LEFT_3(i, T, op) (_TUPLE_ELEM_3 CAT(T,i)) op()
|
||
|
#define _TUPLE_FOLD_LEFT_4(i, T, op) (_TUPLE_ELEM_4 CAT(T,i)) op()
|
||
|
|
||
|
#define TUPLE_FOLD_LEFT_0(len, T, op) EVAL(REPEAT(len, _TUPLE_FOLD_LEFT_0, T, op))
|
||
|
#define TUPLE_FOLD_LEFT_1(len, T, op) EVAL(REPEAT(len, _TUPLE_FOLD_LEFT_1, T, op))
|
||
|
#define TUPLE_FOLD_LEFT_2(len, T, op) EVAL(REPEAT(len, _TUPLE_FOLD_LEFT_2, T, op))
|
||
|
#define TUPLE_FOLD_LEFT_3(len, T, op) EVAL(REPEAT(len, _TUPLE_FOLD_LEFT_3, T, op))
|
||
|
#define TUPLE_FOLD_LEFT_4(len, T, op) EVAL(REPEAT(len, _TUPLE_FOLD_LEFT_4, T, op))
|
||
|
|
||
|
#endif
|