1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef BASE_MACROS_REMOVE_PARENS_H_ 6 #define BASE_MACROS_REMOVE_PARENS_H_ 7 8 #include "base/macros/if.h" 9 10 // A macro that removes at most one outer set of parentheses from its arguments. 11 // If the arguments are not surrounded by parentheses, this expands to the 12 // arguments unchanged. For example: 13 // `BASE_REMOVE_PARENS()` -> `` 14 // `BASE_REMOVE_PARENS(foo)` -> `foo` 15 // `BASE_REMOVE_PARENS(foo(1))` -> `foo(1)` 16 // `BASE_REMOVE_PARENS((foo))` -> `foo` 17 // `BASE_REMOVE_PARENS((foo(1)))` -> `foo(1)` 18 // `BASE_REMOVE_PARENS((foo)[1])` -> `(foo)[1]` 19 // `BASE_REMOVE_PARENS(((foo)))` -> `(foo)` 20 // `BASE_REMOVE_PARENS(foo, bar, baz)` -> `foo, bar, baz` 21 // `BASE_REMOVE_PARENS(foo, (bar), baz)` -> `foo, (bar), baz` 22 #define BASE_REMOVE_PARENS(...) \ 23 BASE_IF(BASE_INTERNAL_IS_PARENTHESIZED(__VA_ARGS__), BASE_INTERNAL_ECHO, \ 24 BASE_INTERNAL_EMPTY()) \ 25 __VA_ARGS__ 26 27 #define BASE_INTERNAL_IS_PARENTHESIZED(...) \ 28 BASE_INTERNAL_IS_EMPTY(BASE_INTERNAL_EAT __VA_ARGS__) 29 #define BASE_INTERNAL_IS_EMPTY(...) BASE_INTERNAL_IS_EMPTY_EXPANDED(__VA_ARGS__) 30 #define BASE_INTERNAL_IS_EMPTY_EXPANDED(...) \ 31 BASE_INTERNAL_IS_EMPTY_INNER(_, ##__VA_ARGS__) 32 #define BASE_INTERNAL_IS_EMPTY_INNER(...) \ 33 BASE_INTERNAL_IS_EMPTY_INNER_EXPANDED(__VA_ARGS__, 0, 1) 34 #define BASE_INTERNAL_IS_EMPTY_INNER_EXPANDED(e0, e1, is_empty, ...) is_empty 35 #define BASE_INTERNAL_EAT(...) 36 #define BASE_INTERNAL_ECHO(...) __VA_ARGS__ 37 #define BASE_INTERNAL_EMPTY() 38 39 #endif // BASE_MACROS_REMOVE_PARENS_H_ 40