for_each_macro.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #ifndef CARBON_TOOLCHAIN_BASE_FOR_EACH_MACRO_H_
  5. #define CARBON_TOOLCHAIN_BASE_FOR_EACH_MACRO_H_
  6. /// CARBON_FOR_EACH() will apply `macro` to each argument in the variadic
  7. /// argument list, putting the output of `sep()` between each one.
  8. ///
  9. /// The `sep` should be a function macro that returns a separator. Premade
  10. /// separataors are provided as CARBON_FOR_EACH_XYZ() macros.
  11. #define CARBON_FOR_EACH(macro, sep, ...) \
  12. __VA_OPT__(CARBON_INTERNAL_FOR_EACH_EXPAND( \
  13. CARBON_INTERNAL_FOR_EACH(macro, sep, __VA_ARGS__)))
  14. #define CARBON_FOR_EACH_COMMA() ,
  15. #define CARBON_FOR_EACH_SEMI() ;
  16. #define CARBON_FOR_EACH_CONCAT()
  17. // Internal helpers
  18. #define CARBON_INTERNAL_FOR_EACH(macro, sep, a1, ...) \
  19. macro(a1) __VA_OPT__(sep()) __VA_OPT__( \
  20. CARBON_INTERNAL_FOR_EACH_AGAIN CARBON_INTERNAL_FOR_EACH_PARENS( \
  21. macro, sep, __VA_ARGS__))
  22. #define CARBON_INTERNAL_FOR_EACH_PARENS ()
  23. #define CARBON_INTERNAL_FOR_EACH_AGAIN() CARBON_INTERNAL_FOR_EACH
  24. #define CARBON_INTERNAL_FOR_EACH_EXPAND(...) \
  25. CARBON_INTERNAL_FOR_EACH_EXPAND1( \
  26. CARBON_INTERNAL_FOR_EACH_EXPAND1(CARBON_INTERNAL_FOR_EACH_EXPAND1( \
  27. CARBON_INTERNAL_FOR_EACH_EXPAND1(__VA_ARGS__))))
  28. #define CARBON_INTERNAL_FOR_EACH_EXPAND1(...) \
  29. CARBON_INTERNAL_FOR_EACH_EXPAND2( \
  30. CARBON_INTERNAL_FOR_EACH_EXPAND2(CARBON_INTERNAL_FOR_EACH_EXPAND2( \
  31. CARBON_INTERNAL_FOR_EACH_EXPAND2(__VA_ARGS__))))
  32. #define CARBON_INTERNAL_FOR_EACH_EXPAND2(...) \
  33. CARBON_INTERNAL_FOR_EACH_EXPAND3( \
  34. CARBON_INTERNAL_FOR_EACH_EXPAND3(CARBON_INTERNAL_FOR_EACH_EXPAND3( \
  35. CARBON_INTERNAL_FOR_EACH_EXPAND3(__VA_ARGS__))))
  36. #define CARBON_INTERNAL_FOR_EACH_EXPAND3(...) __VA_ARGS__
  37. #endif // CARBON_TOOLCHAIN_BASE_FOR_EACH_MACRO_H_