mfbt/MacroForEach.h

changeset 0
6474c204b198
     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 */

mercurial