1 /*============================================================================= 2 Boost.Wave: A Standard compliant C++ preprocessor library 3 http://www.boost.org/ 4 5 Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost 6 Software License, Version 1.0. (See accompanying file 7 LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 8 =============================================================================*/ 9 10 // The follwoing is a parametized partially expanding concatenation macro. 11 // It is a extremly good test of expansion order and the order of operations 12 // during macro expansion in general. 13 14 #define CAT(a, b) a ## b 15 16 #define PARTIAL_CAT(i) CAT(PARTIAL_CAT_, i) 17 18 #define PARTIAL_CAT_0(a, b) CAT(a, b) 19 #define PARTIAL_CAT_1(a, b) CAT(PARTIAL ## a, b) 20 #define PARTIAL_CAT_2(a, b) CAT(a, b ## PARTIAL) 21 #define PARTIAL_CAT_3(a, b) CAT(PARTIAL ## a, b ## PARTIAL) 22 23 #define PARTIAL 24 #define PARTIALPARTIAL 25 26 #define X Token1 27 #define Y Token2 28 29 //R #line 31 "t_1_008.cpp" 30 //R Token1Token2 31 PARTIAL_CAT(0)( PARTIAL X, Y PARTIAL ) 32 //R #line 34 "t_1_008.cpp" 33 //R XToken2 34 PARTIAL_CAT(1)( PARTIAL X, Y PARTIAL ) 35 //R #line 37 "t_1_008.cpp" 36 //R Token1Y 37 PARTIAL_CAT(2)( PARTIAL X, Y PARTIAL ) 38 //R #line 40 "t_1_008.cpp" 39 //R XY 40 PARTIAL_CAT(3)( PARTIAL X, Y PARTIAL ) 41 42 //H 10: t_1_008.cpp(14): #define 43 //H 08: t_1_008.cpp(14): CAT(a, b)=a ## b 44 //H 10: t_1_008.cpp(16): #define 45 //H 08: t_1_008.cpp(16): PARTIAL_CAT(i)=CAT(PARTIAL_CAT_, i) 46 //H 10: t_1_008.cpp(18): #define 47 //H 08: t_1_008.cpp(18): PARTIAL_CAT_0(a, b)=CAT(a, b) 48 //H 10: t_1_008.cpp(19): #define 49 //H 08: t_1_008.cpp(19): PARTIAL_CAT_1(a, b)=CAT(PARTIAL ## a, b) 50 //H 10: t_1_008.cpp(20): #define 51 //H 08: t_1_008.cpp(20): PARTIAL_CAT_2(a, b)=CAT(a, b ## PARTIAL) 52 //H 10: t_1_008.cpp(21): #define 53 //H 08: t_1_008.cpp(21): PARTIAL_CAT_3(a, b)=CAT(PARTIAL ## a, b ## PARTIAL) 54 //H 10: t_1_008.cpp(23): #define 55 //H 08: t_1_008.cpp(23): PARTIAL= 56 //H 10: t_1_008.cpp(24): #define 57 //H 08: t_1_008.cpp(24): PARTIALPARTIAL= 58 //H 10: t_1_008.cpp(26): #define 59 //H 08: t_1_008.cpp(26): X=Token1 60 //H 10: t_1_008.cpp(27): #define 61 //H 08: t_1_008.cpp(27): Y=Token2 62 //H 00: t_1_008.cpp(31): PARTIAL_CAT(0), [t_1_008.cpp(16): PARTIAL_CAT(i)=CAT(PARTIAL_CAT_, i)] 63 //H 02: CAT(PARTIAL_CAT_, 0) 64 //H 00: t_1_008.cpp(16): CAT(PARTIAL_CAT_, 0), [t_1_008.cpp(14): CAT(a, b)=a ## b] 65 //H 02: PARTIAL_CAT_0 66 //H 03: PARTIAL_CAT_0 67 //H 03: PARTIAL_CAT_0 68 //H 00: t_1_008.cpp(16): PARTIAL_CAT_0( PARTIAL X, Y PARTIAL ), [t_1_008.cpp(18): PARTIAL_CAT_0(a, b)=CAT(a, b)] 69 //H 01: t_1_008.cpp(23): PARTIAL 70 //H 02: 71 //H 03: _ 72 //H 01: t_1_008.cpp(26): X 73 //H 02: Token1 74 //H 03: Token1 75 //H 01: t_1_008.cpp(27): Y 76 //H 02: Token2 77 //H 03: Token2 78 //H 01: t_1_008.cpp(23): PARTIAL 79 //H 02: 80 //H 03: _ 81 //H 02: CAT( Token1, Token2 ) 82 //H 00: t_1_008.cpp(18): CAT( Token1, Token2 ), [t_1_008.cpp(14): CAT(a, b)=a ## b] 83 //H 02: Token1Token2 84 //H 03: Token1Token2 85 //H 03: Token1Token2 86 //H 00: t_1_008.cpp(34): PARTIAL_CAT(1), [t_1_008.cpp(16): PARTIAL_CAT(i)=CAT(PARTIAL_CAT_, i)] 87 //H 02: CAT(PARTIAL_CAT_, 1) 88 //H 00: t_1_008.cpp(16): CAT(PARTIAL_CAT_, 1), [t_1_008.cpp(14): CAT(a, b)=a ## b] 89 //H 02: PARTIAL_CAT_1 90 //H 03: PARTIAL_CAT_1 91 //H 03: PARTIAL_CAT_1 92 //H 00: t_1_008.cpp(16): PARTIAL_CAT_1( PARTIAL X, Y PARTIAL ), [t_1_008.cpp(19): PARTIAL_CAT_1(a, b)=CAT(PARTIAL ## a, b)] 93 //H 01: t_1_008.cpp(27): Y 94 //H 02: Token2 95 //H 03: Token2 96 //H 01: t_1_008.cpp(23): PARTIAL 97 //H 02: 98 //H 03: _ 99 //H 02: CAT(PARTIALPARTIAL X, Token2 ) 100 //H 00: t_1_008.cpp(19): CAT(PARTIALPARTIAL X, Token2 ), [t_1_008.cpp(14): CAT(a, b)=a ## b] 101 //H 02: PARTIALPARTIAL XToken2 102 //H 01: t_1_008.cpp(24): PARTIALPARTIAL 103 //H 02: 104 //H 03: _ 105 //H 03: XToken2 106 //H 03: XToken2 107 //H 00: t_1_008.cpp(37): PARTIAL_CAT(2), [t_1_008.cpp(16): PARTIAL_CAT(i)=CAT(PARTIAL_CAT_, i)] 108 //H 02: CAT(PARTIAL_CAT_, 2) 109 //H 00: t_1_008.cpp(16): CAT(PARTIAL_CAT_, 2), [t_1_008.cpp(14): CAT(a, b)=a ## b] 110 //H 02: PARTIAL_CAT_2 111 //H 03: PARTIAL_CAT_2 112 //H 03: PARTIAL_CAT_2 113 //H 00: t_1_008.cpp(16): PARTIAL_CAT_2( PARTIAL X, Y PARTIAL ), [t_1_008.cpp(20): PARTIAL_CAT_2(a, b)=CAT(a, b ## PARTIAL)] 114 //H 01: t_1_008.cpp(23): PARTIAL 115 //H 02: 116 //H 03: _ 117 //H 01: t_1_008.cpp(26): X 118 //H 02: Token1 119 //H 03: Token1 120 //H 02: CAT( Token1, Y PARTIALPARTIAL) 121 //H 00: t_1_008.cpp(20): CAT( Token1, Y PARTIALPARTIAL), [t_1_008.cpp(14): CAT(a, b)=a ## b] 122 //H 02: Token1Y PARTIALPARTIAL 123 //H 01: t_1_008.cpp(24): PARTIALPARTIAL 124 //H 02: 125 //H 03: _ 126 //H 03: Token1Y_ 127 //H 03: Token1Y_ 128 //H 00: t_1_008.cpp(40): PARTIAL_CAT(3), [t_1_008.cpp(16): PARTIAL_CAT(i)=CAT(PARTIAL_CAT_, i)] 129 //H 02: CAT(PARTIAL_CAT_, 3) 130 //H 00: t_1_008.cpp(16): CAT(PARTIAL_CAT_, 3), [t_1_008.cpp(14): CAT(a, b)=a ## b] 131 //H 02: PARTIAL_CAT_3 132 //H 03: PARTIAL_CAT_3 133 //H 03: PARTIAL_CAT_3 134 //H 00: t_1_008.cpp(16): PARTIAL_CAT_3( PARTIAL X, Y PARTIAL ), [t_1_008.cpp(21): PARTIAL_CAT_3(a, b)=CAT(PARTIAL ## a, b ## PARTIAL)] 135 //H 02: CAT(PARTIALPARTIAL X, Y PARTIALPARTIAL) 136 //H 00: t_1_008.cpp(21): CAT(PARTIALPARTIAL X, Y PARTIALPARTIAL), [t_1_008.cpp(14): CAT(a, b)=a ## b] 137 //H 02: PARTIALPARTIAL XY PARTIALPARTIAL 138 //H 01: t_1_008.cpp(24): PARTIALPARTIAL 139 //H 02: 140 //H 03: _ 141 //H 01: t_1_008.cpp(24): PARTIALPARTIAL 142 //H 02: 143 //H 03: _ 144 //H 03: XY_ 145 //H 03: XY_ 146