1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/mfbt/MacroForEach.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,158 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +/* 1.11 + * Implements a higher-order macro for iteratively calling another macro with 1.12 + * fixed leading arguments, plus a trailing element picked from a second list 1.13 + * of arguments. 1.14 + */ 1.15 + 1.16 +#ifndef mozilla_MacroForEach_h 1.17 +#define mozilla_MacroForEach_h 1.18 + 1.19 +#include "mozilla/MacroArgs.h" 1.20 + 1.21 +/* 1.22 + * MOZ_FOR_EACH(aMacro, aFixedArgs, aArgs) expands to N calls to the macro 1.23 + * |aMacro| where N is equal the number of items in the list |aArgs|. The 1.24 + * arguments for each |aMacro| call are composed of *all* arguments in the list 1.25 + * |aFixedArgs| as well as a single argument in the list |aArgs|. For example: 1.26 + * 1.27 + * #define MACRO_A(x) x + 1.28 + * int a = MOZ_FOR_EACH(MACRO_A, (), (1, 2, 3)) 0; 1.29 + * // Expands to: MACRO_A(1) MACRO_A(2) MACRO_A(3) 0; 1.30 + * // And further to: 1 + 2 + 3 + 0; 1.31 + * 1.32 + * #define MACRO_B(k, x) (k + x) + 1.33 + * int b = MOZ_FOR_EACH(MACRO_B, (5,), (1, 2)) 0; 1.34 + * // Expands to: MACRO_B(5, 1) MACRO_B(5, 2) 0; 1.35 + * 1.36 + * #define MACRO_C(k1, k2, x) (k1 + k2 + x) + 1.37 + * int c = MOZ_FOR_EACH(MACRO_C, (5, 8,), (1, 2)) 0; 1.38 + * // Expands to: MACRO_B(5, 8, 1) MACRO_B(5, 8, 2) 0; 1.39 + * 1.40 + * If the |aFixedArgs| list is not empty, a trailing comma must be included. 1.41 + * 1.42 + * The |aArgs| list must be not be empty and may be up to 50 items long. Use 1.43 + * MOZ_STATIC_ASSERT_VALID_ARG_COUNT to ensure that violating this constraint 1.44 + * results in a compile-time error. 1.45 + */ 1.46 +#define MOZ_FOR_EACH_EXPAND_HELPER(...) __VA_ARGS__ 1.47 +#define MOZ_FOR_EACH_GLUE(a, b) a b 1.48 +#define MOZ_FOR_EACH(aMacro, aFixedArgs, aArgs) \ 1.49 + MOZ_FOR_EACH_GLUE( \ 1.50 + MOZ_PASTE_PREFIX_AND_ARG_COUNT(MOZ_FOR_EACH_, \ 1.51 + MOZ_FOR_EACH_EXPAND_HELPER aArgs), \ 1.52 + (aMacro, aFixedArgs, aArgs)) 1.53 + 1.54 +#define MOZ_FOR_EACH_HELPER_GLUE(a, b) a b 1.55 +#define MOZ_FOR_EACH_HELPER(aMacro, aFixedArgs, aArgs) \ 1.56 + MOZ_FOR_EACH_HELPER_GLUE( \ 1.57 + aMacro, \ 1.58 + (MOZ_FOR_EACH_EXPAND_HELPER aFixedArgs MOZ_ARG_1 aArgs)) 1.59 + 1.60 +#define MOZ_FOR_EACH_1(m, fa, a) \ 1.61 + MOZ_FOR_EACH_HELPER(m, fa, a) 1.62 +#define MOZ_FOR_EACH_2(m, fa, a) \ 1.63 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_1(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.64 +#define MOZ_FOR_EACH_3(m, fa, a) \ 1.65 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_2(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.66 +#define MOZ_FOR_EACH_4(m, fa, a) \ 1.67 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_3(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.68 +#define MOZ_FOR_EACH_5(m, fa, a) \ 1.69 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_4(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.70 +#define MOZ_FOR_EACH_6(m, fa, a) \ 1.71 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_5(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.72 +#define MOZ_FOR_EACH_7(m, fa, a) \ 1.73 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_6(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.74 +#define MOZ_FOR_EACH_8(m, fa, a) \ 1.75 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_7(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.76 +#define MOZ_FOR_EACH_9(m, fa, a) \ 1.77 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_8(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.78 +#define MOZ_FOR_EACH_10(m, fa, a) \ 1.79 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_9(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.80 +#define MOZ_FOR_EACH_11(m, fa, a) \ 1.81 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_10(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.82 +#define MOZ_FOR_EACH_12(m, fa, a) \ 1.83 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_11(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.84 +#define MOZ_FOR_EACH_13(m, fa, a) \ 1.85 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_12(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.86 +#define MOZ_FOR_EACH_14(m, fa, a) \ 1.87 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_13(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.88 +#define MOZ_FOR_EACH_15(m, fa, a) \ 1.89 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_14(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.90 +#define MOZ_FOR_EACH_16(m, fa, a) \ 1.91 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_15(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.92 +#define MOZ_FOR_EACH_17(m, fa, a) \ 1.93 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_16(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.94 +#define MOZ_FOR_EACH_18(m, fa, a) \ 1.95 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_17(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.96 +#define MOZ_FOR_EACH_19(m, fa, a) \ 1.97 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_18(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.98 +#define MOZ_FOR_EACH_20(m, fa, a) \ 1.99 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_19(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.100 +#define MOZ_FOR_EACH_21(m, fa, a) \ 1.101 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_20(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.102 +#define MOZ_FOR_EACH_22(m, fa, a) \ 1.103 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_21(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.104 +#define MOZ_FOR_EACH_23(m, fa, a) \ 1.105 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_22(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.106 +#define MOZ_FOR_EACH_24(m, fa, a) \ 1.107 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_23(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.108 +#define MOZ_FOR_EACH_25(m, fa, a) \ 1.109 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_24(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.110 +#define MOZ_FOR_EACH_26(m, fa, a) \ 1.111 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_25(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.112 +#define MOZ_FOR_EACH_27(m, fa, a) \ 1.113 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_26(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.114 +#define MOZ_FOR_EACH_28(m, fa, a) \ 1.115 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_27(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.116 +#define MOZ_FOR_EACH_29(m, fa, a) \ 1.117 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_28(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.118 +#define MOZ_FOR_EACH_30(m, fa, a) \ 1.119 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_29(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.120 +#define MOZ_FOR_EACH_31(m, fa, a) \ 1.121 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_30(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.122 +#define MOZ_FOR_EACH_32(m, fa, a) \ 1.123 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_31(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.124 +#define MOZ_FOR_EACH_33(m, fa, a) \ 1.125 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_32(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.126 +#define MOZ_FOR_EACH_34(m, fa, a) \ 1.127 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_33(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.128 +#define MOZ_FOR_EACH_35(m, fa, a) \ 1.129 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_34(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.130 +#define MOZ_FOR_EACH_36(m, fa, a) \ 1.131 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_35(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.132 +#define MOZ_FOR_EACH_37(m, fa, a) \ 1.133 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_36(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.134 +#define MOZ_FOR_EACH_38(m, fa, a) \ 1.135 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_37(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.136 +#define MOZ_FOR_EACH_39(m, fa, a) \ 1.137 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_38(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.138 +#define MOZ_FOR_EACH_40(m, fa, a) \ 1.139 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_39(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.140 +#define MOZ_FOR_EACH_41(m, fa, a) \ 1.141 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_40(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.142 +#define MOZ_FOR_EACH_42(m, fa, a) \ 1.143 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_41(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.144 +#define MOZ_FOR_EACH_43(m, fa, a) \ 1.145 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_42(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.146 +#define MOZ_FOR_EACH_44(m, fa, a) \ 1.147 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_43(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.148 +#define MOZ_FOR_EACH_45(m, fa, a) \ 1.149 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_44(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.150 +#define MOZ_FOR_EACH_46(m, fa, a) \ 1.151 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_45(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.152 +#define MOZ_FOR_EACH_47(m, fa, a) \ 1.153 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_46(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.154 +#define MOZ_FOR_EACH_48(m, fa, a) \ 1.155 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_47(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.156 +#define MOZ_FOR_EACH_49(m, fa, a) \ 1.157 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_48(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.158 +#define MOZ_FOR_EACH_50(m, fa, a) \ 1.159 + MOZ_FOR_EACH_HELPER(m, fa, a) MOZ_FOR_EACH_49(m, fa, (MOZ_ARGS_AFTER_1 a)) 1.160 + 1.161 +#endif /* mozilla_MacroForEach_h */