|
Boost : |
Subject: Re: [boost] [preprocessor] Sequences vs. All Other Data Structures
From: Paul Mensonides (pmenso57_at_[hidden])
Date: 2012-04-27 01:06:58
On 4/26/2012 5:55 PM, Paul Mensonides wrote:
> Implementation of the above attached--probably lots of room for
> improvement and optimization. Apologies for the mega function (in
> particular--I didn't feel like refactoring) and the (non-portable) shell
> color-coding (I wanted to see blue paint). I built it with g++ 4.7.0,
> but I believe 4.6+ should also work.
>
> $ g++ -std=c++11 -I $CHAOS_ROOT 1.cpp
Updated attached. This one executes some more realistic tests.
(I must say having no lexer to tokenize input and no parser to process
directives makes input a pain in the ass.)
#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#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 EXPR_S(s) PRIMITIVE_CAT(EXPR_, s)
#define EXPR_0(...) __VA_ARGS__
#define EXPR_1(...) __VA_ARGS__
#define EXPR_2(...) __VA_ARGS__
#define EXPR_3(...) __VA_ARGS__
#define EXPR_4(...) __VA_ARGS__
#define EXPR_5(...) __VA_ARGS__
#define EXPR_6(...) __VA_ARGS__
#define EXPR_7(...) __VA_ARGS__
#define EXPR_8(...) __VA_ARGS__
#define EXPR_9(...) __VA_ARGS__
#define SPLIT(i, ...) PRIMITIVE_CAT(SPLIT_, i)(, __VA_ARGS__)
#define SPLIT_0(p, a, ...) p ## a
#define SPLIT_1(p, a, ...) p ## __VA_ARGS__
#define IS_VARIADIC(...) \
SPLIT(0, CAT(IS_VARIADIC_, IS_VARIADIC_C __VA_ARGS__)) \
/**/
#define IS_VARIADIC_C(...) 1
#define IS_VARIADIC_IS_VARIADIC_C 0,
#define IS_VARIADIC_1 1,
#define NOT(x) IS_VARIADIC(PRIMITIVE_CAT(NOT_, x))
#define NOT_0 ()
#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 EMPTY()
#define DEFER(id) id EMPTY()
#define OBSTRUCT(id) id DEFER(EMPTY)()
#define EAT(...)
#define REPEAT_S(s, n, m, ...) \
IF(n)(REPEAT_I, EAT)(, OBSTRUCT(), INC(s), DEC(n), m, __VA_ARGS__) \
/**/
#define REPEAT_INDIRECT() REPEAT_S
#define REPEAT_I(p, _, s, n, m, ...) \
EXPR_S _(s)( \
REPEAT_INDIRECT _()( \
s, n, p ## m, p ## __VA_ARGS__ \
) \
p ## m _(s, n, p ## __VA_ARGS__) \
) \
/**/
#define COMMA() ,
#define COMMA_IF(n) IF(n)(COMMA, EAT)()
#define A(s, i, id) \
COMMA_IF(i) \
template<EXPR_S(s)(REPEAT_S(s, INC(i), B, ~))> class id ## i \
/**/
#define B(s, i, _) COMMA_IF(i) class
EXPR_S(0)(REPEAT_S(0, 3, A, T))
The attached implementation yields correct results.
g++ yields
template< class> class T0 , template< class , class> class T1 ,
template< class , class , class> class T2
which is correct.
wave yields
template<class> class T0 , template<class , class> class T1 ,
template<class , class , class> class T2
which is correct.
Unsurprisingly, VC++ errors.
Regards,
Paul Mensonides
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk