diff options
Diffstat (limited to 'absl/flags/internal')
-rw-r--r-- | absl/flags/internal/flag.cc | 12 | ||||
-rw-r--r-- | absl/flags/internal/flag.h | 48 |
2 files changed, 35 insertions, 25 deletions
diff --git a/absl/flags/internal/flag.cc b/absl/flags/internal/flag.cc index 3df8d82cfede..6ce7def2d3d2 100644 --- a/absl/flags/internal/flag.cc +++ b/absl/flags/internal/flag.cc @@ -120,7 +120,7 @@ void FlagImpl::Destroy() { if (value_.dynamic) Delete(op_, value_.dynamic); // Release the dynamically allocated default value if any. - if (def_kind_ == FlagDefaultSrcKind::kDynamicValue) { + if (DefaultKind() == FlagDefaultKind::kDynamicValue) { Delete(op_, default_src_.dynamic_value); } @@ -135,7 +135,7 @@ void FlagImpl::Destroy() { std::unique_ptr<void, DynValueDeleter> FlagImpl::MakeInitValue() const { void* res = nullptr; - if (def_kind_ == FlagDefaultSrcKind::kDynamicValue) { + if (DefaultKind() == FlagDefaultKind::kDynamicValue) { res = Clone(op_, default_src_.dynamic_value); } else { res = (*default_src_.gen_func)(); @@ -150,8 +150,8 @@ std::string FlagImpl::Filename() const { } std::string FlagImpl::Help() const { - return help_source_kind_ == FlagHelpKind::kLiteral ? help_.literal - : help_.gen_func(); + return HelpSourceKind() == FlagHelpKind::kLiteral ? help_.literal + : help_.gen_func(); } bool FlagImpl::IsModified() const { @@ -364,7 +364,7 @@ bool FlagImpl::SetFromString(absl::string_view value, FlagSettingMode set_mode, break; } case SET_FLAGS_DEFAULT: { - if (def_kind_ == FlagDefaultSrcKind::kDynamicValue) { + if (DefaultKind() == FlagDefaultKind::kDynamicValue) { if (!TryParse(&default_src_.dynamic_value, value, err)) { return false; } @@ -375,7 +375,7 @@ bool FlagImpl::SetFromString(absl::string_view value, FlagSettingMode set_mode, } default_src_.dynamic_value = new_default_val; - def_kind_ = FlagDefaultSrcKind::kDynamicValue; + def_kind_ = static_cast<uint8_t>(FlagDefaultKind::kDynamicValue); } if (!modified_) { diff --git a/absl/flags/internal/flag.h b/absl/flags/internal/flag.h index cc07dce1829b..b5471fa8a734 100644 --- a/absl/flags/internal/flag.h +++ b/absl/flags/internal/flag.h @@ -87,7 +87,7 @@ union FlagHelpMsg { HelpGenFunc gen_func; }; -enum class FlagHelpKind : int8_t { kLiteral, kGenFunc }; +enum class FlagHelpKind : uint8_t { kLiteral = 0, kGenFunc = 1 }; struct FlagHelpArg { FlagHelpMsg source; @@ -147,7 +147,7 @@ union FlagDefaultSrc { FlagDfltGenFunc gen_func; }; -enum class FlagDefaultSrcKind : int8_t { kDynamicValue, kGenFunc }; +enum class FlagDefaultKind : uint8_t { kDynamicValue = 0, kGenFunc = 1 }; /////////////////////////////////////////////////////////////////////////////// // Flag current value auxiliary structs. @@ -279,8 +279,14 @@ class FlagImpl { op_(op), marshalling_op_(marshalling_op), help_(help.source), - help_source_kind_(help.kind), - def_kind_(FlagDefaultSrcKind::kGenFunc), + help_source_kind_(static_cast<uint8_t>(help.kind)), + def_kind_(static_cast<uint8_t>(FlagDefaultKind::kGenFunc)), + is_data_guard_inited_(false), + modified_(false), + on_command_line_(false), + inited_(false), + counter_(0), + callback_(nullptr), default_src_(default_value_gen), data_guard_{} {} @@ -370,6 +376,14 @@ class FlagImpl { // Lazy initialization of the Flag's data. void Init(); + FlagHelpKind HelpSourceKind() const { + return static_cast<FlagHelpKind>(help_source_kind_); + } + FlagDefaultKind DefaultKind() const + ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()) { + return static_cast<FlagDefaultKind>(def_kind_); + } + // Immutable flag's state. // Flags name passed to ABSL_FLAG as second arg. @@ -383,35 +397,31 @@ class FlagImpl { // Help message literal or function to generate it. const FlagHelpMsg help_; // Indicates if help message was supplied as literal or generator func. - const FlagHelpKind help_source_kind_; - - // Indicates that the Flag state is initialized. - std::atomic<bool> inited_{false}; + const uint8_t help_source_kind_ : 1; // Mutable flag's state (guarded by `data_guard_`). + // If def_kind_ == kDynamicValue, default_src_ holds a dynamically allocated + // value. + uint8_t def_kind_ : 1 ABSL_GUARDED_BY(*DataGuard()); // Protects against multiple concurrent constructions of `data_guard_`. - bool is_data_guard_inited_ = false; + bool is_data_guard_inited_ : 1; // Has this flag's value been modified? - bool modified_ ABSL_GUARDED_BY(*DataGuard()) = false; + bool modified_ : 1 ABSL_GUARDED_BY(*DataGuard()); // Has this flag been specified on command line. - bool on_command_line_ ABSL_GUARDED_BY(*DataGuard()) = false; + bool on_command_line_ : 1 ABSL_GUARDED_BY(*DataGuard()); + // Indicates that the flag state is initialized. + std::atomic<bool> inited_; // Mutation counter - int64_t counter_ ABSL_GUARDED_BY(*DataGuard()) = 0; - + int64_t counter_ ABSL_GUARDED_BY(*DataGuard()); // Optional flag's callback and absl::Mutex to guard the invocations. - FlagCallback* callback_ ABSL_GUARDED_BY(*DataGuard()) = nullptr; - - // If def_kind_ == kDynamicValue, default_src_ holds a dynamically allocated - // value. - FlagDefaultSrcKind def_kind_ ABSL_GUARDED_BY(*DataGuard()); + FlagCallback* callback_ ABSL_GUARDED_BY(*DataGuard()); // Either a pointer to the function generating the default value based on the // value specified in ABSL_FLAG or pointer to the dynamically set default // value via SetCommandLineOptionWithMode. def_kind_ is used to distinguish // these two cases. FlagDefaultSrc default_src_ ABSL_GUARDED_BY(*DataGuard()); - // Current Flag Value FlagValue value_; |