From 54d0da52213c931aa9f45139a87eede400879557 Mon Sep 17 00:00:00 2001 From: Vesa Karvonen Date: Fri, 14 Jun 2002 20:38:54 +0000 Subject: [PATCH] Using private detail CAT to avoid DELAY macros [SVN r14147] --- include/boost/preprocessor/dec.hpp | 5 ++-- include/boost/preprocessor/detail/cat.hpp | 25 +++++++++++++++++++ include/boost/preprocessor/expr_if.hpp | 9 +++---- include/boost/preprocessor/if.hpp | 6 ++--- include/boost/preprocessor/inc.hpp | 5 ++-- .../boost/preprocessor/list/for_each_i.hpp | 8 +++--- include/boost/preprocessor/logical/bool.hpp | 5 ++-- include/boost/preprocessor/logical/nor.hpp | 13 +++++----- include/boost/preprocessor/repeat.hpp | 10 +++----- include/boost/preprocessor/tuple/eat.hpp | 5 ++-- 10 files changed, 57 insertions(+), 34 deletions(-) create mode 100644 include/boost/preprocessor/detail/cat.hpp diff --git a/include/boost/preprocessor/dec.hpp b/include/boost/preprocessor/dec.hpp index 8686e82..f414522 100644 --- a/include/boost/preprocessor/dec.hpp +++ b/include/boost/preprocessor/dec.hpp @@ -13,6 +13,8 @@ * See http://www.boost.org for most recent version. */ +#include + /**

Decrements X expanding to a single token.

For example, BOOST_PP_DEC(3) expands to 2 (a @@ -23,9 +25,8 @@ single token).

Only decimal integer literals in the range [0,BOOST_PP_LIMIT_MAG] are supported.

*/ -#define BOOST_PP_DEC(X) BOOST_PP_DEC_DELAY(X) +#define BOOST_PP_DEC(X) BOOST_PP_DETAIL_CAT2(BOOST_PP_DEC,X) -#define BOOST_PP_DEC_DELAY(X) BOOST_PP_DEC##X #define BOOST_PP_DEC0 0 #define BOOST_PP_DEC1 0 #define BOOST_PP_DEC2 1 diff --git a/include/boost/preprocessor/detail/cat.hpp b/include/boost/preprocessor/detail/cat.hpp new file mode 100644 index 0000000..8ccad4e --- /dev/null +++ b/include/boost/preprocessor/detail/cat.hpp @@ -0,0 +1,25 @@ +#ifndef BOOST_PREPROCESSOR_DETAIL_CAT_HPP +#define BOOST_PREPROCESSOR_DETAIL_CAT_HPP + +/* Copyright (C) 2002 Vesa Karvonen + * + * Permission to copy, use, modify, sell and distribute this software is + * granted provided this copyright notice appears in all copies. This + * software is provided "as is" without express or implied warranty, and + * with no claim as to its suitability for any purpose. + * + * See http://www.boost.org for most recent version. + */ + +#define BOOST_PP_DETAIL_CAT2(A,B) BOOST_PP_DETAIL_DO_CAT2(A,B) +#define BOOST_PP_DETAIL_DO_CAT2(A,B) A##B + +#define BOOST_PP_DETAIL_CAT3(A,B,C) BOOST_PP_DETAIL_DO_CAT3(A,B,C) +#define BOOST_PP_DETAIL_DO_CAT3(A,B,C) A##B##C + +#define BOOST_PP_DETAIL_CAT4(A,B,C,D) BOOST_PP_DETAIL_DO_CAT4(A,B,C,D) +#define BOOST_PP_DETAIL_DO_CAT4(A,B,C,D) A##B##C##D + +#define BOOST_PP_DETAIL_CAT5(A,B,C,D,E) BOOST_PP_DETAIL_DO_CAT5(A,B,C,D,E) +#define BOOST_PP_DETAIL_DO_CAT5(A,B,C,D,E) A##B##C##D##E +#endif diff --git a/include/boost/preprocessor/expr_if.hpp b/include/boost/preprocessor/expr_if.hpp index 7122c3f..b748264 100644 --- a/include/boost/preprocessor/expr_if.hpp +++ b/include/boost/preprocessor/expr_if.hpp @@ -13,6 +13,7 @@ * See http://www.boost.org for most recent version. */ +#include #include /**

Expands to EXPR if COND != 0 and to nothing if COND == 0.

@@ -26,10 +27,8 @@
  • BOOST_PP_IF()
  • */ -#define BOOST_PP_EXPR_IF(COND,EXPR) BOOST_PP_EXPR_IF_BOOL(BOOST_PP_BOOL(COND))(EXPR) +#define BOOST_PP_EXPR_IF(COND,EXPR) BOOST_PP_DETAIL_CAT2(BOOST_PP_EXPR_IF,BOOST_PP_BOOL(COND))(EXPR) -#define BOOST_PP_EXPR_IF_BOOL(C) BOOST_PP_EXPR_IF_BOOL_DELAY(C) -#define BOOST_PP_EXPR_IF_BOOL_DELAY(C) BOOST_PP_EXPR_IF_BOOL##C -#define BOOST_PP_EXPR_IF_BOOL0(E) -#define BOOST_PP_EXPR_IF_BOOL1(E) E +#define BOOST_PP_EXPR_IF0(E) +#define BOOST_PP_EXPR_IF1(E) E #endif diff --git a/include/boost/preprocessor/if.hpp b/include/boost/preprocessor/if.hpp index 041530f..b7f5a94 100644 --- a/include/boost/preprocessor/if.hpp +++ b/include/boost/preprocessor/if.hpp @@ -13,6 +13,7 @@ * See http://www.boost.org for most recent version. */ +#include #include #include @@ -33,8 +34,5 @@
  • preprocessor_test.cpp
  • */ -#define BOOST_PP_IF(COND,THEN,ELSE) BOOST_PP_IF_BOOL(BOOST_PP_BOOL(COND))(ELSE,THEN) - -#define BOOST_PP_IF_BOOL(C) BOOST_PP_IF_BOOL_DELAY(C) -#define BOOST_PP_IF_BOOL_DELAY(C) BOOST_PP_TUPLE2_ELEM##C +#define BOOST_PP_IF(COND,THEN,ELSE) BOOST_PP_DETAIL_CAT2(BOOST_PP_TUPLE2_ELEM,BOOST_PP_BOOL(COND))(ELSE,THEN) #endif diff --git a/include/boost/preprocessor/inc.hpp b/include/boost/preprocessor/inc.hpp index f095274..8bf735b 100644 --- a/include/boost/preprocessor/inc.hpp +++ b/include/boost/preprocessor/inc.hpp @@ -13,6 +13,8 @@ * See http://www.boost.org for most recent version. */ +#include + /**

    Increments X expanding to a single token.

    For example, BOOST_PP_INC(3) expands to 4 (a @@ -24,9 +26,8 @@ BOOST_PP_LIMIT_MAG yields a BOOST_PP_LIMIT_MAG.

    Only decimal integer literals in the range [0,BOOST_PP_LIMIT_MAG] are supported.

    */ -#define BOOST_PP_INC(X) BOOST_PP_INC_DELAY(X) +#define BOOST_PP_INC(X) BOOST_PP_DETAIL_CAT2(BOOST_PP_INC,X) -#define BOOST_PP_INC_DELAY(X) BOOST_PP_INC##X #define BOOST_PP_INC0 1 #define BOOST_PP_INC1 2 #define BOOST_PP_INC2 3 diff --git a/include/boost/preprocessor/list/for_each_i.hpp b/include/boost/preprocessor/list/for_each_i.hpp index 41602cc..e547852 100644 --- a/include/boost/preprocessor/list/for_each_i.hpp +++ b/include/boost/preprocessor/list/for_each_i.hpp @@ -45,8 +45,8 @@ prefix_A(0); prefix_B(1); prefix_C(2); #define BOOST_PP_LIST_FOR_EACH_I(MACRO,DATA,LIST) BOOST_PP_LIST_FOR_EACH_I_R(0,MACRO,DATA,LIST) /**

    Can be used inside BOOST_PP_FOR() (see for an explanation of the R parameter).

    */ -#define BOOST_PP_LIST_FOR_EACH_I_R(R,MACRO,DATA,LIST) BOOST_PP_FOR##R((MACRO,DATA,LIST,0),BOOST_PP_LIST_FOR_EACH_I_C,BOOST_PP_LIST_FOR_EACH_I_F,BOOST_PP_LIST_FOR_EACH_I_I) -#define BOOST_PP_LIST_FOR_EACH_I_C(R,MDLI) BOOST_PP_TUPLE_ELEM(3,2,BOOST_PP_TUPLE_ELEM(4,2,MDLI)) -#define BOOST_PP_LIST_FOR_EACH_I_F(R,MDLI) (BOOST_PP_TUPLE_ELEM(4,0,MDLI),BOOST_PP_TUPLE_ELEM(4,1,MDLI),BOOST_PP_TUPLE_ELEM(3,1,BOOST_PP_TUPLE_ELEM(4,2,MDLI)),BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4,3,MDLI))) -#define BOOST_PP_LIST_FOR_EACH_I_I(R,MDLI) BOOST_PP_TUPLE_ELEM(4,0,MDLI)(R,BOOST_PP_TUPLE_ELEM(4,1,MDLI),BOOST_PP_TUPLE_ELEM(4,3,MDLI),BOOST_PP_TUPLE_ELEM(3,0,BOOST_PP_TUPLE_ELEM(4,2,MDLI))) +#define BOOST_PP_LIST_FOR_EACH_I_R(R,MACRO,DATA,LIST) BOOST_PP_FOR##R((MACRO,DATA,LIST,0),BOOST_PP_LIST_FOR_EACH_I_P,BOOST_PP_LIST_FOR_EACH_I_O,BOOST_PP_LIST_FOR_EACH_I_M) +#define BOOST_PP_LIST_FOR_EACH_I_P(R,MDLI) BOOST_PP_TUPLE_ELEM(3,2,BOOST_PP_TUPLE_ELEM(4,2,MDLI)) +#define BOOST_PP_LIST_FOR_EACH_I_O(R,MDLI) (BOOST_PP_TUPLE_ELEM(4,0,MDLI),BOOST_PP_TUPLE_ELEM(4,1,MDLI),BOOST_PP_TUPLE_ELEM(3,1,BOOST_PP_TUPLE_ELEM(4,2,MDLI)),BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4,3,MDLI))) +#define BOOST_PP_LIST_FOR_EACH_I_M(R,MDLI) BOOST_PP_TUPLE_ELEM(4,0,MDLI)(R,BOOST_PP_TUPLE_ELEM(4,1,MDLI),BOOST_PP_TUPLE_ELEM(4,3,MDLI),BOOST_PP_TUPLE_ELEM(3,0,BOOST_PP_TUPLE_ELEM(4,2,MDLI))) #endif diff --git a/include/boost/preprocessor/logical/bool.hpp b/include/boost/preprocessor/logical/bool.hpp index fd10546..5f41ee8 100644 --- a/include/boost/preprocessor/logical/bool.hpp +++ b/include/boost/preprocessor/logical/bool.hpp @@ -13,18 +13,19 @@ * See http://www.boost.org for most recent version. */ +#include + /**

    Expands to 0 if X == 0 and 1 if X != 0.

    X must be an integer literal in the range [0, BOOST_PP_LIMIT_MAG].

    For example, BOOST_PP_BOOL(3) expands to 1.

    */ -#define BOOST_PP_BOOL(X) BOOST_PP_BOOL_DELAY(X) +#define BOOST_PP_BOOL(X) BOOST_PP_DETAIL_CAT2(BOOST_PP_BOOL,X) /* BOOL can be implemented in O(1) tokens using saturated ADD & SUB. * Unfortunately, it would result in significantly slower preprocessing. */ -#define BOOST_PP_BOOL_DELAY(X) BOOST_PP_BOOL##X #define BOOST_PP_BOOL0 0 #define BOOST_PP_BOOL1 1 #define BOOST_PP_BOOL2 1 diff --git a/include/boost/preprocessor/logical/nor.hpp b/include/boost/preprocessor/logical/nor.hpp index c65d2e3..d6c851c 100644 --- a/include/boost/preprocessor/logical/nor.hpp +++ b/include/boost/preprocessor/logical/nor.hpp @@ -13,6 +13,7 @@ * See http://www.boost.org for most recent version. */ +#include #include /**

    Expands to the logical NEITHER OR of the operands.

    @@ -27,12 +28,10 @@ in the range [0, BOOST_PP_LIMIT_MAG].

  • logical_test.cpp
  • */ -#define BOOST_PP_NOR(X,Y) BOOST_PP_NOR_BOOL(BOOST_PP_BOOL(X),BOOST_PP_BOOL(Y)) +#define BOOST_PP_NOR(X,Y) BOOST_PP_DETAIL_CAT3(BOOST_PP_NOR,BOOST_PP_BOOL(X),BOOST_PP_BOOL(Y)) -#define BOOST_PP_NOR_BOOL(X,Y) BOOST_PP_NOR_BOOL_DELAY(X,Y) -#define BOOST_PP_NOR_BOOL_DELAY(X,Y) BOOST_PP_NOR_BOOL##X##Y -#define BOOST_PP_NOR_BOOL00 1 -#define BOOST_PP_NOR_BOOL01 0 -#define BOOST_PP_NOR_BOOL10 0 -#define BOOST_PP_NOR_BOOL11 0 +#define BOOST_PP_NOR00 1 +#define BOOST_PP_NOR01 0 +#define BOOST_PP_NOR10 0 +#define BOOST_PP_NOR11 0 #endif diff --git a/include/boost/preprocessor/repeat.hpp b/include/boost/preprocessor/repeat.hpp index 612c252..bbc5c36 100644 --- a/include/boost/preprocessor/repeat.hpp +++ b/include/boost/preprocessor/repeat.hpp @@ -13,6 +13,7 @@ * See http://www.boost.org for most recent version. */ +#include #include #include @@ -90,8 +91,7 @@ are directly supported.

    #define BOOST_PP_REPEAT_AUTO_REC2(M,P) BOOST_PP_EXPAND(M P) #define BOOST_PP_REPEAT_AUTO_REC3(M,P) BOOST_PP_EXPAND(M P) -#define BOOST_PP_REPEAT_1(C,M,D) BOOST_PP_REPEAT_AUTO_REC1(BOOST_PP_R1_DELAY(C),(M,D)) -#define BOOST_PP_R1_DELAY(C) BOOST_PP_R1_##C +#define BOOST_PP_REPEAT_1(C,M,D) BOOST_PP_REPEAT_AUTO_REC1(BOOST_PP_DETAIL_CAT2(BOOST_PP_R1_,C),(M,D)) #define BOOST_PP_R1_0(M,D) #define BOOST_PP_R1_1(M,D) M(0,D) #define BOOST_PP_R1_2(M,D) M(0,D) M(1,D) @@ -222,8 +222,7 @@ are directly supported.

    #define BOOST_PP_R1_127(M,D) BOOST_PP_R1_126(M,D) M(126,D) #define BOOST_PP_R1_128(M,D) BOOST_PP_R1_127(M,D) M(127,D) -#define BOOST_PP_REPEAT_2(C,M,D) BOOST_PP_REPEAT_AUTO_REC2(BOOST_PP_R2_DELAY(C),(M,D)) -#define BOOST_PP_R2_DELAY(C) BOOST_PP_R2_##C +#define BOOST_PP_REPEAT_2(C,M,D) BOOST_PP_REPEAT_AUTO_REC2(BOOST_PP_DETAIL_CAT2(BOOST_PP_R2_,C),(M,D)) #define BOOST_PP_R2_0(M,D) #define BOOST_PP_R2_1(M,D) M(0,D) #define BOOST_PP_R2_2(M,D) M(0,D) M(1,D) @@ -354,8 +353,7 @@ are directly supported.

    #define BOOST_PP_R2_127(M,D) BOOST_PP_R2_126(M,D) M(126,D) #define BOOST_PP_R2_128(M,D) BOOST_PP_R2_127(M,D) M(127,D) -#define BOOST_PP_REPEAT_3(C,M,D) BOOST_PP_REPEAT_AUTO_REC3(BOOST_PP_R3_DELAY(C),(M,D)) -#define BOOST_PP_R3_DELAY(C) BOOST_PP_R3_##C +#define BOOST_PP_REPEAT_3(C,M,D) BOOST_PP_REPEAT_AUTO_REC3(BOOST_PP_DETAIL_CAT2(BOOST_PP_R3_,C),(M,D)) #define BOOST_PP_R3_0(M,D) #define BOOST_PP_R3_1(M,D) M(0,D) #define BOOST_PP_R3_2(M,D) M(0,D) M(1,D) diff --git a/include/boost/preprocessor/tuple/eat.hpp b/include/boost/preprocessor/tuple/eat.hpp index d79bfe4..4c01fc2 100644 --- a/include/boost/preprocessor/tuple/eat.hpp +++ b/include/boost/preprocessor/tuple/eat.hpp @@ -13,6 +13,8 @@ * See http://www.boost.org for most recent version. */ +#include + /**

    Expands to a macro that eats a tuple of the specified size.

    BOOST_PP_TUPLE_EAT() is designed to be used with BOOST_PP_IF() like @@ -26,9 +28,8 @@ BOOST_PP_IF(0,BOOST_PP_ENUM_PARAMS,BOOST_PP_TUPLE_EAT(2))(10,P)

    expands to nothing.

    */ -#define BOOST_PP_TUPLE_EAT(SIZE_OF_TUPLE) BOOST_PP_TUPLE_EAT_DELAY(SIZE_OF_TUPLE) +#define BOOST_PP_TUPLE_EAT(SIZE_OF_TUPLE) BOOST_PP_DETAIL_CAT3(BOOST_PP_TUPLE,SIZE_OF_TUPLE,_EAT) -#define BOOST_PP_TUPLE_EAT_DELAY(N) BOOST_PP_TUPLE##N##_EAT #define BOOST_PP_TUPLE0_EAT() #define BOOST_PP_TUPLE1_EAT(A) #define BOOST_PP_TUPLE2_EAT(A,B)