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