Export of internal Abseil changes
-- 47f13ea42ae272c995b1cd5073a45e046fa325eb by Matthew Brown <matthewbr@google.com>: absl::StrFormat: Centralize FormatConversionCharSet vs FormatConversionSpec checking - Move it into a central location, rather than requiring individual overloads to validate. PiperOrigin-RevId: 310583805 -- a567c8fc8032031d551d6b457755851f442e65ad by Gennadiy Rozental <rogeeff@google.com>: Internal change PiperOrigin-RevId: 310427635 -- 49848f7fab9b0f528d33f60cbccf688e2ea68afa by Gennadiy Rozental <rogeeff@google.com>: Make Get/Set private methods of absl::Flag<T>. PiperOrigin-RevId: 310413908 GitOrigin-RevId: 47f13ea42ae272c995b1cd5073a45e046fa325eb Change-Id: I6530c754731c1a9463877561fa61786460ed60af
This commit is contained in:
parent
a35ef8a62c
commit
c45d1c09d5
8 changed files with 148 additions and 36 deletions
|
|
@ -67,6 +67,22 @@ ABSL_CONST_INIT bool fromenv_needs_processing
|
|||
ABSL_CONST_INIT bool tryfromenv_needs_processing
|
||||
ABSL_GUARDED_BY(processing_checks_guard) = false;
|
||||
|
||||
ABSL_CONST_INIT absl::Mutex specified_flags_guard(absl::kConstInit);
|
||||
ABSL_CONST_INIT std::vector<const CommandLineFlag*>* specified_flags
|
||||
ABSL_GUARDED_BY(specified_flags_guard) = nullptr;
|
||||
|
||||
struct SpecifiedFlagsCompare {
|
||||
bool operator()(const CommandLineFlag* a, const CommandLineFlag* b) const {
|
||||
return a->Name() < b->Name();
|
||||
}
|
||||
bool operator()(const CommandLineFlag* a, absl::string_view b) const {
|
||||
return a->Name() < b;
|
||||
}
|
||||
bool operator()(absl::string_view a, const CommandLineFlag* b) const {
|
||||
return a < b->Name();
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
} // namespace flags_internal
|
||||
ABSL_NAMESPACE_END
|
||||
|
|
@ -577,6 +593,17 @@ bool CanIgnoreUndefinedFlag(absl::string_view flag_name) {
|
|||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
bool WasPresentOnCommandLine(absl::string_view flag_name) {
|
||||
absl::MutexLock l(&specified_flags_guard);
|
||||
ABSL_INTERNAL_CHECK(specified_flags != nullptr,
|
||||
"ParseCommandLine is not invoked yet");
|
||||
|
||||
return std::binary_search(specified_flags->begin(), specified_flags->end(),
|
||||
flag_name, SpecifiedFlagsCompare{});
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
std::vector<char*> ParseCommandLineImpl(int argc, char* argv[],
|
||||
ArgvListAction arg_list_act,
|
||||
UsageFlagsAction usage_flag_act,
|
||||
|
|
@ -607,6 +634,13 @@ std::vector<char*> ParseCommandLineImpl(int argc, char* argv[],
|
|||
}
|
||||
output_args.push_back(argv[0]);
|
||||
|
||||
absl::MutexLock l(&specified_flags_guard);
|
||||
if (specified_flags == nullptr) {
|
||||
specified_flags = new std::vector<const CommandLineFlag*>;
|
||||
} else {
|
||||
specified_flags->clear();
|
||||
}
|
||||
|
||||
// Iterate through the list of the input arguments. First level are arguments
|
||||
// originated from argc/argv. Following levels are arguments originated from
|
||||
// recursive parsing of flagfile(s).
|
||||
|
|
@ -702,6 +736,8 @@ std::vector<char*> ParseCommandLineImpl(int argc, char* argv[],
|
|||
flag, value, SET_FLAGS_VALUE, kCommandLine, &error)) {
|
||||
flags_internal::ReportUsageError(error, true);
|
||||
success = false;
|
||||
} else {
|
||||
specified_flags->push_back(flag);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -753,6 +789,10 @@ std::vector<char*> ParseCommandLineImpl(int argc, char* argv[],
|
|||
}
|
||||
}
|
||||
|
||||
// Trim and sort the vector.
|
||||
specified_flags->shrink_to_fit();
|
||||
std::sort(specified_flags->begin(), specified_flags->end(),
|
||||
SpecifiedFlagsCompare{});
|
||||
return output_args;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue