1*9356374aSAndroid Build Coastguard Worker //
2*9356374aSAndroid Build Coastguard Worker // Copyright 2019 The Abseil Authors.
3*9356374aSAndroid Build Coastguard Worker //
4*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*9356374aSAndroid Build Coastguard Worker //
8*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
9*9356374aSAndroid Build Coastguard Worker //
10*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*9356374aSAndroid Build Coastguard Worker // limitations under the License.
15*9356374aSAndroid Build Coastguard Worker //
16*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
17*9356374aSAndroid Build Coastguard Worker // File: flag.h
18*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
19*9356374aSAndroid Build Coastguard Worker //
20*9356374aSAndroid Build Coastguard Worker // This header file defines the `absl::Flag<T>` type for holding command-line
21*9356374aSAndroid Build Coastguard Worker // flag data, and abstractions to create, get and set such flag data.
22*9356374aSAndroid Build Coastguard Worker //
23*9356374aSAndroid Build Coastguard Worker // It is important to note that this type is **unspecified** (an implementation
24*9356374aSAndroid Build Coastguard Worker // detail) and you do not construct or manipulate actual `absl::Flag<T>`
25*9356374aSAndroid Build Coastguard Worker // instances. Instead, you define and declare flags using the
26*9356374aSAndroid Build Coastguard Worker // `ABSL_FLAG()` and `ABSL_DECLARE_FLAG()` macros, and get and set flag values
27*9356374aSAndroid Build Coastguard Worker // using the `absl::GetFlag()` and `absl::SetFlag()` functions.
28*9356374aSAndroid Build Coastguard Worker
29*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_FLAGS_FLAG_H_
30*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAGS_FLAG_H_
31*9356374aSAndroid Build Coastguard Worker
32*9356374aSAndroid Build Coastguard Worker #include <cstdint>
33*9356374aSAndroid Build Coastguard Worker #include <string>
34*9356374aSAndroid Build Coastguard Worker #include <type_traits>
35*9356374aSAndroid Build Coastguard Worker
36*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
37*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
38*9356374aSAndroid Build Coastguard Worker #include "absl/base/optimization.h"
39*9356374aSAndroid Build Coastguard Worker #include "absl/flags/commandlineflag.h"
40*9356374aSAndroid Build Coastguard Worker #include "absl/flags/config.h"
41*9356374aSAndroid Build Coastguard Worker #include "absl/flags/internal/flag.h"
42*9356374aSAndroid Build Coastguard Worker #include "absl/flags/internal/registry.h"
43*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
44*9356374aSAndroid Build Coastguard Worker
45*9356374aSAndroid Build Coastguard Worker namespace absl {
46*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
47*9356374aSAndroid Build Coastguard Worker
48*9356374aSAndroid Build Coastguard Worker // Flag
49*9356374aSAndroid Build Coastguard Worker //
50*9356374aSAndroid Build Coastguard Worker // An `absl::Flag` holds a command-line flag value, providing a runtime
51*9356374aSAndroid Build Coastguard Worker // parameter to a binary. Such flags should be defined in the global namespace
52*9356374aSAndroid Build Coastguard Worker // and (preferably) in the module containing the binary's `main()` function.
53*9356374aSAndroid Build Coastguard Worker //
54*9356374aSAndroid Build Coastguard Worker // You should not construct and cannot use the `absl::Flag` type directly;
55*9356374aSAndroid Build Coastguard Worker // instead, you should declare flags using the `ABSL_DECLARE_FLAG()` macro
56*9356374aSAndroid Build Coastguard Worker // within a header file, and define your flag using `ABSL_FLAG()` within your
57*9356374aSAndroid Build Coastguard Worker // header's associated `.cc` file. Such flags will be named `FLAGS_name`.
58*9356374aSAndroid Build Coastguard Worker //
59*9356374aSAndroid Build Coastguard Worker // Example:
60*9356374aSAndroid Build Coastguard Worker //
61*9356374aSAndroid Build Coastguard Worker // .h file
62*9356374aSAndroid Build Coastguard Worker //
63*9356374aSAndroid Build Coastguard Worker // // Declares usage of a flag named "FLAGS_count"
64*9356374aSAndroid Build Coastguard Worker // ABSL_DECLARE_FLAG(int, count);
65*9356374aSAndroid Build Coastguard Worker //
66*9356374aSAndroid Build Coastguard Worker // .cc file
67*9356374aSAndroid Build Coastguard Worker //
68*9356374aSAndroid Build Coastguard Worker // // Defines a flag named "FLAGS_count" with a default `int` value of 0.
69*9356374aSAndroid Build Coastguard Worker // ABSL_FLAG(int, count, 0, "Count of items to process");
70*9356374aSAndroid Build Coastguard Worker //
71*9356374aSAndroid Build Coastguard Worker // No public methods of `absl::Flag<T>` are part of the Abseil Flags API.
72*9356374aSAndroid Build Coastguard Worker //
73*9356374aSAndroid Build Coastguard Worker // For type support of Abseil Flags, see the marshalling.h header file, which
74*9356374aSAndroid Build Coastguard Worker // discusses supported standard types, optional flags, and additional Abseil
75*9356374aSAndroid Build Coastguard Worker // type support.
76*9356374aSAndroid Build Coastguard Worker
77*9356374aSAndroid Build Coastguard Worker template <typename T>
78*9356374aSAndroid Build Coastguard Worker using Flag = flags_internal::Flag<T>;
79*9356374aSAndroid Build Coastguard Worker
80*9356374aSAndroid Build Coastguard Worker // GetFlag()
81*9356374aSAndroid Build Coastguard Worker //
82*9356374aSAndroid Build Coastguard Worker // Returns the value (of type `T`) of an `absl::Flag<T>` instance, by value. Do
83*9356374aSAndroid Build Coastguard Worker // not construct an `absl::Flag<T>` directly and call `absl::GetFlag()`;
84*9356374aSAndroid Build Coastguard Worker // instead, refer to flag's constructed variable name (e.g. `FLAGS_name`).
85*9356374aSAndroid Build Coastguard Worker // Because this function returns by value and not by reference, it is
86*9356374aSAndroid Build Coastguard Worker // thread-safe, but note that the operation may be expensive; as a result, avoid
87*9356374aSAndroid Build Coastguard Worker // `absl::GetFlag()` within any tight loops.
88*9356374aSAndroid Build Coastguard Worker //
89*9356374aSAndroid Build Coastguard Worker // Example:
90*9356374aSAndroid Build Coastguard Worker //
91*9356374aSAndroid Build Coastguard Worker // // FLAGS_count is a Flag of type `int`
92*9356374aSAndroid Build Coastguard Worker // int my_count = absl::GetFlag(FLAGS_count);
93*9356374aSAndroid Build Coastguard Worker //
94*9356374aSAndroid Build Coastguard Worker // // FLAGS_firstname is a Flag of type `std::string`
95*9356374aSAndroid Build Coastguard Worker // std::string first_name = absl::GetFlag(FLAGS_firstname);
96*9356374aSAndroid Build Coastguard Worker template <typename T>
GetFlag(const absl::Flag<T> & flag)97*9356374aSAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT T GetFlag(const absl::Flag<T>& flag) {
98*9356374aSAndroid Build Coastguard Worker return flags_internal::FlagImplPeer::InvokeGet<T>(flag);
99*9356374aSAndroid Build Coastguard Worker }
100*9356374aSAndroid Build Coastguard Worker
101*9356374aSAndroid Build Coastguard Worker // SetFlag()
102*9356374aSAndroid Build Coastguard Worker //
103*9356374aSAndroid Build Coastguard Worker // Sets the value of an `absl::Flag` to the value `v`. Do not construct an
104*9356374aSAndroid Build Coastguard Worker // `absl::Flag<T>` directly and call `absl::SetFlag()`; instead, use the
105*9356374aSAndroid Build Coastguard Worker // flag's variable name (e.g. `FLAGS_name`). This function is
106*9356374aSAndroid Build Coastguard Worker // thread-safe, but is potentially expensive. Avoid setting flags in general,
107*9356374aSAndroid Build Coastguard Worker // but especially within performance-critical code.
108*9356374aSAndroid Build Coastguard Worker template <typename T>
SetFlag(absl::Flag<T> * flag,const T & v)109*9356374aSAndroid Build Coastguard Worker void SetFlag(absl::Flag<T>* flag, const T& v) {
110*9356374aSAndroid Build Coastguard Worker flags_internal::FlagImplPeer::InvokeSet(*flag, v);
111*9356374aSAndroid Build Coastguard Worker }
112*9356374aSAndroid Build Coastguard Worker
113*9356374aSAndroid Build Coastguard Worker // Overload of `SetFlag()` to allow callers to pass in a value that is
114*9356374aSAndroid Build Coastguard Worker // convertible to `T`. E.g., use this overload to pass a "const char*" when `T`
115*9356374aSAndroid Build Coastguard Worker // is `std::string`.
116*9356374aSAndroid Build Coastguard Worker template <typename T, typename V>
SetFlag(absl::Flag<T> * flag,const V & v)117*9356374aSAndroid Build Coastguard Worker void SetFlag(absl::Flag<T>* flag, const V& v) {
118*9356374aSAndroid Build Coastguard Worker T value(v);
119*9356374aSAndroid Build Coastguard Worker flags_internal::FlagImplPeer::InvokeSet(*flag, value);
120*9356374aSAndroid Build Coastguard Worker }
121*9356374aSAndroid Build Coastguard Worker
122*9356374aSAndroid Build Coastguard Worker // GetFlagReflectionHandle()
123*9356374aSAndroid Build Coastguard Worker //
124*9356374aSAndroid Build Coastguard Worker // Returns the reflection handle corresponding to specified Abseil Flag
125*9356374aSAndroid Build Coastguard Worker // instance. Use this handle to access flag's reflection information, like name,
126*9356374aSAndroid Build Coastguard Worker // location, default value etc.
127*9356374aSAndroid Build Coastguard Worker //
128*9356374aSAndroid Build Coastguard Worker // Example:
129*9356374aSAndroid Build Coastguard Worker //
130*9356374aSAndroid Build Coastguard Worker // std::string = absl::GetFlagReflectionHandle(FLAGS_count).DefaultValue();
131*9356374aSAndroid Build Coastguard Worker
132*9356374aSAndroid Build Coastguard Worker template <typename T>
GetFlagReflectionHandle(const absl::Flag<T> & f)133*9356374aSAndroid Build Coastguard Worker const CommandLineFlag& GetFlagReflectionHandle(const absl::Flag<T>& f) {
134*9356374aSAndroid Build Coastguard Worker return flags_internal::FlagImplPeer::InvokeReflect(f);
135*9356374aSAndroid Build Coastguard Worker }
136*9356374aSAndroid Build Coastguard Worker
137*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
138*9356374aSAndroid Build Coastguard Worker } // namespace absl
139*9356374aSAndroid Build Coastguard Worker
140*9356374aSAndroid Build Coastguard Worker
141*9356374aSAndroid Build Coastguard Worker // ABSL_FLAG()
142*9356374aSAndroid Build Coastguard Worker //
143*9356374aSAndroid Build Coastguard Worker // This macro defines an `absl::Flag<T>` instance of a specified type `T`:
144*9356374aSAndroid Build Coastguard Worker //
145*9356374aSAndroid Build Coastguard Worker // ABSL_FLAG(T, name, default_value, help);
146*9356374aSAndroid Build Coastguard Worker //
147*9356374aSAndroid Build Coastguard Worker // where:
148*9356374aSAndroid Build Coastguard Worker //
149*9356374aSAndroid Build Coastguard Worker // * `T` is a supported flag type (see the list of types in `marshalling.h`),
150*9356374aSAndroid Build Coastguard Worker // * `name` designates the name of the flag (as a global variable
151*9356374aSAndroid Build Coastguard Worker // `FLAGS_name`),
152*9356374aSAndroid Build Coastguard Worker // * `default_value` is an expression holding the default value for this flag
153*9356374aSAndroid Build Coastguard Worker // (which must be implicitly convertible to `T`),
154*9356374aSAndroid Build Coastguard Worker // * `help` is the help text, which can also be an expression.
155*9356374aSAndroid Build Coastguard Worker //
156*9356374aSAndroid Build Coastguard Worker // This macro expands to a flag named 'FLAGS_name' of type 'T':
157*9356374aSAndroid Build Coastguard Worker //
158*9356374aSAndroid Build Coastguard Worker // absl::Flag<T> FLAGS_name = ...;
159*9356374aSAndroid Build Coastguard Worker //
160*9356374aSAndroid Build Coastguard Worker // Note that all such instances are created as global variables.
161*9356374aSAndroid Build Coastguard Worker //
162*9356374aSAndroid Build Coastguard Worker // For `ABSL_FLAG()` values that you wish to expose to other translation units,
163*9356374aSAndroid Build Coastguard Worker // it is recommended to define those flags within the `.cc` file associated with
164*9356374aSAndroid Build Coastguard Worker // the header where the flag is declared.
165*9356374aSAndroid Build Coastguard Worker //
166*9356374aSAndroid Build Coastguard Worker // Note: do not construct objects of type `absl::Flag<T>` directly. Only use the
167*9356374aSAndroid Build Coastguard Worker // `ABSL_FLAG()` macro for such construction.
168*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG(Type, name, default_value, help) \
169*9356374aSAndroid Build Coastguard Worker ABSL_FLAG_IMPL(Type, name, default_value, help)
170*9356374aSAndroid Build Coastguard Worker
171*9356374aSAndroid Build Coastguard Worker // ABSL_FLAG().OnUpdate()
172*9356374aSAndroid Build Coastguard Worker //
173*9356374aSAndroid Build Coastguard Worker // Defines a flag of type `T` with a callback attached:
174*9356374aSAndroid Build Coastguard Worker //
175*9356374aSAndroid Build Coastguard Worker // ABSL_FLAG(T, name, default_value, help).OnUpdate(callback);
176*9356374aSAndroid Build Coastguard Worker //
177*9356374aSAndroid Build Coastguard Worker // `callback` should be convertible to `void (*)()`.
178*9356374aSAndroid Build Coastguard Worker //
179*9356374aSAndroid Build Coastguard Worker // After any setting of the flag value, the callback will be called at least
180*9356374aSAndroid Build Coastguard Worker // once. A rapid sequence of changes may be merged together into the same
181*9356374aSAndroid Build Coastguard Worker // callback. No concurrent calls to the callback will be made for the same
182*9356374aSAndroid Build Coastguard Worker // flag. Callbacks are allowed to read the current value of the flag but must
183*9356374aSAndroid Build Coastguard Worker // not mutate that flag.
184*9356374aSAndroid Build Coastguard Worker //
185*9356374aSAndroid Build Coastguard Worker // The update mechanism guarantees "eventual consistency"; if the callback
186*9356374aSAndroid Build Coastguard Worker // derives an auxiliary data structure from the flag value, it is guaranteed
187*9356374aSAndroid Build Coastguard Worker // that eventually the flag value and the derived data structure will be
188*9356374aSAndroid Build Coastguard Worker // consistent.
189*9356374aSAndroid Build Coastguard Worker //
190*9356374aSAndroid Build Coastguard Worker // Note: ABSL_FLAG.OnUpdate() does not have a public definition. Hence, this
191*9356374aSAndroid Build Coastguard Worker // comment serves as its API documentation.
192*9356374aSAndroid Build Coastguard Worker
193*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
194*9356374aSAndroid Build Coastguard Worker // Implementation details below this section
195*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
196*9356374aSAndroid Build Coastguard Worker
197*9356374aSAndroid Build Coastguard Worker // ABSL_FLAG_IMPL macro definition conditional on ABSL_FLAGS_STRIP_NAMES
198*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_FLAG_PTR(flag) flag
199*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_HELP_ARG(name) \
200*9356374aSAndroid Build Coastguard Worker absl::flags_internal::HelpArg<AbslFlagHelpGenFor##name>( \
201*9356374aSAndroid Build Coastguard Worker FLAGS_help_storage_##name)
202*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name) \
203*9356374aSAndroid Build Coastguard Worker absl::flags_internal::DefaultArg<Type, AbslFlagDefaultGenFor##name>(0)
204*9356374aSAndroid Build Coastguard Worker
205*9356374aSAndroid Build Coastguard Worker #if ABSL_FLAGS_STRIP_NAMES
206*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_FLAGNAME(txt) ""
207*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_FILENAME() ""
208*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_REGISTRAR(T, flag) \
209*9356374aSAndroid Build Coastguard Worker absl::flags_internal::FlagRegistrar<T, false>(ABSL_FLAG_IMPL_FLAG_PTR(flag), \
210*9356374aSAndroid Build Coastguard Worker nullptr)
211*9356374aSAndroid Build Coastguard Worker #else
212*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_FLAGNAME(txt) txt
213*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_FILENAME() __FILE__
214*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_REGISTRAR(T, flag) \
215*9356374aSAndroid Build Coastguard Worker absl::flags_internal::FlagRegistrar<T, true>(ABSL_FLAG_IMPL_FLAG_PTR(flag), \
216*9356374aSAndroid Build Coastguard Worker __FILE__)
217*9356374aSAndroid Build Coastguard Worker #endif
218*9356374aSAndroid Build Coastguard Worker
219*9356374aSAndroid Build Coastguard Worker // ABSL_FLAG_IMPL macro definition conditional on ABSL_FLAGS_STRIP_HELP
220*9356374aSAndroid Build Coastguard Worker
221*9356374aSAndroid Build Coastguard Worker #if ABSL_FLAGS_STRIP_HELP
222*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_FLAGHELP(txt) absl::flags_internal::kStrippedFlagHelp
223*9356374aSAndroid Build Coastguard Worker #else
224*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_FLAGHELP(txt) txt
225*9356374aSAndroid Build Coastguard Worker #endif
226*9356374aSAndroid Build Coastguard Worker
227*9356374aSAndroid Build Coastguard Worker // AbslFlagHelpGenFor##name is used to encapsulate both immediate (method Const)
228*9356374aSAndroid Build Coastguard Worker // and lazy (method NonConst) evaluation of help message expression. We choose
229*9356374aSAndroid Build Coastguard Worker // between the two via the call to HelpArg in absl::Flag instantiation below.
230*9356374aSAndroid Build Coastguard Worker // If help message expression is constexpr evaluable compiler will optimize
231*9356374aSAndroid Build Coastguard Worker // away this whole struct.
232*9356374aSAndroid Build Coastguard Worker // TODO(rogeeff): place these generated structs into local namespace and apply
233*9356374aSAndroid Build Coastguard Worker // ABSL_INTERNAL_UNIQUE_SHORT_NAME.
234*9356374aSAndroid Build Coastguard Worker // TODO(rogeeff): Apply __attribute__((nodebug)) to FLAGS_help_storage_##name
235*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_DECLARE_HELP_WRAPPER(name, txt) \
236*9356374aSAndroid Build Coastguard Worker struct AbslFlagHelpGenFor##name { \
237*9356374aSAndroid Build Coastguard Worker /* The expression is run in the caller as part of the */ \
238*9356374aSAndroid Build Coastguard Worker /* default value argument. That keeps temporaries alive */ \
239*9356374aSAndroid Build Coastguard Worker /* long enough for NonConst to work correctly. */ \
240*9356374aSAndroid Build Coastguard Worker static constexpr absl::string_view Value( \
241*9356374aSAndroid Build Coastguard Worker absl::string_view absl_flag_help = ABSL_FLAG_IMPL_FLAGHELP(txt)) { \
242*9356374aSAndroid Build Coastguard Worker return absl_flag_help; \
243*9356374aSAndroid Build Coastguard Worker } \
244*9356374aSAndroid Build Coastguard Worker static std::string NonConst() { return std::string(Value()); } \
245*9356374aSAndroid Build Coastguard Worker }; \
246*9356374aSAndroid Build Coastguard Worker constexpr auto FLAGS_help_storage_##name ABSL_INTERNAL_UNIQUE_SMALL_NAME() \
247*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_SECTION_VARIABLE(flags_help_cold) = \
248*9356374aSAndroid Build Coastguard Worker absl::flags_internal::HelpStringAsArray<AbslFlagHelpGenFor##name>( \
249*9356374aSAndroid Build Coastguard Worker 0);
250*9356374aSAndroid Build Coastguard Worker
251*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \
252*9356374aSAndroid Build Coastguard Worker struct AbslFlagDefaultGenFor##name { \
253*9356374aSAndroid Build Coastguard Worker Type value = absl::flags_internal::InitDefaultValue<Type>(default_value); \
254*9356374aSAndroid Build Coastguard Worker static void Gen(void* absl_flag_default_loc) { \
255*9356374aSAndroid Build Coastguard Worker new (absl_flag_default_loc) Type(AbslFlagDefaultGenFor##name{}.value); \
256*9356374aSAndroid Build Coastguard Worker } \
257*9356374aSAndroid Build Coastguard Worker };
258*9356374aSAndroid Build Coastguard Worker
259*9356374aSAndroid Build Coastguard Worker // ABSL_FLAG_IMPL
260*9356374aSAndroid Build Coastguard Worker //
261*9356374aSAndroid Build Coastguard Worker // Note: Name of registrar object is not arbitrary. It is used to "grab"
262*9356374aSAndroid Build Coastguard Worker // global name for FLAGS_no<flag_name> symbol, thus preventing the possibility
263*9356374aSAndroid Build Coastguard Worker // of defining two flags with names foo and nofoo.
264*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAG_IMPL(Type, name, default_value, help) \
265*9356374aSAndroid Build Coastguard Worker extern ::absl::Flag<Type> FLAGS_##name; \
266*9356374aSAndroid Build Coastguard Worker namespace absl /* block flags in namespaces */ {} \
267*9356374aSAndroid Build Coastguard Worker ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \
268*9356374aSAndroid Build Coastguard Worker ABSL_FLAG_IMPL_DECLARE_HELP_WRAPPER(name, help) \
269*9356374aSAndroid Build Coastguard Worker ABSL_CONST_INIT absl::Flag<Type> FLAGS_##name{ \
270*9356374aSAndroid Build Coastguard Worker ABSL_FLAG_IMPL_FLAGNAME(#name), ABSL_FLAG_IMPL_FILENAME(), \
271*9356374aSAndroid Build Coastguard Worker ABSL_FLAG_IMPL_HELP_ARG(name), ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name)}; \
272*9356374aSAndroid Build Coastguard Worker extern absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name; \
273*9356374aSAndroid Build Coastguard Worker absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name = \
274*9356374aSAndroid Build Coastguard Worker ABSL_FLAG_IMPL_REGISTRAR(Type, FLAGS_##name)
275*9356374aSAndroid Build Coastguard Worker
276*9356374aSAndroid Build Coastguard Worker // ABSL_RETIRED_FLAG
277*9356374aSAndroid Build Coastguard Worker //
278*9356374aSAndroid Build Coastguard Worker // Designates the flag (which is usually pre-existing) as "retired." A retired
279*9356374aSAndroid Build Coastguard Worker // flag is a flag that is now unused by the program, but may still be passed on
280*9356374aSAndroid Build Coastguard Worker // the command line, usually by production scripts. A retired flag is ignored
281*9356374aSAndroid Build Coastguard Worker // and code can't access it at runtime.
282*9356374aSAndroid Build Coastguard Worker //
283*9356374aSAndroid Build Coastguard Worker // This macro registers a retired flag with given name and type, with a name
284*9356374aSAndroid Build Coastguard Worker // identical to the name of the original flag you are retiring. The retired
285*9356374aSAndroid Build Coastguard Worker // flag's type can change over time, so that you can retire code to support a
286*9356374aSAndroid Build Coastguard Worker // custom flag type.
287*9356374aSAndroid Build Coastguard Worker //
288*9356374aSAndroid Build Coastguard Worker // This macro has the same signature as `ABSL_FLAG`. To retire a flag, simply
289*9356374aSAndroid Build Coastguard Worker // replace an `ABSL_FLAG` definition with `ABSL_RETIRED_FLAG`, leaving the
290*9356374aSAndroid Build Coastguard Worker // arguments unchanged (unless of course you actually want to retire the flag
291*9356374aSAndroid Build Coastguard Worker // type at this time as well).
292*9356374aSAndroid Build Coastguard Worker //
293*9356374aSAndroid Build Coastguard Worker // `default_value` is only used as a double check on the type. `explanation` is
294*9356374aSAndroid Build Coastguard Worker // unused.
295*9356374aSAndroid Build Coastguard Worker // TODO(rogeeff): replace RETIRED_FLAGS with FLAGS once forward declarations of
296*9356374aSAndroid Build Coastguard Worker // retired flags are cleaned up.
297*9356374aSAndroid Build Coastguard Worker #define ABSL_RETIRED_FLAG(type, name, default_value, explanation) \
298*9356374aSAndroid Build Coastguard Worker static absl::flags_internal::RetiredFlag<type> RETIRED_FLAGS_##name; \
299*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_UNUSED static const auto RETIRED_FLAGS_REG_##name = \
300*9356374aSAndroid Build Coastguard Worker (RETIRED_FLAGS_##name.Retire(#name), \
301*9356374aSAndroid Build Coastguard Worker ::absl::flags_internal::FlagRegistrarEmpty{})
302*9356374aSAndroid Build Coastguard Worker
303*9356374aSAndroid Build Coastguard Worker #endif // ABSL_FLAGS_FLAG_H_
304