Go to the documentation of this file.
29 #ifndef ABSL_FLAGS_FLAG_H_
30 #define ABSL_FLAGS_FLAG_H_
33 #include <type_traits>
35 #include "absl/base/attributes.h"
36 #include "absl/base/config.h"
37 #include "absl/base/optimization.h"
38 #include "absl/flags/config.h"
39 #include "absl/flags/internal/flag.h"
40 #include "absl/flags/internal/registry.h"
41 #include "absl/strings/string_view.h"
74 #if !defined(_MSC_VER) || defined(__clang__)
76 using Flag = flags_internal::Flag<T>;
78 #include "absl/flags/internal/flag_msvc.inc"
99 return flags_internal::FlagImplPeer::InvokeGet<T>(
flag);
109 template <
typename T>
117 template <
typename T,
typename V>
133 template <
typename T>
169 #define ABSL_FLAG(Type, name, default_value, help) \
170 ABSL_FLAG_IMPL(Type, name, default_value, help)
199 #if !defined(_MSC_VER) || defined(__clang__)
200 #define ABSL_FLAG_IMPL_FLAG_PTR(flag) flag
201 #define ABSL_FLAG_IMPL_HELP_ARG(name) \
202 absl::flags_internal::HelpArg<AbslFlagHelpGenFor##name>( \
203 FLAGS_help_storage_##name)
204 #define ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name) \
205 absl::flags_internal::DefaultArg<Type, AbslFlagDefaultGenFor##name>(0)
207 #define ABSL_FLAG_IMPL_FLAG_PTR(flag) flag.GetImpl()
208 #define ABSL_FLAG_IMPL_HELP_ARG(name) &AbslFlagHelpGenFor##name::NonConst
209 #define ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name) &AbslFlagDefaultGenFor##name::Gen
212 #if ABSL_FLAGS_STRIP_NAMES
213 #define ABSL_FLAG_IMPL_FLAGNAME(txt) ""
214 #define ABSL_FLAG_IMPL_FILENAME() ""
215 #define ABSL_FLAG_IMPL_REGISTRAR(T, flag) \
216 absl::flags_internal::FlagRegistrar<T, false>(ABSL_FLAG_IMPL_FLAG_PTR(flag), \
219 #define ABSL_FLAG_IMPL_FLAGNAME(txt) txt
220 #define ABSL_FLAG_IMPL_FILENAME() __FILE__
221 #define ABSL_FLAG_IMPL_REGISTRAR(T, flag) \
222 absl::flags_internal::FlagRegistrar<T, true>(ABSL_FLAG_IMPL_FLAG_PTR(flag), \
228 #if ABSL_FLAGS_STRIP_HELP
229 #define ABSL_FLAG_IMPL_FLAGHELP(txt) absl::flags_internal::kStrippedFlagHelp
231 #define ABSL_FLAG_IMPL_FLAGHELP(txt) txt
242 #define ABSL_FLAG_IMPL_DECLARE_HELP_WRAPPER(name, txt) \
243 struct AbslFlagHelpGenFor##name { \
247 static constexpr absl::string_view Value( \
248 absl::string_view absl_flag_help = ABSL_FLAG_IMPL_FLAGHELP(txt)) { \
249 return absl_flag_help; \
251 static std::string NonConst() { return std::string(Value()); } \
253 constexpr auto FLAGS_help_storage_##name ABSL_INTERNAL_UNIQUE_SMALL_NAME() \
254 ABSL_ATTRIBUTE_SECTION_VARIABLE(flags_help_cold) = \
255 absl::flags_internal::HelpStringAsArray<AbslFlagHelpGenFor##name>( \
258 #define ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \
259 struct AbslFlagDefaultGenFor##name { \
260 Type value = absl::flags_internal::InitDefaultValue<Type>(default_value); \
261 static void Gen(void* absl_flag_default_loc) { \
262 new (absl_flag_default_loc) Type(AbslFlagDefaultGenFor##name{}.value); \
271 #define ABSL_FLAG_IMPL(Type, name, default_value, help) \
272 extern ::absl::Flag<Type> FLAGS_##name; \
274 ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \
275 ABSL_FLAG_IMPL_DECLARE_HELP_WRAPPER(name, help) \
276 ABSL_CONST_INIT absl::Flag<Type> FLAGS_##name{ \
277 ABSL_FLAG_IMPL_FLAGNAME(#name), ABSL_FLAG_IMPL_FILENAME(), \
278 ABSL_FLAG_IMPL_HELP_ARG(name), ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name)}; \
279 extern absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name; \
280 absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name = \
281 ABSL_FLAG_IMPL_REGISTRAR(Type, FLAGS_##name)
304 #define ABSL_RETIRED_FLAG(type, name, default_value, explanation) \
305 static absl::flags_internal::RetiredFlag<type> RETIRED_FLAGS_##name; \
306 ABSL_ATTRIBUTE_UNUSED static const auto RETIRED_FLAGS_REG_##name = \
307 (RETIRED_FLAGS_##name.Retire(#name), \
308 ::absl::flags_internal::FlagRegistrarEmpty{})
310 #endif // ABSL_FLAGS_FLAG_H_
const CommandLineFlag & GetFlagReflectionHandle(const absl::Flag< T > &f)
void SetFlag(absl::Flag< T > *flag, const T &v)
#define ABSL_NAMESPACE_END
#define T(upbtypeconst, upbtype, ctype, default_value)
#define ABSL_MUST_USE_RESULT
#define ABSL_NAMESPACE_BEGIN
static const CommandLineFlag & InvokeReflect(const FlagType &f)
ABSL_MUST_USE_RESULT T GetFlag(const absl::Flag< T > &flag)
flags_internal::Flag< T > Flag
static void InvokeSet(FlagType &flag, const T &v)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:24