| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- // Exceptions. See /LICENSE for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- #ifndef CARBON_TOOLCHAIN_BASE_FOR_EACH_MACRO_H_
- #define CARBON_TOOLCHAIN_BASE_FOR_EACH_MACRO_H_
- /// CARBON_FOR_EACH() will apply `macro` to each argument in the variadic
- /// argument list, putting the output of `sep()` between each one.
- ///
- /// The `sep` should be a function macro that returns a separator. Premade
- /// separataors are provided as CARBON_FOR_EACH_XYZ() macros.
- #define CARBON_FOR_EACH(macro, sep, ...) \
- __VA_OPT__(CARBON_INTERNAL_FOR_EACH_EXPAND( \
- CARBON_INTERNAL_FOR_EACH(macro, sep, __VA_ARGS__)))
- #define CARBON_FOR_EACH_COMMA() ,
- #define CARBON_FOR_EACH_SEMI() ;
- #define CARBON_FOR_EACH_CONCAT()
- // Internal helpers
- #define CARBON_INTERNAL_FOR_EACH(macro, sep, a1, ...) \
- macro(a1) __VA_OPT__(sep()) __VA_OPT__( \
- CARBON_INTERNAL_FOR_EACH_AGAIN CARBON_INTERNAL_FOR_EACH_PARENS( \
- macro, sep, __VA_ARGS__))
- #define CARBON_INTERNAL_FOR_EACH_PARENS ()
- #define CARBON_INTERNAL_FOR_EACH_AGAIN() CARBON_INTERNAL_FOR_EACH
- #define CARBON_INTERNAL_FOR_EACH_EXPAND(...) \
- CARBON_INTERNAL_FOR_EACH_EXPAND1( \
- CARBON_INTERNAL_FOR_EACH_EXPAND1(CARBON_INTERNAL_FOR_EACH_EXPAND1( \
- CARBON_INTERNAL_FOR_EACH_EXPAND1(__VA_ARGS__))))
- #define CARBON_INTERNAL_FOR_EACH_EXPAND1(...) \
- CARBON_INTERNAL_FOR_EACH_EXPAND2( \
- CARBON_INTERNAL_FOR_EACH_EXPAND2(CARBON_INTERNAL_FOR_EACH_EXPAND2( \
- CARBON_INTERNAL_FOR_EACH_EXPAND2(__VA_ARGS__))))
- #define CARBON_INTERNAL_FOR_EACH_EXPAND2(...) \
- CARBON_INTERNAL_FOR_EACH_EXPAND3( \
- CARBON_INTERNAL_FOR_EACH_EXPAND3(CARBON_INTERNAL_FOR_EACH_EXPAND3( \
- CARBON_INTERNAL_FOR_EACH_EXPAND3(__VA_ARGS__))))
- #define CARBON_INTERNAL_FOR_EACH_EXPAND3(...) __VA_ARGS__
- #endif // CARBON_TOOLCHAIN_BASE_FOR_EACH_MACRO_H_
|