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)