1 //
2 // Copyright 2019 The Abseil Authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      https://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 #ifndef ABSL_FLAGS_INTERNAL_COMMANDLINEFLAG_H_
17 #define ABSL_FLAGS_INTERNAL_COMMANDLINEFLAG_H_
18 
19 #include "absl/base/config.h"
20 #include "absl/base/internal/fast_type_id.h"
21 
22 namespace absl {
23 ABSL_NAMESPACE_BEGIN
24 namespace flags_internal {
25 
26 // An alias for flag fast type id. This value identifies the flag value type
27 // similarly to typeid(T), without relying on RTTI being available. In most
28 // cases this id is enough to uniquely identify the flag's value type. In a few
29 // cases we'll have to resort to using actual RTTI implementation if it is
30 // available.
31 using FlagFastTypeId = absl::base_internal::FastTypeIdType;
32 
33 // Options that control SetCommandLineOptionWithMode.
34 enum FlagSettingMode {
35   // update the flag's value unconditionally (can call this multiple times).
36   SET_FLAGS_VALUE,
37   // update the flag's value, but *only if* it has not yet been updated
38   // with SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or "FLAGS_xxx = nondef".
39   SET_FLAG_IF_DEFAULT,
40   // set the flag's default value to this.  If the flag has not been updated
41   // yet (via SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or "FLAGS_xxx = nondef")
42   // change the flag's current value to the new default value as well.
43   SET_FLAGS_DEFAULT
44 };
45 
46 // Options that control ParseFrom: Source of a value.
47 enum ValueSource {
48   // Flag is being set by value specified on a command line.
49   kCommandLine,
50   // Flag is being set by value specified in the code.
51   kProgrammaticChange,
52 };
53 
54 // Handle to FlagState objects. Specific flag state objects will restore state
55 // of a flag produced this flag state from method CommandLineFlag::SaveState().
56 class FlagStateInterface {
57  public:
58   virtual ~FlagStateInterface();
59 
60   // Restores the flag originated this object to the saved state.
61   virtual void Restore() const = 0;
62 };
63 
64 }  // namespace flags_internal
65 ABSL_NAMESPACE_END
66 }  // namespace absl
67 
68 #endif  // ABSL_FLAGS_INTERNAL_COMMANDLINEFLAG_H_
69