diff options
Diffstat (limited to 'third_party/abseil_cpp/absl/flags')
43 files changed, 0 insertions, 10811 deletions
diff --git a/third_party/abseil_cpp/absl/flags/BUILD.bazel b/third_party/abseil_cpp/absl/flags/BUILD.bazel deleted file mode 100644 index 78d6da74d819..000000000000 --- a/third_party/abseil_cpp/absl/flags/BUILD.bazel +++ /dev/null @@ -1,514 +0,0 @@ -# -# Copyright 2019 The Abseil Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") -load( - "//absl:copts/configure_copts.bzl", - "ABSL_DEFAULT_COPTS", - "ABSL_DEFAULT_LINKOPTS", - "ABSL_TEST_COPTS", -) - -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -cc_library( - name = "path_util", - hdrs = [ - "internal/path_util.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - visibility = [ - "//absl/flags:__pkg__", - ], - deps = [ - "//absl/base:config", - "//absl/strings", - ], -) - -cc_library( - name = "program_name", - srcs = [ - "internal/program_name.cc", - ], - hdrs = [ - "internal/program_name.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - visibility = [ - "//absl/flags:__pkg__", - ], - deps = [ - ":path_util", - "//absl/base:config", - "//absl/base:core_headers", - "//absl/strings", - "//absl/synchronization", - ], -) - -cc_library( - name = "config", - srcs = [ - "usage_config.cc", - ], - hdrs = [ - "config.h", - "usage_config.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":path_util", - ":program_name", - "//absl/base:config", - "//absl/base:core_headers", - "//absl/strings", - "//absl/synchronization", - ], -) - -cc_library( - name = "marshalling", - srcs = [ - "marshalling.cc", - ], - hdrs = [ - "marshalling.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - "//absl/base:config", - "//absl/base:core_headers", - "//absl/base:log_severity", - "//absl/strings", - "//absl/strings:str_format", - ], -) - -cc_library( - name = "commandlineflag_internal", - srcs = [ - "internal/commandlineflag.cc", - ], - hdrs = [ - "internal/commandlineflag.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - "//absl/base:config", - "//absl/base:fast_type_id", - ], -) - -cc_library( - name = "commandlineflag", - srcs = [ - "commandlineflag.cc", - ], - hdrs = [ - "commandlineflag.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":commandlineflag_internal", - "//absl/base:config", - "//absl/base:fast_type_id", - "//absl/strings", - "//absl/types:optional", - ], -) - -cc_library( - name = "private_handle_accessor", - srcs = [ - "internal/private_handle_accessor.cc", - ], - hdrs = [ - "internal/private_handle_accessor.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - visibility = [ - "//absl/flags:__pkg__", - ], - deps = [ - ":commandlineflag", - ":commandlineflag_internal", - "//absl/base:config", - "//absl/strings", - ], -) - -cc_library( - name = "reflection", - srcs = [ - "reflection.cc", - ], - hdrs = [ - "internal/registry.h", - "reflection.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":commandlineflag", - ":commandlineflag_internal", - ":config", - ":private_handle_accessor", - "//absl/base:config", - "//absl/base:core_headers", - "//absl/container:flat_hash_map", - "//absl/strings", - "//absl/synchronization", - ], -) - -cc_library( - name = "flag_internal", - srcs = [ - "internal/flag.cc", - ], - hdrs = [ - "internal/flag.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - visibility = ["//absl/base:__subpackages__"], - deps = [ - ":commandlineflag", - ":commandlineflag_internal", - ":config", - ":marshalling", - ":reflection", - "//absl/base", - "//absl/base:config", - "//absl/base:core_headers", - "//absl/memory", - "//absl/meta:type_traits", - "//absl/strings", - "//absl/synchronization", - "//absl/utility", - ], -) - -cc_library( - name = "flag", - srcs = [ - "flag.cc", - ], - hdrs = [ - "declare.h", - "flag.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":config", - ":flag_internal", - ":reflection", - "//absl/base", - "//absl/base:config", - "//absl/base:core_headers", - "//absl/strings", - ], -) - -cc_library( - name = "usage_internal", - srcs = [ - "internal/usage.cc", - ], - hdrs = [ - "internal/usage.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - visibility = [ - "//absl/flags:__pkg__", - ], - deps = [ - ":commandlineflag", - ":config", - ":flag", - ":flag_internal", - ":path_util", - ":private_handle_accessor", - ":program_name", - ":reflection", - "//absl/base:config", - "//absl/base:core_headers", - "//absl/strings", - ], -) - -cc_library( - name = "usage", - srcs = [ - "usage.cc", - ], - hdrs = [ - "usage.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":usage_internal", - "//absl/base:config", - "//absl/base:core_headers", - "//absl/strings", - "//absl/synchronization", - ], -) - -cc_library( - name = "parse", - srcs = ["parse.cc"], - hdrs = [ - "internal/parse.h", - "parse.h", - ], - copts = ABSL_DEFAULT_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":commandlineflag", - ":commandlineflag_internal", - ":config", - ":flag", - ":flag_internal", - ":private_handle_accessor", - ":program_name", - ":reflection", - ":usage", - ":usage_internal", - "//absl/base:config", - "//absl/base:core_headers", - "//absl/strings", - "//absl/synchronization", - ], -) - -############################################################################ -# Unit tests in alphabetical order. - -cc_test( - name = "commandlineflag_test", - size = "small", - srcs = [ - "commandlineflag_test.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":commandlineflag", - ":commandlineflag_internal", - ":config", - ":flag", - ":private_handle_accessor", - ":reflection", - "//absl/memory", - "//absl/strings", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "config_test", - size = "small", - srcs = [ - "config_test.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":config", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "flag_test", - size = "small", - srcs = [ - "flag_test.cc", - "flag_test_defs.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":config", - ":flag", - ":flag_internal", - ":marshalling", - ":reflection", - "//absl/base:core_headers", - "//absl/base:malloc_internal", - "//absl/strings", - "//absl/time", - "@com_google_googletest//:gtest_main", - ], -) - -cc_binary( - name = "flag_benchmark", - testonly = 1, - srcs = [ - "flag_benchmark.cc", - ], - copts = ABSL_TEST_COPTS, - tags = ["benchmark"], - visibility = ["//visibility:private"], - deps = [ - ":flag", - ":marshalling", - ":parse", - ":reflection", - "//absl/strings", - "//absl/time", - "//absl/types:optional", - "@com_github_google_benchmark//:benchmark_main", - ], -) - -cc_test( - name = "marshalling_test", - size = "small", - srcs = [ - "marshalling_test.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":marshalling", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "parse_test", - size = "small", - srcs = [ - "parse_test.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":flag", - ":parse", - ":reflection", - ":usage_internal", - "//absl/base:raw_logging_internal", - "//absl/base:scoped_set_env", - "//absl/strings", - "//absl/types:span", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "path_util_test", - size = "small", - srcs = [ - "internal/path_util_test.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":path_util", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "program_name_test", - size = "small", - srcs = [ - "internal/program_name_test.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":program_name", - "//absl/strings", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "reflection_test", - size = "small", - srcs = [ - "reflection_test.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":commandlineflag_internal", - ":flag", - ":marshalling", - ":reflection", - ":usage_internal", - "//absl/memory", - "//absl/strings", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "usage_config_test", - size = "small", - srcs = [ - "usage_config_test.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":config", - ":path_util", - ":program_name", - "//absl/strings", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "usage_test", - size = "small", - srcs = [ - "internal/usage_test.cc", - ], - copts = ABSL_TEST_COPTS, - linkopts = ABSL_DEFAULT_LINKOPTS, - deps = [ - ":config", - ":flag", - ":parse", - ":path_util", - ":program_name", - ":reflection", - ":usage", - ":usage_internal", - "//absl/strings", - "@com_google_googletest//:gtest", - ], -) diff --git a/third_party/abseil_cpp/absl/flags/CMakeLists.txt b/third_party/abseil_cpp/absl/flags/CMakeLists.txt deleted file mode 100644 index e5083d7b9a87..000000000000 --- a/third_party/abseil_cpp/absl/flags/CMakeLists.txt +++ /dev/null @@ -1,451 +0,0 @@ -# -# Copyright 2019 The Abseil Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# Internal-only target, do not depend on directly. -absl_cc_library( - NAME - flags_path_util - HDRS - "internal/path_util.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::strings - PUBLIC -) - -# Internal-only target, do not depend on directly. -absl_cc_library( - NAME - flags_program_name - SRCS - "internal/program_name.cc" - HDRS - "internal/program_name.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::core_headers - absl::flags_path_util - absl::strings - absl::synchronization - PUBLIC -) - -absl_cc_library( - NAME - flags_config - SRCS - "usage_config.cc" - HDRS - "config.h" - "usage_config.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::flags_path_util - absl::flags_program_name - absl::core_headers - absl::strings - absl::synchronization -) - -absl_cc_library( - NAME - flags_marshalling - SRCS - "marshalling.cc" - HDRS - "marshalling.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::core_headers - absl::log_severity - absl::strings - absl::str_format -) - -# Internal-only target, do not depend on directly. -absl_cc_library( - NAME - flags_commandlineflag_internal - SRCS - "internal/commandlineflag.cc" - HDRS - "internal/commandlineflag.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::fast_type_id -) - -absl_cc_library( - NAME - flags_commandlineflag - SRCS - "commandlineflag.cc" - HDRS - "commandlineflag.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::fast_type_id - absl::flags_commandlineflag_internal - absl::optional - absl::strings -) - -# Internal-only target, do not depend on directly. -absl_cc_library( - NAME - flags_private_handle_accessor - SRCS - "internal/private_handle_accessor.cc" - HDRS - "internal/private_handle_accessor.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::flags_commandlineflag - absl::flags_commandlineflag_internal - absl::strings -) - -absl_cc_library( - NAME - flags_reflection - SRCS - "reflection.cc" - HDRS - "reflection.h" - "internal/registry.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::flags_commandlineflag - absl::flags_private_handle_accessor - absl::flags_config - absl::strings - absl::synchronization - absl::flat_hash_map -) - -# Internal-only target, do not depend on directly. -absl_cc_library( - NAME - flags_internal - SRCS - "internal/flag.cc" - HDRS - "internal/flag.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::base - absl::config - absl::flags_commandlineflag - absl::flags_commandlineflag_internal - absl::flags_config - absl::flags_marshalling - absl::synchronization - absl::meta - absl::utility - PUBLIC -) - -absl_cc_library( - NAME - flags - SRCS - "flag.cc" - HDRS - "declare.h" - "flag.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::flags_commandlineflag - absl::flags_config - absl::flags_internal - absl::flags_reflection - absl::base - absl::core_headers - absl::strings -) - -# Internal-only target, do not depend on directly. -absl_cc_library( - NAME - flags_usage_internal - SRCS - "internal/usage.cc" - HDRS - "internal/usage.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::flags_config - absl::flags - absl::flags_commandlineflag - absl::flags_internal - absl::flags_path_util - absl::flags_private_handle_accessor - absl::flags_program_name - absl::flags_reflection - absl::strings - absl::synchronization -) - -absl_cc_library( - NAME - flags_usage - SRCS - "usage.cc" - HDRS - "usage.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::core_headers - absl::flags_usage_internal - absl::strings - absl::synchronization -) - -absl_cc_library( - NAME - flags_parse - SRCS - "parse.cc" - HDRS - "internal/parse.h" - "parse.h" - COPTS - ${ABSL_DEFAULT_COPTS} - LINKOPTS - ${ABSL_DEFAULT_LINKOPTS} - DEPS - absl::config - absl::core_headers - absl::flags_config - absl::flags - absl::flags_commandlineflag - absl::flags_commandlineflag_internal - absl::flags_internal - absl::flags_private_handle_accessor - absl::flags_program_name - absl::flags_reflection - absl::flags_usage - absl::strings - absl::synchronization -) - -############################################################################ -# Unit tests in alpahabetical order. - -absl_cc_test( - NAME - flags_commandlineflag_test - SRCS - "commandlineflag_test.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::flags - absl::flags_commandlineflag - absl::flags_commandlineflag_internal - absl::flags_config - absl::flags_private_handle_accessor - absl::flags_reflection - absl::memory - absl::strings - gtest_main -) - -absl_cc_test( - NAME - flags_config_test - SRCS - "config_test.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::flags_config - gtest_main -) - -absl_cc_test( - NAME - flags_flag_test - SRCS - "flag_test.cc" - "flag_test_defs.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::core_headers - absl::flags - absl::flags_config - absl::flags_internal - absl::flags_marshalling - absl::flags_reflection - absl::strings - absl::time - gtest_main -) - -absl_cc_test( - NAME - flags_marshalling_test - SRCS - "marshalling_test.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::flags_marshalling - gtest_main -) - -absl_cc_test( - NAME - flags_parse_test - SRCS - "parse_test.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::flags - absl::flags_parse - absl::flags_reflection - absl::flags_usage_internal - absl::raw_logging_internal - absl::scoped_set_env - absl::span - absl::strings - gmock_main -) - -absl_cc_test( - NAME - flags_path_util_test - SRCS - "internal/path_util_test.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::flags_path_util - gtest_main -) - -absl_cc_test( - NAME - flags_program_name_test - SRCS - "internal/program_name_test.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::flags_program_name - absl::strings - gtest_main -) - -absl_cc_test( - NAME - flags_reflection_test - SRCS - "reflection_test.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::flags_commandlineflag_internal - absl::flags - absl::flags_reflection - absl::flags_usage - absl::memory - absl::strings - gmock_main -) - -absl_cc_test( - NAME - flags_usage_config_test - SRCS - "usage_config_test.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::flags_config - absl::flags_path_util - absl::flags_program_name - absl::strings - gtest_main -) - -absl_cc_test( - NAME - flags_usage_test - SRCS - "internal/usage_test.cc" - COPTS - ${ABSL_TEST_COPTS} - DEPS - absl::flags_config - absl::flags - absl::flags_path_util - absl::flags_program_name - absl::flags_parse - absl::flags_reflection - absl::flags_usage - absl::strings - gtest -) diff --git a/third_party/abseil_cpp/absl/flags/commandlineflag.cc b/third_party/abseil_cpp/absl/flags/commandlineflag.cc deleted file mode 100644 index 9f3b4a5a28ef..000000000000 --- a/third_party/abseil_cpp/absl/flags/commandlineflag.cc +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright 2020 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/commandlineflag.h" - -#include <string> - -#include "absl/base/config.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/strings/string_view.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN - -bool CommandLineFlag::IsRetired() const { return false; } -bool CommandLineFlag::ParseFrom(absl::string_view value, std::string* error) { - return ParseFrom(value, flags_internal::SET_FLAGS_VALUE, - flags_internal::kProgrammaticChange, *error); -} - -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/commandlineflag.h b/third_party/abseil_cpp/absl/flags/commandlineflag.h deleted file mode 100644 index f2fa08977fd4..000000000000 --- a/third_party/abseil_cpp/absl/flags/commandlineflag.h +++ /dev/null @@ -1,200 +0,0 @@ -// -// Copyright 2020 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ----------------------------------------------------------------------------- -// File: commandlineflag.h -// ----------------------------------------------------------------------------- -// -// This header file defines the `CommandLineFlag`, which acts as a type-erased -// handle for accessing metadata about the Abseil Flag in question. -// -// Because an actual Abseil flag is of an unspecified type, you should not -// manipulate or interact directly with objects of that type. Instead, use the -// CommandLineFlag type as an intermediary. -#ifndef ABSL_FLAGS_COMMANDLINEFLAG_H_ -#define ABSL_FLAGS_COMMANDLINEFLAG_H_ - -#include <memory> -#include <string> - -#include "absl/base/config.h" -#include "absl/base/internal/fast_type_id.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/strings/string_view.h" -#include "absl/types/optional.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { -class PrivateHandleAccessor; -} // namespace flags_internal - -// CommandLineFlag -// -// This type acts as a type-erased handle for an instance of an Abseil Flag and -// holds reflection information pertaining to that flag. Use CommandLineFlag to -// access a flag's name, location, help string etc. -// -// To obtain an absl::CommandLineFlag, invoke `absl::FindCommandLineFlag()` -// passing it the flag name string. -// -// Example: -// -// // Obtain reflection handle for a flag named "flagname". -// const absl::CommandLineFlag* my_flag_data = -// absl::FindCommandLineFlag("flagname"); -// -// // Now you can get flag info from that reflection handle. -// std::string flag_location = my_flag_data->Filename(); -// ... -class CommandLineFlag { - public: - constexpr CommandLineFlag() = default; - - // Not copyable/assignable. - CommandLineFlag(const CommandLineFlag&) = delete; - CommandLineFlag& operator=(const CommandLineFlag&) = delete; - - // absl::CommandLineFlag::IsOfType() - // - // Return true iff flag has type T. - template <typename T> - inline bool IsOfType() const { - return TypeId() == base_internal::FastTypeId<T>(); - } - - // absl::CommandLineFlag::TryGet() - // - // Attempts to retrieve the flag value. Returns value on success, - // absl::nullopt otherwise. - template <typename T> - absl::optional<T> TryGet() const { - if (IsRetired() || !IsOfType<T>()) { - return absl::nullopt; - } - - // Implementation notes: - // - // We are wrapping a union around the value of `T` to serve three purposes: - // - // 1. `U.value` has correct size and alignment for a value of type `T` - // 2. The `U.value` constructor is not invoked since U's constructor does - // not do it explicitly. - // 3. The `U.value` destructor is invoked since U's destructor does it - // explicitly. This makes `U` a kind of RAII wrapper around non default - // constructible value of T, which is destructed when we leave the - // scope. We do need to destroy U.value, which is constructed by - // CommandLineFlag::Read even though we left it in a moved-from state - // after std::move. - // - // All of this serves to avoid requiring `T` being default constructible. - union U { - T value; - U() {} - ~U() { value.~T(); } - }; - U u; - - Read(&u.value); - // allow retired flags to be "read", so we can report invalid access. - if (IsRetired()) { - return absl::nullopt; - } - return std::move(u.value); - } - - // absl::CommandLineFlag::Name() - // - // Returns name of this flag. - virtual absl::string_view Name() const = 0; - - // absl::CommandLineFlag::Filename() - // - // Returns name of the file where this flag is defined. - virtual std::string Filename() const = 0; - - // absl::CommandLineFlag::Help() - // - // Returns help message associated with this flag. - virtual std::string Help() const = 0; - - // absl::CommandLineFlag::IsRetired() - // - // Returns true iff this object corresponds to retired flag. - virtual bool IsRetired() const; - - // absl::CommandLineFlag::DefaultValue() - // - // Returns the default value for this flag. - virtual std::string DefaultValue() const = 0; - - // absl::CommandLineFlag::CurrentValue() - // - // Returns the current value for this flag. - virtual std::string CurrentValue() const = 0; - - // absl::CommandLineFlag::ParseFrom() - // - // Sets the value of the flag based on specified string `value`. If the flag - // was successfully set to new value, it returns true. Otherwise, sets `error` - // to indicate the error, leaves the flag unchanged, and returns false. - bool ParseFrom(absl::string_view value, std::string* error); - - protected: - ~CommandLineFlag() = default; - - private: - friend class flags_internal::PrivateHandleAccessor; - - // Sets the value of the flag based on specified string `value`. If the flag - // was successfully set to new value, it returns true. Otherwise, sets `error` - // to indicate the error, leaves the flag unchanged, and returns false. There - // are three ways to set the flag's value: - // * Update the current flag value - // * Update the flag's default value - // * Update the current flag value if it was never set before - // The mode is selected based on `set_mode` parameter. - virtual bool ParseFrom(absl::string_view value, - flags_internal::FlagSettingMode set_mode, - flags_internal::ValueSource source, - std::string& error) = 0; - - // Returns id of the flag's value type. - virtual flags_internal::FlagFastTypeId TypeId() const = 0; - - // Interface to save flag to some persistent state. Returns current flag state - // or nullptr if flag does not support saving and restoring a state. - virtual std::unique_ptr<flags_internal::FlagStateInterface> SaveState() = 0; - - // Copy-construct a new value of the flag's type in a memory referenced by - // the dst based on the current flag's value. - virtual void Read(void* dst) const = 0; - - // To be deleted. Used to return true if flag's current value originated from - // command line. - virtual bool IsSpecifiedOnCommandLine() const = 0; - - // Validates supplied value usign validator or parseflag routine - virtual bool ValidateInputValue(absl::string_view value) const = 0; - - // Checks that flags default value can be converted to string and back to the - // flag's value type. - virtual void CheckDefaultValueParsingRoundtrip() const = 0; -}; - -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_COMMANDLINEFLAG_H_ diff --git a/third_party/abseil_cpp/absl/flags/commandlineflag_test.cc b/third_party/abseil_cpp/absl/flags/commandlineflag_test.cc deleted file mode 100644 index 585db4ba78a0..000000000000 --- a/third_party/abseil_cpp/absl/flags/commandlineflag_test.cc +++ /dev/null @@ -1,231 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/commandlineflag.h" - -#include <memory> -#include <string> - -#include "gtest/gtest.h" -#include "absl/flags/flag.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/flags/internal/private_handle_accessor.h" -#include "absl/flags/reflection.h" -#include "absl/flags/usage_config.h" -#include "absl/memory/memory.h" -#include "absl/strings/match.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/string_view.h" - -ABSL_FLAG(int, int_flag, 201, "int_flag help"); -ABSL_FLAG(std::string, string_flag, "dflt", - absl::StrCat("string_flag", " help")); -ABSL_RETIRED_FLAG(bool, bool_retired_flag, false, "bool_retired_flag help"); - -// These are only used to test default values. -ABSL_FLAG(int, int_flag2, 201, ""); -ABSL_FLAG(std::string, string_flag2, "dflt", ""); - -namespace { - -namespace flags = absl::flags_internal; - -class CommandLineFlagTest : public testing::Test { - protected: - static void SetUpTestSuite() { - // Install a function to normalize filenames before this test is run. - absl::FlagsUsageConfig default_config; - default_config.normalize_filename = &CommandLineFlagTest::NormalizeFileName; - absl::SetFlagsUsageConfig(default_config); - } - - void SetUp() override { flag_saver_ = absl::make_unique<absl::FlagSaver>(); } - void TearDown() override { flag_saver_.reset(); } - - private: - static std::string NormalizeFileName(absl::string_view fname) { -#ifdef _WIN32 - std::string normalized(fname); - std::replace(normalized.begin(), normalized.end(), '\\', '/'); - fname = normalized; -#endif - return std::string(fname); - } - - std::unique_ptr<absl::FlagSaver> flag_saver_; -}; - -TEST_F(CommandLineFlagTest, TestAttributesAccessMethods) { - auto* flag_01 = absl::FindCommandLineFlag("int_flag"); - - ASSERT_TRUE(flag_01); - EXPECT_EQ(flag_01->Name(), "int_flag"); - EXPECT_EQ(flag_01->Help(), "int_flag help"); - EXPECT_TRUE(!flag_01->IsRetired()); - EXPECT_TRUE(flag_01->IsOfType<int>()); - EXPECT_TRUE(!flag_01->IsOfType<bool>()); - EXPECT_TRUE(!flag_01->IsOfType<std::string>()); - EXPECT_TRUE(absl::EndsWith(flag_01->Filename(), - "absl/flags/commandlineflag_test.cc")) - << flag_01->Filename(); - - auto* flag_02 = absl::FindCommandLineFlag("string_flag"); - - ASSERT_TRUE(flag_02); - EXPECT_EQ(flag_02->Name(), "string_flag"); - EXPECT_EQ(flag_02->Help(), "string_flag help"); - EXPECT_TRUE(!flag_02->IsRetired()); - EXPECT_TRUE(flag_02->IsOfType<std::string>()); - EXPECT_TRUE(!flag_02->IsOfType<bool>()); - EXPECT_TRUE(!flag_02->IsOfType<int>()); - EXPECT_TRUE(absl::EndsWith(flag_02->Filename(), - "absl/flags/commandlineflag_test.cc")) - << flag_02->Filename(); -} - -// -------------------------------------------------------------------- - -TEST_F(CommandLineFlagTest, TestValueAccessMethods) { - absl::SetFlag(&FLAGS_int_flag2, 301); - auto* flag_01 = absl::FindCommandLineFlag("int_flag2"); - - ASSERT_TRUE(flag_01); - EXPECT_EQ(flag_01->CurrentValue(), "301"); - EXPECT_EQ(flag_01->DefaultValue(), "201"); - - absl::SetFlag(&FLAGS_string_flag2, "new_str_value"); - auto* flag_02 = absl::FindCommandLineFlag("string_flag2"); - - ASSERT_TRUE(flag_02); - EXPECT_EQ(flag_02->CurrentValue(), "new_str_value"); - EXPECT_EQ(flag_02->DefaultValue(), "dflt"); -} - -// -------------------------------------------------------------------- - -TEST_F(CommandLineFlagTest, TestParseFromCurrentValue) { - std::string err; - - auto* flag_01 = absl::FindCommandLineFlag("int_flag"); - EXPECT_FALSE( - flags::PrivateHandleAccessor::IsSpecifiedOnCommandLine(*flag_01)); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "11", flags::SET_FLAGS_VALUE, flags::kProgrammaticChange, err)); - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 11); - EXPECT_FALSE( - flags::PrivateHandleAccessor::IsSpecifiedOnCommandLine(*flag_01)); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "-123", flags::SET_FLAGS_VALUE, flags::kProgrammaticChange, - err)); - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), -123); - EXPECT_FALSE( - flags::PrivateHandleAccessor::IsSpecifiedOnCommandLine(*flag_01)); - - EXPECT_TRUE(!flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "xyz", flags::SET_FLAGS_VALUE, flags::kProgrammaticChange, - err)); - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), -123); - EXPECT_EQ(err, "Illegal value 'xyz' specified for flag 'int_flag'"); - EXPECT_FALSE( - flags::PrivateHandleAccessor::IsSpecifiedOnCommandLine(*flag_01)); - - EXPECT_TRUE(!flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "A1", flags::SET_FLAGS_VALUE, flags::kProgrammaticChange, err)); - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), -123); - EXPECT_EQ(err, "Illegal value 'A1' specified for flag 'int_flag'"); - EXPECT_FALSE( - flags::PrivateHandleAccessor::IsSpecifiedOnCommandLine(*flag_01)); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "0x10", flags::SET_FLAGS_VALUE, flags::kProgrammaticChange, - err)); - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 16); - EXPECT_FALSE( - flags::PrivateHandleAccessor::IsSpecifiedOnCommandLine(*flag_01)); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "011", flags::SET_FLAGS_VALUE, flags::kCommandLine, err)); - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 11); - EXPECT_TRUE(flags::PrivateHandleAccessor::IsSpecifiedOnCommandLine(*flag_01)); - - EXPECT_TRUE(!flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "", flags::SET_FLAGS_VALUE, flags::kProgrammaticChange, err)); - EXPECT_EQ(err, "Illegal value '' specified for flag 'int_flag'"); - - auto* flag_02 = absl::FindCommandLineFlag("string_flag"); - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_02, "xyz", flags::SET_FLAGS_VALUE, flags::kProgrammaticChange, - err)); - EXPECT_EQ(absl::GetFlag(FLAGS_string_flag), "xyz"); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_02, "", flags::SET_FLAGS_VALUE, flags::kProgrammaticChange, err)); - EXPECT_EQ(absl::GetFlag(FLAGS_string_flag), ""); -} - -// -------------------------------------------------------------------- - -TEST_F(CommandLineFlagTest, TestParseFromDefaultValue) { - std::string err; - - auto* flag_01 = absl::FindCommandLineFlag("int_flag"); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "111", flags::SET_FLAGS_DEFAULT, flags::kProgrammaticChange, - err)); - EXPECT_EQ(flag_01->DefaultValue(), "111"); - - auto* flag_02 = absl::FindCommandLineFlag("string_flag"); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_02, "abc", flags::SET_FLAGS_DEFAULT, flags::kProgrammaticChange, - err)); - EXPECT_EQ(flag_02->DefaultValue(), "abc"); -} - -// -------------------------------------------------------------------- - -TEST_F(CommandLineFlagTest, TestParseFromIfDefault) { - std::string err; - - auto* flag_01 = absl::FindCommandLineFlag("int_flag"); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "22", flags::SET_FLAG_IF_DEFAULT, flags::kProgrammaticChange, - err)) - << err; - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 22); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "33", flags::SET_FLAG_IF_DEFAULT, flags::kProgrammaticChange, - err)); - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 22); - // EXPECT_EQ(err, "ERROR: int_flag is already set to 22"); - - // Reset back to default value - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "201", flags::SET_FLAGS_VALUE, flags::kProgrammaticChange, - err)); - - EXPECT_TRUE(flags::PrivateHandleAccessor::ParseFrom( - *flag_01, "33", flags::SET_FLAG_IF_DEFAULT, flags::kProgrammaticChange, - err)); - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 201); - // EXPECT_EQ(err, "ERROR: int_flag is already set to 201"); -} - -} // namespace diff --git a/third_party/abseil_cpp/absl/flags/config.h b/third_party/abseil_cpp/absl/flags/config.h deleted file mode 100644 index 813a9257000f..000000000000 --- a/third_party/abseil_cpp/absl/flags/config.h +++ /dev/null @@ -1,87 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_CONFIG_H_ -#define ABSL_FLAGS_CONFIG_H_ - -// Determine if we should strip string literals from the Flag objects. -// By default we strip string literals on mobile platforms. -#if !defined(ABSL_FLAGS_STRIP_NAMES) - -#if defined(__ANDROID__) -#define ABSL_FLAGS_STRIP_NAMES 1 - -#elif defined(__APPLE__) -#include <TargetConditionals.h> -#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE -#define ABSL_FLAGS_STRIP_NAMES 1 -#elif defined(TARGET_OS_EMBEDDED) && TARGET_OS_EMBEDDED -#define ABSL_FLAGS_STRIP_NAMES 1 -#endif // TARGET_OS_* -#endif - -#endif // !defined(ABSL_FLAGS_STRIP_NAMES) - -#if !defined(ABSL_FLAGS_STRIP_NAMES) -// If ABSL_FLAGS_STRIP_NAMES wasn't set on the command line or above, -// the default is not to strip. -#define ABSL_FLAGS_STRIP_NAMES 0 -#endif - -#if !defined(ABSL_FLAGS_STRIP_HELP) -// By default, if we strip names, we also strip help. -#define ABSL_FLAGS_STRIP_HELP ABSL_FLAGS_STRIP_NAMES -#endif - -// ABSL_FLAGS_INTERNAL_ATOMIC_DOUBLE_WORD macro is used for using atomics with -// double words, e.g. absl::Duration. -// For reasons in bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80878, modern -// versions of GCC do not support cmpxchg16b instruction in standard atomics. -#ifdef ABSL_FLAGS_INTERNAL_ATOMIC_DOUBLE_WORD -#error "ABSL_FLAGS_INTERNAL_ATOMIC_DOUBLE_WORD should not be defined." -#elif defined(__clang__) && defined(__x86_64__) && \ - defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16) -#define ABSL_FLAGS_INTERNAL_ATOMIC_DOUBLE_WORD 1 -#endif - -// ABSL_FLAGS_INTERNAL_HAS_RTTI macro is used for selecting if we can use RTTI -// for flag type identification. -#ifdef ABSL_FLAGS_INTERNAL_HAS_RTTI -#error ABSL_FLAGS_INTERNAL_HAS_RTTI cannot be directly set -#elif !defined(__GNUC__) || defined(__GXX_RTTI) -#define ABSL_FLAGS_INTERNAL_HAS_RTTI 1 -#endif // !defined(__GNUC__) || defined(__GXX_RTTI) - -// These macros represent the "source of truth" for the list of supported -// built-in types. -#define ABSL_FLAGS_INTERNAL_BUILTIN_TYPES(A) \ - A(bool, bool) \ - A(short, short) \ - A(unsigned short, unsigned_short) \ - A(int, int) \ - A(unsigned int, unsigned_int) \ - A(long, long) \ - A(unsigned long, unsigned_long) \ - A(long long, long_long) \ - A(unsigned long long, unsigned_long_long) \ - A(double, double) \ - A(float, float) - -#define ABSL_FLAGS_INTERNAL_SUPPORTED_TYPES(A) \ - ABSL_FLAGS_INTERNAL_BUILTIN_TYPES(A) \ - A(std::string, std_string) \ - A(std::vector<std::string>, std_vector_of_string) - -#endif // ABSL_FLAGS_CONFIG_H_ diff --git a/third_party/abseil_cpp/absl/flags/config_test.cc b/third_party/abseil_cpp/absl/flags/config_test.cc deleted file mode 100644 index 638998667e70..000000000000 --- a/third_party/abseil_cpp/absl/flags/config_test.cc +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/config.h" - -#ifdef __APPLE__ -#include <TargetConditionals.h> -#endif - -#include "gtest/gtest.h" - -#ifndef ABSL_FLAGS_STRIP_NAMES -#error ABSL_FLAGS_STRIP_NAMES is not defined -#endif - -#ifndef ABSL_FLAGS_STRIP_HELP -#error ABSL_FLAGS_STRIP_HELP is not defined -#endif - -namespace { - -// Test that ABSL_FLAGS_STRIP_NAMES and ABSL_FLAGS_STRIP_HELP are configured how -// we expect them to be configured by default. If you override this -// configuration, this test will fail, but the code should still be safe to use. -TEST(FlagsConfigTest, Test) { -#if defined(__ANDROID__) - EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 1); - EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 1); -#elif defined(__myriad2__) - EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 0); - EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 0); -#elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE - EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 1); - EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 1); -#elif defined(TARGET_OS_EMBEDDED) && TARGET_OS_EMBEDDED - EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 1); - EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 1); -#elif defined(__APPLE__) - EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 0); - EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 0); -#elif defined(_WIN32) - EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 0); - EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 0); -#elif defined(__linux__) - EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 0); - EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 0); -#endif -} - -} // namespace diff --git a/third_party/abseil_cpp/absl/flags/declare.h b/third_party/abseil_cpp/absl/flags/declare.h deleted file mode 100644 index b9794d8b85ac..000000000000 --- a/third_party/abseil_cpp/absl/flags/declare.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ----------------------------------------------------------------------------- -// File: declare.h -// ----------------------------------------------------------------------------- -// -// This file defines the ABSL_DECLARE_FLAG macro, allowing you to declare an -// `absl::Flag` for use within a translation unit. You should place this -// declaration within the header file associated with the .cc file that defines -// and owns the `Flag`. - -#ifndef ABSL_FLAGS_DECLARE_H_ -#define ABSL_FLAGS_DECLARE_H_ - -#include "absl/base/config.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// absl::Flag<T> represents a flag of type 'T' created by ABSL_FLAG. -template <typename T> -class Flag; - -} // namespace flags_internal - -// Flag -// -// Forward declaration of the `absl::Flag` type for use in defining the macro. -#if defined(_MSC_VER) && !defined(__clang__) -template <typename T> -class Flag; -#else -template <typename T> -using Flag = flags_internal::Flag<T>; -#endif - -ABSL_NAMESPACE_END -} // namespace absl - -// ABSL_DECLARE_FLAG() -// -// This macro is a convenience for declaring use of an `absl::Flag` within a -// translation unit. This macro should be used within a header file to -// declare usage of the flag within any .cc file including that header file. -// -// The ABSL_DECLARE_FLAG(type, name) macro expands to: -// -// extern absl::Flag<type> FLAGS_name; -#define ABSL_DECLARE_FLAG(type, name) extern ::absl::Flag<type> FLAGS_##name - -#endif // ABSL_FLAGS_DECLARE_H_ diff --git a/third_party/abseil_cpp/absl/flags/flag.cc b/third_party/abseil_cpp/absl/flags/flag.cc deleted file mode 100644 index 531df1287a17..000000000000 --- a/third_party/abseil_cpp/absl/flags/flag.cc +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/flag.h" - -#include "absl/base/config.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN - -// This global mutex protects on-demand construction of flag objects in MSVC -// builds. -#if defined(_MSC_VER) && !defined(__clang__) - -namespace flags_internal { - -ABSL_CONST_INIT static absl::Mutex construction_guard(absl::kConstInit); - -absl::Mutex* GetGlobalConstructionGuard() { return &construction_guard; } - -} // namespace flags_internal - -#endif - -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/flag.h b/third_party/abseil_cpp/absl/flags/flag.h deleted file mode 100644 index a9cb2b7994d1..000000000000 --- a/third_party/abseil_cpp/absl/flags/flag.h +++ /dev/null @@ -1,396 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ----------------------------------------------------------------------------- -// File: flag.h -// ----------------------------------------------------------------------------- -// -// This header file defines the `absl::Flag<T>` type for holding command-line -// flag data, and abstractions to create, get and set such flag data. -// -// It is important to note that this type is **unspecified** (an implementation -// detail) and you do not construct or manipulate actual `absl::Flag<T>` -// instances. Instead, you define and declare flags using the -// `ABSL_FLAG()` and `ABSL_DECLARE_FLAG()` macros, and get and set flag values -// using the `absl::GetFlag()` and `absl::SetFlag()` functions. - -#ifndef ABSL_FLAGS_FLAG_H_ -#define ABSL_FLAGS_FLAG_H_ - -#include <string> -#include <type_traits> - -#include "absl/base/attributes.h" -#include "absl/base/config.h" -#include "absl/base/optimization.h" -#include "absl/flags/config.h" -#include "absl/flags/internal/flag.h" -#include "absl/flags/internal/registry.h" -#include "absl/strings/string_view.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN - -// Flag -// -// An `absl::Flag` holds a command-line flag value, providing a runtime -// parameter to a binary. Such flags should be defined in the global namespace -// and (preferably) in the module containing the binary's `main()` function. -// -// You should not construct and cannot use the `absl::Flag` type directly; -// instead, you should declare flags using the `ABSL_DECLARE_FLAG()` macro -// within a header file, and define your flag using `ABSL_FLAG()` within your -// header's associated `.cc` file. Such flags will be named `FLAGS_name`. -// -// Example: -// -// .h file -// -// // Declares usage of a flag named "FLAGS_count" -// ABSL_DECLARE_FLAG(int, count); -// -// .cc file -// -// // Defines a flag named "FLAGS_count" with a default `int` value of 0. -// ABSL_FLAG(int, count, 0, "Count of items to process"); -// -// No public methods of `absl::Flag<T>` are part of the Abseil Flags API. -#if !defined(_MSC_VER) || defined(__clang__) -template <typename T> -using Flag = flags_internal::Flag<T>; -#else -// MSVC debug builds do not implement initialization with constexpr constructors -// correctly. To work around this we add a level of indirection, so that the -// class `absl::Flag` contains an `internal::Flag*` (instead of being an alias -// to that class) and dynamically allocates an instance when necessary. We also -// forward all calls to internal::Flag methods via trampoline methods. In this -// setup the `absl::Flag` class does not have constructor and virtual methods, -// all the data members are public and thus MSVC is able to initialize it at -// link time. To deal with multiple threads accessing the flag for the first -// time concurrently we use an atomic boolean indicating if flag object is -// initialized. We also employ the double-checked locking pattern where the -// second level of protection is a global Mutex, so if two threads attempt to -// construct the flag concurrently only one wins. -// This solution is based on a recomendation here: -// https://developercommunity.visualstudio.com/content/problem/336946/class-with-constexpr-constructor-not-using-static.html?childToView=648454#comment-648454 - -namespace flags_internal { -absl::Mutex* GetGlobalConstructionGuard(); -} // namespace flags_internal - -template <typename T> -class Flag { - public: - // No constructor and destructor to ensure this is an aggregate type. - // Visual Studio 2015 still requires the constructor for class to be - // constexpr initializable. -#if _MSC_VER <= 1900 - constexpr Flag(const char* name, const char* filename, - const flags_internal::HelpGenFunc help_gen, - const flags_internal::FlagDfltGenFunc default_value_gen) - : name_(name), - filename_(filename), - help_gen_(help_gen), - default_value_gen_(default_value_gen), - inited_(false), - impl_(nullptr) {} -#endif - - flags_internal::Flag<T>& GetImpl() const { - if (!inited_.load(std::memory_order_acquire)) { - absl::MutexLock l(flags_internal::GetGlobalConstructionGuard()); - - if (inited_.load(std::memory_order_acquire)) { - return *impl_; - } - - impl_ = new flags_internal::Flag<T>( - name_, filename_, - {flags_internal::FlagHelpMsg(help_gen_), - flags_internal::FlagHelpKind::kGenFunc}, - {flags_internal::FlagDefaultSrc(default_value_gen_), - flags_internal::FlagDefaultKind::kGenFunc}); - inited_.store(true, std::memory_order_release); - } - - return *impl_; - } - - // Public methods of `absl::Flag<T>` are NOT part of the Abseil Flags API. - // See https://abseil.io/docs/cpp/guides/flags - bool IsRetired() const { return GetImpl().IsRetired(); } - absl::string_view Name() const { return GetImpl().Name(); } - std::string Help() const { return GetImpl().Help(); } - bool IsModified() const { return GetImpl().IsModified(); } - bool IsSpecifiedOnCommandLine() const { - return GetImpl().IsSpecifiedOnCommandLine(); - } - std::string Filename() const { return GetImpl().Filename(); } - std::string DefaultValue() const { return GetImpl().DefaultValue(); } - std::string CurrentValue() const { return GetImpl().CurrentValue(); } - template <typename U> - inline bool IsOfType() const { - return GetImpl().template IsOfType<U>(); - } - T Get() const { - return flags_internal::FlagImplPeer::InvokeGet<T>(GetImpl()); - } - void Set(const T& v) { - flags_internal::FlagImplPeer::InvokeSet(GetImpl(), v); - } - void InvokeCallback() { GetImpl().InvokeCallback(); } - - const CommandLineFlag& Reflect() const { - return flags_internal::FlagImplPeer::InvokeReflect(GetImpl()); - } - - // The data members are logically private, but they need to be public for - // this to be an aggregate type. - const char* name_; - const char* filename_; - const flags_internal::HelpGenFunc help_gen_; - const flags_internal::FlagDfltGenFunc default_value_gen_; - - mutable std::atomic<bool> inited_; - mutable flags_internal::Flag<T>* impl_; -}; -#endif - -// GetFlag() -// -// Returns the value (of type `T`) of an `absl::Flag<T>` instance, by value. Do -// not construct an `absl::Flag<T>` directly and call `absl::GetFlag()`; -// instead, refer to flag's constructed variable name (e.g. `FLAGS_name`). -// Because this function returns by value and not by reference, it is -// thread-safe, but note that the operation may be expensive; as a result, avoid -// `absl::GetFlag()` within any tight loops. -// -// Example: -// -// // FLAGS_count is a Flag of type `int` -// int my_count = absl::GetFlag(FLAGS_count); -// -// // FLAGS_firstname is a Flag of type `std::string` -// std::string first_name = absl::GetFlag(FLAGS_firstname); -template <typename T> -ABSL_MUST_USE_RESULT T GetFlag(const absl::Flag<T>& flag) { - return flags_internal::FlagImplPeer::InvokeGet<T>(flag); -} - -// SetFlag() -// -// Sets the value of an `absl::Flag` to the value `v`. Do not construct an -// `absl::Flag<T>` directly and call `absl::SetFlag()`; instead, use the -// flag's variable name (e.g. `FLAGS_name`). This function is -// thread-safe, but is potentially expensive. Avoid setting flags in general, -// but especially within performance-critical code. -template <typename T> -void SetFlag(absl::Flag<T>* flag, const T& v) { - flags_internal::FlagImplPeer::InvokeSet(*flag, v); -} - -// Overload of `SetFlag()` to allow callers to pass in a value that is -// convertible to `T`. E.g., use this overload to pass a "const char*" when `T` -// is `std::string`. -template <typename T, typename V> -void SetFlag(absl::Flag<T>* flag, const V& v) { - T value(v); - flags_internal::FlagImplPeer::InvokeSet(*flag, value); -} - -// GetFlagReflectionHandle() -// -// Returns the reflection handle corresponding to specified Abseil Flag -// instance. Use this handle to access flag's reflection information, like name, -// location, default value etc. -// -// Example: -// -// std::string = absl::GetFlagReflectionHandle(FLAGS_count).DefaultValue(); - -template <typename T> -const CommandLineFlag& GetFlagReflectionHandle(const absl::Flag<T>& f) { - return flags_internal::FlagImplPeer::InvokeReflect(f); -} - -ABSL_NAMESPACE_END -} // namespace absl - - -// ABSL_FLAG() -// -// This macro defines an `absl::Flag<T>` instance of a specified type `T`: -// -// ABSL_FLAG(T, name, default_value, help); -// -// where: -// -// * `T` is a supported flag type (see the list of types in `marshalling.h`), -// * `name` designates the name of the flag (as a global variable -// `FLAGS_name`), -// * `default_value` is an expression holding the default value for this flag -// (which must be implicitly convertible to `T`), -// * `help` is the help text, which can also be an expression. -// -// This macro expands to a flag named 'FLAGS_name' of type 'T': -// -// absl::Flag<T> FLAGS_name = ...; -// -// Note that all such instances are created as global variables. -// -// For `ABSL_FLAG()` values that you wish to expose to other translation units, -// it is recommended to define those flags within the `.cc` file associated with -// the header where the flag is declared. -// -// Note: do not construct objects of type `absl::Flag<T>` directly. Only use the -// `ABSL_FLAG()` macro for such construction. -#define ABSL_FLAG(Type, name, default_value, help) \ - ABSL_FLAG_IMPL(Type, name, default_value, help) - -// ABSL_FLAG().OnUpdate() -// -// Defines a flag of type `T` with a callback attached: -// -// ABSL_FLAG(T, name, default_value, help).OnUpdate(callback); -// -// After any setting of the flag value, the callback will be called at least -// once. A rapid sequence of changes may be merged together into the same -// callback. No concurrent calls to the callback will be made for the same -// flag. Callbacks are allowed to read the current value of the flag but must -// not mutate that flag. -// -// The update mechanism guarantees "eventual consistency"; if the callback -// derives an auxiliary data structure from the flag value, it is guaranteed -// that eventually the flag value and the derived data structure will be -// consistent. -// -// Note: ABSL_FLAG.OnUpdate() does not have a public definition. Hence, this -// comment serves as its API documentation. - - -// ----------------------------------------------------------------------------- -// Implementation details below this section -// ----------------------------------------------------------------------------- - -// ABSL_FLAG_IMPL macro definition conditional on ABSL_FLAGS_STRIP_NAMES -#if !defined(_MSC_VER) || defined(__clang__) -#define ABSL_FLAG_IMPL_FLAG_PTR(flag) flag -#define ABSL_FLAG_IMPL_HELP_ARG(name) \ - absl::flags_internal::HelpArg<AbslFlagHelpGenFor##name>( \ - FLAGS_help_storage_##name) -#define ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name) \ - absl::flags_internal::DefaultArg<Type, AbslFlagDefaultGenFor##name>(0) -#else -#define ABSL_FLAG_IMPL_FLAG_PTR(flag) flag.GetImpl() -#define ABSL_FLAG_IMPL_HELP_ARG(name) &AbslFlagHelpGenFor##name::NonConst -#define ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name) &AbslFlagDefaultGenFor##name::Gen -#endif - -#if ABSL_FLAGS_STRIP_NAMES -#define ABSL_FLAG_IMPL_FLAGNAME(txt) "" -#define ABSL_FLAG_IMPL_FILENAME() "" -#define ABSL_FLAG_IMPL_REGISTRAR(T, flag) \ - absl::flags_internal::FlagRegistrar<T, false>(ABSL_FLAG_IMPL_FLAG_PTR(flag)) -#else -#define ABSL_FLAG_IMPL_FLAGNAME(txt) txt -#define ABSL_FLAG_IMPL_FILENAME() __FILE__ -#define ABSL_FLAG_IMPL_REGISTRAR(T, flag) \ - absl::flags_internal::FlagRegistrar<T, true>(ABSL_FLAG_IMPL_FLAG_PTR(flag)) -#endif - -// ABSL_FLAG_IMPL macro definition conditional on ABSL_FLAGS_STRIP_HELP - -#if ABSL_FLAGS_STRIP_HELP -#define ABSL_FLAG_IMPL_FLAGHELP(txt) absl::flags_internal::kStrippedFlagHelp -#else -#define ABSL_FLAG_IMPL_FLAGHELP(txt) txt -#endif - -// AbslFlagHelpGenFor##name is used to encapsulate both immediate (method Const) -// and lazy (method NonConst) evaluation of help message expression. We choose -// between the two via the call to HelpArg in absl::Flag instantiation below. -// If help message expression is constexpr evaluable compiler will optimize -// away this whole struct. -// TODO(rogeeff): place these generated structs into local namespace and apply -// ABSL_INTERNAL_UNIQUE_SHORT_NAME. -// TODO(rogeeff): Apply __attribute__((nodebug)) to FLAGS_help_storage_##name -#define ABSL_FLAG_IMPL_DECLARE_HELP_WRAPPER(name, txt) \ - struct AbslFlagHelpGenFor##name { \ - /* The expression is run in the caller as part of the */ \ - /* default value argument. That keeps temporaries alive */ \ - /* long enough for NonConst to work correctly. */ \ - static constexpr absl::string_view Value( \ - absl::string_view v = ABSL_FLAG_IMPL_FLAGHELP(txt)) { \ - return v; \ - } \ - static std::string NonConst() { return std::string(Value()); } \ - }; \ - constexpr auto FLAGS_help_storage_##name ABSL_INTERNAL_UNIQUE_SMALL_NAME() \ - ABSL_ATTRIBUTE_SECTION_VARIABLE(flags_help_cold) = \ - absl::flags_internal::HelpStringAsArray<AbslFlagHelpGenFor##name>( \ - 0); - -#define ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \ - struct AbslFlagDefaultGenFor##name { \ - Type value = absl::flags_internal::InitDefaultValue<Type>(default_value); \ - static void Gen(void* p) { \ - new (p) Type(AbslFlagDefaultGenFor##name{}.value); \ - } \ - }; - -// ABSL_FLAG_IMPL -// -// Note: Name of registrar object is not arbitrary. It is used to "grab" -// global name for FLAGS_no<flag_name> symbol, thus preventing the possibility -// of defining two flags with names foo and nofoo. -#define ABSL_FLAG_IMPL(Type, name, default_value, help) \ - namespace absl /* block flags in namespaces */ {} \ - ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \ - ABSL_FLAG_IMPL_DECLARE_HELP_WRAPPER(name, help) \ - ABSL_CONST_INIT absl::Flag<Type> FLAGS_##name{ \ - ABSL_FLAG_IMPL_FLAGNAME(#name), ABSL_FLAG_IMPL_FILENAME(), \ - ABSL_FLAG_IMPL_HELP_ARG(name), ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name)}; \ - extern absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name; \ - absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name = \ - ABSL_FLAG_IMPL_REGISTRAR(Type, FLAGS_##name) - -// ABSL_RETIRED_FLAG -// -// Designates the flag (which is usually pre-existing) as "retired." A retired -// flag is a flag that is now unused by the program, but may still be passed on -// the command line, usually by production scripts. A retired flag is ignored -// and code can't access it at runtime. -// -// This macro registers a retired flag with given name and type, with a name -// identical to the name of the original flag you are retiring. The retired -// flag's type can change over time, so that you can retire code to support a -// custom flag type. -// -// This macro has the same signature as `ABSL_FLAG`. To retire a flag, simply -// replace an `ABSL_FLAG` definition with `ABSL_RETIRED_FLAG`, leaving the -// arguments unchanged (unless of course you actually want to retire the flag -// type at this time as well). -// -// `default_value` is only used as a double check on the type. `explanation` is -// unused. -// TODO(rogeeff): replace RETIRED_FLAGS with FLAGS once forward declarations of -// retired flags are cleaned up. -#define ABSL_RETIRED_FLAG(type, name, default_value, explanation) \ - static absl::flags_internal::RetiredFlag<type> RETIRED_FLAGS_##name; \ - ABSL_ATTRIBUTE_UNUSED static const auto RETIRED_FLAGS_REG_##name = \ - (RETIRED_FLAGS_##name.Retire(#name), \ - ::absl::flags_internal::FlagRegistrarEmpty{}) - -#endif // ABSL_FLAGS_FLAG_H_ diff --git a/third_party/abseil_cpp/absl/flags/flag_benchmark.cc b/third_party/abseil_cpp/absl/flags/flag_benchmark.cc deleted file mode 100644 index 9982b604b3b5..000000000000 --- a/third_party/abseil_cpp/absl/flags/flag_benchmark.cc +++ /dev/null @@ -1,159 +0,0 @@ -// -// Copyright 2020 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include <stdint.h> - -#include <string> -#include <vector> - -#include "absl/flags/flag.h" -#include "absl/flags/marshalling.h" -#include "absl/flags/parse.h" -#include "absl/flags/reflection.h" -#include "absl/strings/string_view.h" -#include "absl/time/time.h" -#include "absl/types/optional.h" -#include "benchmark/benchmark.h" - -namespace { -using String = std::string; -using VectorOfStrings = std::vector<std::string>; -using AbslDuration = absl::Duration; - -// We do not want to take over marshalling for the types absl::optional<int>, -// absl::optional<std::string> which we do not own. Instead we introduce unique -// "aliases" to these types, which we do. -using AbslOptionalInt = absl::optional<int>; -struct OptionalInt : AbslOptionalInt { - using AbslOptionalInt::AbslOptionalInt; -}; -// Next two functions represent Abseil Flags marshalling for OptionalInt. -bool AbslParseFlag(absl::string_view src, OptionalInt* flag, - std::string* error) { - int val; - if (src.empty()) - flag->reset(); - else if (!absl::ParseFlag(src, &val, error)) - return false; - *flag = val; - return true; -} -std::string AbslUnparseFlag(const OptionalInt& flag) { - return !flag ? "" : absl::UnparseFlag(*flag); -} - -using AbslOptionalString = absl::optional<std::string>; -struct OptionalString : AbslOptionalString { - using AbslOptionalString::AbslOptionalString; -}; -// Next two functions represent Abseil Flags marshalling for OptionalString. -bool AbslParseFlag(absl::string_view src, OptionalString* flag, - std::string* error) { - std::string val; - if (src.empty()) - flag->reset(); - else if (!absl::ParseFlag(src, &val, error)) - return false; - *flag = val; - return true; -} -std::string AbslUnparseFlag(const OptionalString& flag) { - return !flag ? "" : absl::UnparseFlag(*flag); -} - -struct UDT { - UDT() = default; - UDT(const UDT&) {} - UDT& operator=(const UDT&) { return *this; } -}; -// Next two functions represent Abseil Flags marshalling for UDT. -bool AbslParseFlag(absl::string_view, UDT*, std::string*) { return true; } -std::string AbslUnparseFlag(const UDT&) { return ""; } - -} // namespace - -#define BENCHMARKED_TYPES(A) \ - A(bool) \ - A(int16_t) \ - A(uint16_t) \ - A(int32_t) \ - A(uint32_t) \ - A(int64_t) \ - A(uint64_t) \ - A(double) \ - A(float) \ - A(String) \ - A(VectorOfStrings) \ - A(OptionalInt) \ - A(OptionalString) \ - A(AbslDuration) \ - A(UDT) - -#define FLAG_DEF(T) ABSL_FLAG(T, T##_flag, {}, ""); - -BENCHMARKED_TYPES(FLAG_DEF) - -// Register thousands of flags to bloat up the size of the registry. -// This mimics real life production binaries. -#define DEFINE_FLAG_0(name) ABSL_FLAG(int, name, 0, ""); -#define DEFINE_FLAG_1(name) DEFINE_FLAG_0(name##0) DEFINE_FLAG_0(name##1) -#define DEFINE_FLAG_2(name) DEFINE_FLAG_1(name##0) DEFINE_FLAG_1(name##1) -#define DEFINE_FLAG_3(name) DEFINE_FLAG_2(name##0) DEFINE_FLAG_2(name##1) -#define DEFINE_FLAG_4(name) DEFINE_FLAG_3(name##0) DEFINE_FLAG_3(name##1) -#define DEFINE_FLAG_5(name) DEFINE_FLAG_4(name##0) DEFINE_FLAG_4(name##1) -#define DEFINE_FLAG_6(name) DEFINE_FLAG_5(name##0) DEFINE_FLAG_5(name##1) -#define DEFINE_FLAG_7(name) DEFINE_FLAG_6(name##0) DEFINE_FLAG_6(name##1) -#define DEFINE_FLAG_8(name) DEFINE_FLAG_7(name##0) DEFINE_FLAG_7(name##1) -#define DEFINE_FLAG_9(name) DEFINE_FLAG_8(name##0) DEFINE_FLAG_8(name##1) -#define DEFINE_FLAG_10(name) DEFINE_FLAG_9(name##0) DEFINE_FLAG_9(name##1) -#define DEFINE_FLAG_11(name) DEFINE_FLAG_10(name##0) DEFINE_FLAG_10(name##1) -#define DEFINE_FLAG_12(name) DEFINE_FLAG_11(name##0) DEFINE_FLAG_11(name##1) -DEFINE_FLAG_12(bloat_flag_); - -namespace { - -#define BM_GetFlag(T) \ - void BM_GetFlag_##T(benchmark::State& state) { \ - for (auto _ : state) { \ - benchmark::DoNotOptimize(absl::GetFlag(FLAGS_##T##_flag)); \ - } \ - } \ - BENCHMARK(BM_GetFlag_##T); - -BENCHMARKED_TYPES(BM_GetFlag) - -void BM_ThreadedFindCommandLineFlag(benchmark::State& state) { - char dummy[] = "dummy"; - char* argv[] = {dummy}; - // We need to ensure that flags have been parsed. That is where the registry - // is finalized. - absl::ParseCommandLine(1, argv); - - for (auto s : state) { - benchmark::DoNotOptimize( - absl::FindCommandLineFlag("bloat_flag_010101010101")); - } -} -BENCHMARK(BM_ThreadedFindCommandLineFlag)->ThreadRange(1, 16); - -} // namespace - -#define InvokeGetFlag(T) \ - T AbslInvokeGetFlag##T() { return absl::GetFlag(FLAGS_##T##_flag); } \ - int odr##T = (benchmark::DoNotOptimize(AbslInvokeGetFlag##T), 1); - -BENCHMARKED_TYPES(InvokeGetFlag) - -// To veiw disassembly use: gdb ${BINARY} -batch -ex "disassemble /s $FUNC" diff --git a/third_party/abseil_cpp/absl/flags/flag_test.cc b/third_party/abseil_cpp/absl/flags/flag_test.cc deleted file mode 100644 index 654c8122215c..000000000000 --- a/third_party/abseil_cpp/absl/flags/flag_test.cc +++ /dev/null @@ -1,906 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/flag.h" - -#include <stddef.h> -#include <stdint.h> - -#include <cmath> -#include <new> -#include <string> -#include <thread> // NOLINT -#include <vector> - -#include "gtest/gtest.h" -#include "absl/base/attributes.h" -#include "absl/flags/config.h" -#include "absl/flags/declare.h" -#include "absl/flags/internal/flag.h" -#include "absl/flags/marshalling.h" -#include "absl/flags/reflection.h" -#include "absl/flags/usage_config.h" -#include "absl/strings/match.h" -#include "absl/strings/numbers.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/str_split.h" -#include "absl/strings/string_view.h" -#include "absl/time/time.h" - -ABSL_DECLARE_FLAG(int64_t, mistyped_int_flag); -ABSL_DECLARE_FLAG(std::vector<std::string>, mistyped_string_flag); - -namespace { - -namespace flags = absl::flags_internal; - -std::string TestHelpMsg() { return "dynamic help"; } -#if defined(_MSC_VER) && !defined(__clang__) -std::string TestLiteralHelpMsg() { return "literal help"; } -#endif -template <typename T> -void TestMakeDflt(void* dst) { - new (dst) T{}; -} -void TestCallback() {} - -struct UDT { - UDT() = default; - UDT(const UDT&) = default; -}; -bool AbslParseFlag(absl::string_view, UDT*, std::string*) { return true; } -std::string AbslUnparseFlag(const UDT&) { return ""; } - -class FlagTest : public testing::Test { - protected: - static void SetUpTestSuite() { - // Install a function to normalize filenames before this test is run. - absl::FlagsUsageConfig default_config; - default_config.normalize_filename = &FlagTest::NormalizeFileName; - absl::SetFlagsUsageConfig(default_config); - } - - private: - static std::string NormalizeFileName(absl::string_view fname) { -#ifdef _WIN32 - std::string normalized(fname); - std::replace(normalized.begin(), normalized.end(), '\\', '/'); - fname = normalized; -#endif - return std::string(fname); - } - absl::FlagSaver flag_saver_; -}; - -struct S1 { - S1() = default; - S1(const S1&) = default; - int32_t f1; - int64_t f2; -}; - -struct S2 { - S2() = default; - S2(const S2&) = default; - int64_t f1; - double f2; -}; - -TEST_F(FlagTest, Traits) { - EXPECT_EQ(flags::StorageKind<int>(), - flags::FlagValueStorageKind::kOneWordAtomic); - EXPECT_EQ(flags::StorageKind<bool>(), - flags::FlagValueStorageKind::kOneWordAtomic); - EXPECT_EQ(flags::StorageKind<double>(), - flags::FlagValueStorageKind::kOneWordAtomic); - EXPECT_EQ(flags::StorageKind<int64_t>(), - flags::FlagValueStorageKind::kOneWordAtomic); - -#if defined(ABSL_FLAGS_INTERNAL_ATOMIC_DOUBLE_WORD) - EXPECT_EQ(flags::StorageKind<S1>(), - flags::FlagValueStorageKind::kTwoWordsAtomic); - EXPECT_EQ(flags::StorageKind<S2>(), - flags::FlagValueStorageKind::kTwoWordsAtomic); -#else - EXPECT_EQ(flags::StorageKind<S1>(), - flags::FlagValueStorageKind::kAlignedBuffer); - EXPECT_EQ(flags::StorageKind<S2>(), - flags::FlagValueStorageKind::kAlignedBuffer); -#endif - - EXPECT_EQ(flags::StorageKind<std::string>(), - flags::FlagValueStorageKind::kAlignedBuffer); - EXPECT_EQ(flags::StorageKind<std::vector<std::string>>(), - flags::FlagValueStorageKind::kAlignedBuffer); -} - -// -------------------------------------------------------------------- - -constexpr flags::FlagHelpArg help_arg{flags::FlagHelpMsg("literal help"), - flags::FlagHelpKind::kLiteral}; - -using String = std::string; - -#if !defined(_MSC_VER) || defined(__clang__) -#define DEFINE_CONSTRUCTED_FLAG(T, dflt, dflt_kind) \ - constexpr flags::FlagDefaultArg f1default##T{ \ - flags::FlagDefaultSrc{dflt}, flags::FlagDefaultKind::dflt_kind}; \ - constexpr absl::Flag<T> f1##T{"f1", "file", help_arg, f1default##T}; \ - ABSL_CONST_INIT absl::Flag<T> f2##T { \ - "f2", "file", \ - {flags::FlagHelpMsg(&TestHelpMsg), flags::FlagHelpKind::kGenFunc}, \ - flags::FlagDefaultArg { \ - flags::FlagDefaultSrc(&TestMakeDflt<T>), \ - flags::FlagDefaultKind::kGenFunc \ - } \ - } -#else -#define DEFINE_CONSTRUCTED_FLAG(T, dflt, dflt_kind) \ - constexpr flags::FlagDefaultArg f1default##T{ \ - flags::FlagDefaultSrc{dflt}, flags::FlagDefaultKind::dflt_kind}; \ - constexpr absl::Flag<T> f1##T{"f1", "file", &TestLiteralHelpMsg, \ - &TestMakeDflt<T>}; \ - ABSL_CONST_INIT absl::Flag<T> f2##T { \ - "f2", "file", &TestHelpMsg, &TestMakeDflt<T> \ - } -#endif - -DEFINE_CONSTRUCTED_FLAG(bool, true, kOneWord); -DEFINE_CONSTRUCTED_FLAG(int16_t, 1, kOneWord); -DEFINE_CONSTRUCTED_FLAG(uint16_t, 2, kOneWord); -DEFINE_CONSTRUCTED_FLAG(int32_t, 3, kOneWord); -DEFINE_CONSTRUCTED_FLAG(uint32_t, 4, kOneWord); -DEFINE_CONSTRUCTED_FLAG(int64_t, 5, kOneWord); -DEFINE_CONSTRUCTED_FLAG(uint64_t, 6, kOneWord); -DEFINE_CONSTRUCTED_FLAG(float, 7.8, kOneWord); -DEFINE_CONSTRUCTED_FLAG(double, 9.10, kOneWord); -DEFINE_CONSTRUCTED_FLAG(String, &TestMakeDflt<String>, kGenFunc); -DEFINE_CONSTRUCTED_FLAG(UDT, &TestMakeDflt<UDT>, kGenFunc); - -template <typename T> -bool TestConstructionFor(const absl::Flag<T>& f1, absl::Flag<T>& f2) { - EXPECT_EQ(absl::GetFlagReflectionHandle(f1).Name(), "f1"); - EXPECT_EQ(absl::GetFlagReflectionHandle(f1).Help(), "literal help"); - EXPECT_EQ(absl::GetFlagReflectionHandle(f1).Filename(), "file"); - - flags::FlagRegistrar<T, false>(ABSL_FLAG_IMPL_FLAG_PTR(f2)) - .OnUpdate(TestCallback); - - EXPECT_EQ(absl::GetFlagReflectionHandle(f2).Name(), "f2"); - EXPECT_EQ(absl::GetFlagReflectionHandle(f2).Help(), "dynamic help"); - EXPECT_EQ(absl::GetFlagReflectionHandle(f2).Filename(), "file"); - - return true; -} - -#define TEST_CONSTRUCTED_FLAG(T) TestConstructionFor(f1##T, f2##T); - -TEST_F(FlagTest, TestConstruction) { - TEST_CONSTRUCTED_FLAG(bool); - TEST_CONSTRUCTED_FLAG(int16_t); - TEST_CONSTRUCTED_FLAG(uint16_t); - TEST_CONSTRUCTED_FLAG(int32_t); - TEST_CONSTRUCTED_FLAG(uint32_t); - TEST_CONSTRUCTED_FLAG(int64_t); - TEST_CONSTRUCTED_FLAG(uint64_t); - TEST_CONSTRUCTED_FLAG(float); - TEST_CONSTRUCTED_FLAG(double); - TEST_CONSTRUCTED_FLAG(String); - TEST_CONSTRUCTED_FLAG(UDT); -} - -// -------------------------------------------------------------------- - -} // namespace - -ABSL_DECLARE_FLAG(bool, test_flag_01); -ABSL_DECLARE_FLAG(int, test_flag_02); -ABSL_DECLARE_FLAG(int16_t, test_flag_03); -ABSL_DECLARE_FLAG(uint16_t, test_flag_04); -ABSL_DECLARE_FLAG(int32_t, test_flag_05); -ABSL_DECLARE_FLAG(uint32_t, test_flag_06); -ABSL_DECLARE_FLAG(int64_t, test_flag_07); -ABSL_DECLARE_FLAG(uint64_t, test_flag_08); -ABSL_DECLARE_FLAG(double, test_flag_09); -ABSL_DECLARE_FLAG(float, test_flag_10); -ABSL_DECLARE_FLAG(std::string, test_flag_11); -ABSL_DECLARE_FLAG(absl::Duration, test_flag_12); - -namespace { - -#if !ABSL_FLAGS_STRIP_NAMES - -TEST_F(FlagTest, TestFlagDeclaration) { - // test that we can access flag objects. - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Name(), - "test_flag_01"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Name(), - "test_flag_02"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Name(), - "test_flag_03"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Name(), - "test_flag_04"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Name(), - "test_flag_05"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Name(), - "test_flag_06"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Name(), - "test_flag_07"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Name(), - "test_flag_08"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Name(), - "test_flag_09"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Name(), - "test_flag_10"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Name(), - "test_flag_11"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Name(), - "test_flag_12"); -} -#endif // !ABSL_FLAGS_STRIP_NAMES - -// -------------------------------------------------------------------- - -} // namespace - -ABSL_FLAG(bool, test_flag_01, true, "test flag 01"); -ABSL_FLAG(int, test_flag_02, 1234, "test flag 02"); -ABSL_FLAG(int16_t, test_flag_03, -34, "test flag 03"); -ABSL_FLAG(uint16_t, test_flag_04, 189, "test flag 04"); -ABSL_FLAG(int32_t, test_flag_05, 10765, "test flag 05"); -ABSL_FLAG(uint32_t, test_flag_06, 40000, "test flag 06"); -ABSL_FLAG(int64_t, test_flag_07, -1234567, "test flag 07"); -ABSL_FLAG(uint64_t, test_flag_08, 9876543, "test flag 08"); -ABSL_FLAG(double, test_flag_09, -9.876e-50, "test flag 09"); -ABSL_FLAG(float, test_flag_10, 1.234e12f, "test flag 10"); -ABSL_FLAG(std::string, test_flag_11, "", "test flag 11"); -ABSL_FLAG(absl::Duration, test_flag_12, absl::Minutes(10), "test flag 12"); - -namespace { - -#if !ABSL_FLAGS_STRIP_NAMES -TEST_F(FlagTest, TestFlagDefinition) { - absl::string_view expected_file_name = "absl/flags/flag_test.cc"; - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Name(), - "test_flag_01"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Help(), - "test flag 01"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Name(), - "test_flag_02"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Help(), - "test flag 02"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Name(), - "test_flag_03"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Help(), - "test flag 03"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Name(), - "test_flag_04"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Help(), - "test flag 04"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Name(), - "test_flag_05"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Help(), - "test flag 05"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Name(), - "test_flag_06"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Help(), - "test flag 06"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Name(), - "test_flag_07"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Help(), - "test flag 07"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Name(), - "test_flag_08"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Help(), - "test flag 08"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Name(), - "test_flag_09"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Help(), - "test flag 09"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Name(), - "test_flag_10"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Help(), - "test flag 10"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Name(), - "test_flag_11"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Help(), - "test flag 11"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Name(), - "test_flag_12"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Help(), - "test flag 12"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Filename(); -} -#endif // !ABSL_FLAGS_STRIP_NAMES - -// -------------------------------------------------------------------- - -TEST_F(FlagTest, TestDefault) { - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).DefaultValue(), - "true"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).DefaultValue(), - "1234"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).DefaultValue(), - "-34"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).DefaultValue(), - "189"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).DefaultValue(), - "10765"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).DefaultValue(), - "40000"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).DefaultValue(), - "-1234567"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).DefaultValue(), - "9876543"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).DefaultValue(), - "-9.876e-50"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).DefaultValue(), - "1.234e+12"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).DefaultValue(), - ""); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).DefaultValue(), - "10m"); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).CurrentValue(), - "true"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).CurrentValue(), - "1234"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).CurrentValue(), - "-34"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).CurrentValue(), - "189"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).CurrentValue(), - "10765"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).CurrentValue(), - "40000"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).CurrentValue(), - "-1234567"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).CurrentValue(), - "9876543"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).CurrentValue(), - "-9.876e-50"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).CurrentValue(), - "1.234e+12"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).CurrentValue(), - ""); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).CurrentValue(), - "10m"); - - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), true); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 1234); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), -34); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_04), 189); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_05), 10765); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_06), 40000); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_07), -1234567); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 9876543); - EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_09), -9.876e-50, 1e-55); - EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_10), 1.234e12f, 1e5f); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), ""); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Minutes(10)); -} - -// -------------------------------------------------------------------- - -struct NonTriviallyCopyableAggregate { - NonTriviallyCopyableAggregate() = default; - NonTriviallyCopyableAggregate(const NonTriviallyCopyableAggregate& rhs) - : value(rhs.value) {} - NonTriviallyCopyableAggregate& operator=( - const NonTriviallyCopyableAggregate& rhs) { - value = rhs.value; - return *this; - } - - int value; -}; -bool AbslParseFlag(absl::string_view src, NonTriviallyCopyableAggregate* f, - std::string* e) { - return absl::ParseFlag(src, &f->value, e); -} -std::string AbslUnparseFlag(const NonTriviallyCopyableAggregate& ntc) { - return absl::StrCat(ntc.value); -} - -bool operator==(const NonTriviallyCopyableAggregate& ntc1, - const NonTriviallyCopyableAggregate& ntc2) { - return ntc1.value == ntc2.value; -} - -} // namespace - -ABSL_FLAG(bool, test_flag_eb_01, {}, ""); -ABSL_FLAG(int32_t, test_flag_eb_02, {}, ""); -ABSL_FLAG(int64_t, test_flag_eb_03, {}, ""); -ABSL_FLAG(double, test_flag_eb_04, {}, ""); -ABSL_FLAG(std::string, test_flag_eb_05, {}, ""); -ABSL_FLAG(NonTriviallyCopyableAggregate, test_flag_eb_06, {}, ""); - -namespace { - -TEST_F(FlagTest, TestEmptyBracesDefault) { - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_01).DefaultValue(), - "false"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_02).DefaultValue(), - "0"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_03).DefaultValue(), - "0"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_04).DefaultValue(), - "0"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_05).DefaultValue(), - ""); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_06).DefaultValue(), - "0"); - - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_01), false); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_02), 0); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_03), 0); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_04), 0.0); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_05), ""); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_06), - NonTriviallyCopyableAggregate{}); -} - -// -------------------------------------------------------------------- - -TEST_F(FlagTest, TestGetSet) { - absl::SetFlag(&FLAGS_test_flag_01, false); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), false); - - absl::SetFlag(&FLAGS_test_flag_02, 321); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 321); - - absl::SetFlag(&FLAGS_test_flag_03, 67); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), 67); - - absl::SetFlag(&FLAGS_test_flag_04, 1); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_04), 1); - - absl::SetFlag(&FLAGS_test_flag_05, -908); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_05), -908); - - absl::SetFlag(&FLAGS_test_flag_06, 4001); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_06), 4001); - - absl::SetFlag(&FLAGS_test_flag_07, -23456); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_07), -23456); - - absl::SetFlag(&FLAGS_test_flag_08, 975310); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 975310); - - absl::SetFlag(&FLAGS_test_flag_09, 1.00001); - EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_09), 1.00001, 1e-10); - - absl::SetFlag(&FLAGS_test_flag_10, -3.54f); - EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_10), -3.54f, 1e-6f); - - absl::SetFlag(&FLAGS_test_flag_11, "asdf"); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), "asdf"); - - absl::SetFlag(&FLAGS_test_flag_12, absl::Seconds(110)); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Seconds(110)); -} - -// -------------------------------------------------------------------- - -TEST_F(FlagTest, TestGetViaReflection) { - auto* handle = absl::FindCommandLineFlag("test_flag_01"); - EXPECT_EQ(*handle->TryGet<bool>(), true); - handle = absl::FindCommandLineFlag("test_flag_02"); - EXPECT_EQ(*handle->TryGet<int>(), 1234); - handle = absl::FindCommandLineFlag("test_flag_03"); - EXPECT_EQ(*handle->TryGet<int16_t>(), -34); - handle = absl::FindCommandLineFlag("test_flag_04"); - EXPECT_EQ(*handle->TryGet<uint16_t>(), 189); - handle = absl::FindCommandLineFlag("test_flag_05"); - EXPECT_EQ(*handle->TryGet<int32_t>(), 10765); - handle = absl::FindCommandLineFlag("test_flag_06"); - EXPECT_EQ(*handle->TryGet<uint32_t>(), 40000); - handle = absl::FindCommandLineFlag("test_flag_07"); - EXPECT_EQ(*handle->TryGet<int64_t>(), -1234567); - handle = absl::FindCommandLineFlag("test_flag_08"); - EXPECT_EQ(*handle->TryGet<uint64_t>(), 9876543); - handle = absl::FindCommandLineFlag("test_flag_09"); - EXPECT_NEAR(*handle->TryGet<double>(), -9.876e-50, 1e-55); - handle = absl::FindCommandLineFlag("test_flag_10"); - EXPECT_NEAR(*handle->TryGet<float>(), 1.234e12f, 1e5f); - handle = absl::FindCommandLineFlag("test_flag_11"); - EXPECT_EQ(*handle->TryGet<std::string>(), ""); - handle = absl::FindCommandLineFlag("test_flag_12"); - EXPECT_EQ(*handle->TryGet<absl::Duration>(), absl::Minutes(10)); -} - -// -------------------------------------------------------------------- - -int GetDflt1() { return 1; } - -} // namespace - -ABSL_FLAG(int, test_int_flag_with_non_const_default, GetDflt1(), - "test int flag non const default"); -ABSL_FLAG(std::string, test_string_flag_with_non_const_default, - absl::StrCat("AAA", "BBB"), "test string flag non const default"); - -namespace { - -TEST_F(FlagTest, TestNonConstexprDefault) { - EXPECT_EQ(absl::GetFlag(FLAGS_test_int_flag_with_non_const_default), 1); - EXPECT_EQ(absl::GetFlag(FLAGS_test_string_flag_with_non_const_default), - "AAABBB"); -} - -// -------------------------------------------------------------------- - -} // namespace - -ABSL_FLAG(bool, test_flag_with_non_const_help, true, - absl::StrCat("test ", "flag ", "non const help")); - -namespace { - -#if !ABSL_FLAGS_STRIP_HELP -TEST_F(FlagTest, TestNonConstexprHelp) { - EXPECT_EQ( - absl::GetFlagReflectionHandle(FLAGS_test_flag_with_non_const_help).Help(), - "test flag non const help"); -} -#endif //! ABSL_FLAGS_STRIP_HELP - -// -------------------------------------------------------------------- - -int cb_test_value = -1; -void TestFlagCB(); - -} // namespace - -ABSL_FLAG(int, test_flag_with_cb, 100, "").OnUpdate(TestFlagCB); - -ABSL_FLAG(int, test_flag_with_lambda_cb, 200, "").OnUpdate([]() { - cb_test_value = absl::GetFlag(FLAGS_test_flag_with_lambda_cb) + - absl::GetFlag(FLAGS_test_flag_with_cb); -}); - -namespace { - -void TestFlagCB() { cb_test_value = absl::GetFlag(FLAGS_test_flag_with_cb); } - -// Tests side-effects of callback invocation. -TEST_F(FlagTest, CallbackInvocation) { - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_with_cb), 100); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_with_lambda_cb), 200); - EXPECT_EQ(cb_test_value, 300); - - absl::SetFlag(&FLAGS_test_flag_with_cb, 1); - EXPECT_EQ(cb_test_value, 1); - - absl::SetFlag(&FLAGS_test_flag_with_lambda_cb, 3); - EXPECT_EQ(cb_test_value, 4); -} - -// -------------------------------------------------------------------- - -struct CustomUDT { - CustomUDT() : a(1), b(1) {} - CustomUDT(int a_, int b_) : a(a_), b(b_) {} - - friend bool operator==(const CustomUDT& f1, const CustomUDT& f2) { - return f1.a == f2.a && f1.b == f2.b; - } - - int a; - int b; -}; -bool AbslParseFlag(absl::string_view in, CustomUDT* f, std::string*) { - std::vector<absl::string_view> parts = - absl::StrSplit(in, ':', absl::SkipWhitespace()); - - if (parts.size() != 2) return false; - - if (!absl::SimpleAtoi(parts[0], &f->a)) return false; - - if (!absl::SimpleAtoi(parts[1], &f->b)) return false; - - return true; -} -std::string AbslUnparseFlag(const CustomUDT& f) { - return absl::StrCat(f.a, ":", f.b); -} - -} // namespace - -ABSL_FLAG(CustomUDT, test_flag_custom_udt, CustomUDT(), "test flag custom UDT"); - -namespace { - -TEST_F(FlagTest, TestCustomUDT) { - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_custom_udt), CustomUDT(1, 1)); - absl::SetFlag(&FLAGS_test_flag_custom_udt, CustomUDT(2, 3)); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_custom_udt), CustomUDT(2, 3)); -} - -// MSVC produces link error on the type mismatch. -// Linux does not have build errors and validations work as expected. -#if !defined(_WIN32) && GTEST_HAS_DEATH_TEST - -using FlagDeathTest = FlagTest; - -TEST_F(FlagDeathTest, TestTypeMismatchValidations) { -#if !defined(NDEBUG) - EXPECT_DEATH_IF_SUPPORTED( - static_cast<void>(absl::GetFlag(FLAGS_mistyped_int_flag)), - "Flag 'mistyped_int_flag' is defined as one type and declared " - "as another"); - EXPECT_DEATH_IF_SUPPORTED( - static_cast<void>(absl::GetFlag(FLAGS_mistyped_string_flag)), - "Flag 'mistyped_string_flag' is defined as one type and " - "declared as another"); -#endif - - EXPECT_DEATH_IF_SUPPORTED( - absl::SetFlag(&FLAGS_mistyped_int_flag, 1), - "Flag 'mistyped_int_flag' is defined as one type and declared " - "as another"); - EXPECT_DEATH_IF_SUPPORTED( - absl::SetFlag(&FLAGS_mistyped_string_flag, std::vector<std::string>{}), - "Flag 'mistyped_string_flag' is defined as one type and declared as " - "another"); -} - -#endif - -// -------------------------------------------------------------------- - -// A contrived type that offers implicit and explicit conversion from specific -// source types. -struct ConversionTestVal { - ConversionTestVal() = default; - explicit ConversionTestVal(int a_in) : a(a_in) {} - - enum class ViaImplicitConv { kTen = 10, kEleven }; - // NOLINTNEXTLINE - ConversionTestVal(ViaImplicitConv from) : a(static_cast<int>(from)) {} - - int a; -}; - -bool AbslParseFlag(absl::string_view in, ConversionTestVal* val_out, - std::string*) { - if (!absl::SimpleAtoi(in, &val_out->a)) { - return false; - } - return true; -} -std::string AbslUnparseFlag(const ConversionTestVal& val) { - return absl::StrCat(val.a); -} - -} // namespace - -// Flag default values can be specified with a value that converts to the flag -// value type implicitly. -ABSL_FLAG(ConversionTestVal, test_flag_implicit_conv, - ConversionTestVal::ViaImplicitConv::kTen, - "test flag init via implicit conversion"); - -namespace { - -TEST_F(FlagTest, CanSetViaImplicitConversion) { - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_implicit_conv).a, 10); - absl::SetFlag(&FLAGS_test_flag_implicit_conv, - ConversionTestVal::ViaImplicitConv::kEleven); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_implicit_conv).a, 11); -} - -// -------------------------------------------------------------------- - -struct NonDfltConstructible { - public: - // This constructor tests that we can initialize the flag with int value - NonDfltConstructible(int i) : value(i) {} // NOLINT - - // This constructor tests that we can't initialize the flag with char value - // but can with explicitly constructed NonDfltConstructible. - explicit NonDfltConstructible(char c) : value(100 + static_cast<int>(c)) {} - - int value; -}; - -bool AbslParseFlag(absl::string_view in, NonDfltConstructible* ndc_out, - std::string*) { - return absl::SimpleAtoi(in, &ndc_out->value); -} -std::string AbslUnparseFlag(const NonDfltConstructible& ndc) { - return absl::StrCat(ndc.value); -} - -} // namespace - -ABSL_FLAG(NonDfltConstructible, ndc_flag1, NonDfltConstructible('1'), - "Flag with non default constructible type"); -ABSL_FLAG(NonDfltConstructible, ndc_flag2, 0, - "Flag with non default constructible type"); - -namespace { - -TEST_F(FlagTest, TestNonDefaultConstructibleType) { - EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag1).value, '1' + 100); - EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag2).value, 0); - - absl::SetFlag(&FLAGS_ndc_flag1, NonDfltConstructible('A')); - absl::SetFlag(&FLAGS_ndc_flag2, 25); - - EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag1).value, 'A' + 100); - EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag2).value, 25); -} - -} // namespace - -// -------------------------------------------------------------------- - -ABSL_RETIRED_FLAG(bool, old_bool_flag, true, "old descr"); -ABSL_RETIRED_FLAG(int, old_int_flag, (int)std::sqrt(10), "old descr"); -ABSL_RETIRED_FLAG(std::string, old_str_flag, "", absl::StrCat("old ", "descr")); - -bool initializaion_order_fiasco_test = [] { - // Iterate over all the flags during static initialization. - // This should not trigger ASan's initialization-order-fiasco. - auto* handle1 = absl::FindCommandLineFlag("flag_on_separate_file"); - auto* handle2 = absl::FindCommandLineFlag("retired_flag_on_separate_file"); - if (handle1 != nullptr && handle2 != nullptr) { - return handle1->Name() == handle2->Name(); - } - return true; -}(); - -namespace { - -TEST_F(FlagTest, TestRetiredFlagRegistration) { - auto* handle = absl::FindCommandLineFlag("old_bool_flag"); - EXPECT_TRUE(handle->IsOfType<bool>()); - EXPECT_TRUE(handle->IsRetired()); - handle = absl::FindCommandLineFlag("old_int_flag"); - EXPECT_TRUE(handle->IsOfType<int>()); - EXPECT_TRUE(handle->IsRetired()); - handle = absl::FindCommandLineFlag("old_str_flag"); - EXPECT_TRUE(handle->IsOfType<std::string>()); - EXPECT_TRUE(handle->IsRetired()); -} - -} // namespace - -// -------------------------------------------------------------------- - -namespace { - -// User-defined type with small alignment, but size exceeding 16. -struct SmallAlignUDT { - SmallAlignUDT() : c('A'), s(12) {} - char c; - int16_t s; - char bytes[14]; -}; - -bool AbslParseFlag(absl::string_view, SmallAlignUDT*, std::string*) { - return true; -} -std::string AbslUnparseFlag(const SmallAlignUDT&) { return ""; } - -// User-defined type with small size, but not trivially copyable. -struct NonTriviallyCopyableUDT { - NonTriviallyCopyableUDT() : c('A') {} - NonTriviallyCopyableUDT(const NonTriviallyCopyableUDT& rhs) : c(rhs.c) {} - NonTriviallyCopyableUDT& operator=(const NonTriviallyCopyableUDT& rhs) { - c = rhs.c; - return *this; - } - - char c; -}; - -bool AbslParseFlag(absl::string_view, NonTriviallyCopyableUDT*, std::string*) { - return true; -} -std::string AbslUnparseFlag(const NonTriviallyCopyableUDT&) { return ""; } - -} // namespace - -ABSL_FLAG(SmallAlignUDT, test_flag_sa_udt, {}, "help"); -ABSL_FLAG(NonTriviallyCopyableUDT, test_flag_ntc_udt, {}, "help"); - -namespace { - -TEST_F(FlagTest, TestSmallAlignUDT) { - SmallAlignUDT value = absl::GetFlag(FLAGS_test_flag_sa_udt); - EXPECT_EQ(value.c, 'A'); - EXPECT_EQ(value.s, 12); - - value.c = 'B'; - value.s = 45; - absl::SetFlag(&FLAGS_test_flag_sa_udt, value); - value = absl::GetFlag(FLAGS_test_flag_sa_udt); - EXPECT_EQ(value.c, 'B'); - EXPECT_EQ(value.s, 45); -} - -TEST_F(FlagTest, TestNonTriviallyCopyableUDT) { - NonTriviallyCopyableUDT value = absl::GetFlag(FLAGS_test_flag_ntc_udt); - EXPECT_EQ(value.c, 'A'); - - value.c = 'B'; - absl::SetFlag(&FLAGS_test_flag_ntc_udt, value); - value = absl::GetFlag(FLAGS_test_flag_ntc_udt); - EXPECT_EQ(value.c, 'B'); -} - -} // namespace diff --git a/third_party/abseil_cpp/absl/flags/flag_test_defs.cc b/third_party/abseil_cpp/absl/flags/flag_test_defs.cc deleted file mode 100644 index 4e1693cdb9c4..000000000000 --- a/third_party/abseil_cpp/absl/flags/flag_test_defs.cc +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// This file is used to test the mismatch of the flag type between definition -// and declaration. These are definitions. flag_test.cc contains declarations. -#include <string> -#include "absl/flags/flag.h" - -ABSL_FLAG(int, mistyped_int_flag, 0, ""); -ABSL_FLAG(std::string, mistyped_string_flag, "", ""); -ABSL_FLAG(bool, flag_on_separate_file, false, ""); -ABSL_RETIRED_FLAG(bool, retired_flag_on_separate_file, false, ""); diff --git a/third_party/abseil_cpp/absl/flags/internal/commandlineflag.cc b/third_party/abseil_cpp/absl/flags/internal/commandlineflag.cc deleted file mode 100644 index 4482955c4cb6..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/commandlineflag.cc +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright 2020 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/internal/commandlineflag.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -FlagStateInterface::~FlagStateInterface() {} - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/internal/commandlineflag.h b/third_party/abseil_cpp/absl/flags/internal/commandlineflag.h deleted file mode 100644 index cb46fe2e979d..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/commandlineflag.h +++ /dev/null @@ -1,68 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_INTERNAL_COMMANDLINEFLAG_H_ -#define ABSL_FLAGS_INTERNAL_COMMANDLINEFLAG_H_ - -#include "absl/base/config.h" -#include "absl/base/internal/fast_type_id.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// An alias for flag fast type id. This value identifies the flag value type -// simialarly to typeid(T), without relying on RTTI being available. In most -// cases this id is enough to uniquely identify the flag's value type. In a few -// cases we'll have to resort to using actual RTTI implementation if it is -// available. -using FlagFastTypeId = absl::base_internal::FastTypeIdType; - -// Options that control SetCommandLineOptionWithMode. -enum FlagSettingMode { - // update the flag's value unconditionally (can call this multiple times). - SET_FLAGS_VALUE, - // update the flag's value, but *only if* it has not yet been updated - // with SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or "FLAGS_xxx = nondef". - SET_FLAG_IF_DEFAULT, - // set the flag's default value to this. If the flag has not been updated - // yet (via SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or "FLAGS_xxx = nondef") - // change the flag's current value to the new default value as well. - SET_FLAGS_DEFAULT -}; - -// Options that control ParseFrom: Source of a value. -enum ValueSource { - // Flag is being set by value specified on a command line. - kCommandLine, - // Flag is being set by value specified in the code. - kProgrammaticChange, -}; - -// Handle to FlagState objects. Specific flag state objects will restore state -// of a flag produced this flag state from method CommandLineFlag::SaveState(). -class FlagStateInterface { - public: - virtual ~FlagStateInterface(); - - // Restores the flag originated this object to the saved state. - virtual void Restore() const = 0; -}; - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_INTERNAL_COMMANDLINEFLAG_H_ diff --git a/third_party/abseil_cpp/absl/flags/internal/flag.cc b/third_party/abseil_cpp/absl/flags/internal/flag.cc deleted file mode 100644 index 1502e7f11d36..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/flag.cc +++ /dev/null @@ -1,568 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/internal/flag.h" - -#include <assert.h> -#include <stddef.h> -#include <stdint.h> -#include <string.h> - -#include <array> -#include <atomic> -#include <memory> -#include <new> -#include <string> -#include <typeinfo> - -#include "absl/base/call_once.h" -#include "absl/base/casts.h" -#include "absl/base/config.h" -#include "absl/base/optimization.h" -#include "absl/flags/config.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/flags/usage_config.h" -#include "absl/memory/memory.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/string_view.h" -#include "absl/synchronization/mutex.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// The help message indicating that the commandline flag has been -// 'stripped'. It will not show up when doing "-help" and its -// variants. The flag is stripped if ABSL_FLAGS_STRIP_HELP is set to 1 -// before including absl/flags/flag.h -const char kStrippedFlagHelp[] = "\001\002\003\004 (unknown) \004\003\002\001"; - -namespace { - -// Currently we only validate flag values for user-defined flag types. -bool ShouldValidateFlagValue(FlagFastTypeId flag_type_id) { -#define DONT_VALIDATE(T, _) \ - if (flag_type_id == base_internal::FastTypeId<T>()) return false; - ABSL_FLAGS_INTERNAL_SUPPORTED_TYPES(DONT_VALIDATE) -#undef DONT_VALIDATE - - return true; -} - -// RAII helper used to temporarily unlock and relock `absl::Mutex`. -// This is used when we need to ensure that locks are released while -// invoking user supplied callbacks and then reacquired, since callbacks may -// need to acquire these locks themselves. -class MutexRelock { - public: - explicit MutexRelock(absl::Mutex& mu) : mu_(mu) { mu_.Unlock(); } - ~MutexRelock() { mu_.Lock(); } - - MutexRelock(const MutexRelock&) = delete; - MutexRelock& operator=(const MutexRelock&) = delete; - - private: - absl::Mutex& mu_; -}; - -} // namespace - -/////////////////////////////////////////////////////////////////////////////// -// Persistent state of the flag data. - -class FlagImpl; - -class FlagState : public flags_internal::FlagStateInterface { - public: - template <typename V> - FlagState(FlagImpl& flag_impl, const V& v, bool modified, - bool on_command_line, int64_t counter) - : flag_impl_(flag_impl), - value_(v), - modified_(modified), - on_command_line_(on_command_line), - counter_(counter) {} - - ~FlagState() override { - if (flag_impl_.ValueStorageKind() != FlagValueStorageKind::kAlignedBuffer) - return; - flags_internal::Delete(flag_impl_.op_, value_.heap_allocated); - } - - private: - friend class FlagImpl; - - // Restores the flag to the saved state. - void Restore() const override { - if (!flag_impl_.RestoreState(*this)) return; - - ABSL_INTERNAL_LOG(INFO, - absl::StrCat("Restore saved value of ", flag_impl_.Name(), - " to: ", flag_impl_.CurrentValue())); - } - - // Flag and saved flag data. - FlagImpl& flag_impl_; - union SavedValue { - explicit SavedValue(void* v) : heap_allocated(v) {} - explicit SavedValue(int64_t v) : one_word(v) {} - explicit SavedValue(flags_internal::AlignedTwoWords v) : two_words(v) {} - - void* heap_allocated; - int64_t one_word; - flags_internal::AlignedTwoWords two_words; - } value_; - bool modified_; - bool on_command_line_; - int64_t counter_; -}; - -/////////////////////////////////////////////////////////////////////////////// -// Flag implementation, which does not depend on flag value type. - -DynValueDeleter::DynValueDeleter(FlagOpFn op_arg) : op(op_arg) {} - -void DynValueDeleter::operator()(void* ptr) const { - if (op == nullptr) return; - - Delete(op, ptr); -} - -void FlagImpl::Init() { - new (&data_guard_) absl::Mutex; - - auto def_kind = static_cast<FlagDefaultKind>(def_kind_); - - switch (ValueStorageKind()) { - case FlagValueStorageKind::kAlignedBuffer: - // For this storage kind the default_value_ always points to gen_func - // during initialization. - assert(def_kind == FlagDefaultKind::kGenFunc); - (*default_value_.gen_func)(AlignedBufferValue()); - break; - case FlagValueStorageKind::kOneWordAtomic: { - alignas(int64_t) std::array<char, sizeof(int64_t)> buf{}; - if (def_kind == FlagDefaultKind::kGenFunc) { - (*default_value_.gen_func)(buf.data()); - } else { - assert(def_kind != FlagDefaultKind::kDynamicValue); - std::memcpy(buf.data(), &default_value_, Sizeof(op_)); - } - OneWordValue().store(absl::bit_cast<int64_t>(buf), - std::memory_order_release); - break; - } - case FlagValueStorageKind::kTwoWordsAtomic: { - // For this storage kind the default_value_ always points to gen_func - // during initialization. - assert(def_kind == FlagDefaultKind::kGenFunc); - alignas(AlignedTwoWords) std::array<char, sizeof(AlignedTwoWords)> buf{}; - (*default_value_.gen_func)(buf.data()); - auto atomic_value = absl::bit_cast<AlignedTwoWords>(buf); - TwoWordsValue().store(atomic_value, std::memory_order_release); - break; - } - } -} - -absl::Mutex* FlagImpl::DataGuard() const { - absl::call_once(const_cast<FlagImpl*>(this)->init_control_, &FlagImpl::Init, - const_cast<FlagImpl*>(this)); - - // data_guard_ is initialized inside Init. - return reinterpret_cast<absl::Mutex*>(&data_guard_); -} - -void FlagImpl::AssertValidType(FlagFastTypeId rhs_type_id, - const std::type_info* (*gen_rtti)()) const { - FlagFastTypeId lhs_type_id = flags_internal::FastTypeId(op_); - - // `rhs_type_id` is the fast type id corresponding to the declaration - // visibile at the call site. `lhs_type_id` is the fast type id - // corresponding to the type specified in flag definition. They must match - // for this operation to be well-defined. - if (ABSL_PREDICT_TRUE(lhs_type_id == rhs_type_id)) return; - - const std::type_info* lhs_runtime_type_id = - flags_internal::RuntimeTypeId(op_); - const std::type_info* rhs_runtime_type_id = (*gen_rtti)(); - - if (lhs_runtime_type_id == rhs_runtime_type_id) return; - -#if defined(ABSL_FLAGS_INTERNAL_HAS_RTTI) - if (*lhs_runtime_type_id == *rhs_runtime_type_id) return; -#endif - - ABSL_INTERNAL_LOG( - FATAL, absl::StrCat("Flag '", Name(), - "' is defined as one type and declared as another")); -} - -std::unique_ptr<void, DynValueDeleter> FlagImpl::MakeInitValue() const { - void* res = nullptr; - switch (DefaultKind()) { - case FlagDefaultKind::kDynamicValue: - res = flags_internal::Clone(op_, default_value_.dynamic_value); - break; - case FlagDefaultKind::kGenFunc: - res = flags_internal::Alloc(op_); - (*default_value_.gen_func)(res); - break; - default: - res = flags_internal::Clone(op_, &default_value_); - break; - } - return {res, DynValueDeleter{op_}}; -} - -void FlagImpl::StoreValue(const void* src) { - switch (ValueStorageKind()) { - case FlagValueStorageKind::kAlignedBuffer: - Copy(op_, src, AlignedBufferValue()); - break; - case FlagValueStorageKind::kOneWordAtomic: { - int64_t one_word_val = 0; - std::memcpy(&one_word_val, src, Sizeof(op_)); - OneWordValue().store(one_word_val, std::memory_order_release); - break; - } - case FlagValueStorageKind::kTwoWordsAtomic: { - AlignedTwoWords two_words_val{0, 0}; - std::memcpy(&two_words_val, src, Sizeof(op_)); - TwoWordsValue().store(two_words_val, std::memory_order_release); - break; - } - } - - modified_ = true; - ++counter_; - InvokeCallback(); -} - -absl::string_view FlagImpl::Name() const { return name_; } - -std::string FlagImpl::Filename() const { - return flags_internal::GetUsageConfig().normalize_filename(filename_); -} - -std::string FlagImpl::Help() const { - return HelpSourceKind() == FlagHelpKind::kLiteral ? help_.literal - : help_.gen_func(); -} - -FlagFastTypeId FlagImpl::TypeId() const { - return flags_internal::FastTypeId(op_); -} - -bool FlagImpl::IsSpecifiedOnCommandLine() const { - absl::MutexLock l(DataGuard()); - return on_command_line_; -} - -std::string FlagImpl::DefaultValue() const { - absl::MutexLock l(DataGuard()); - - auto obj = MakeInitValue(); - return flags_internal::Unparse(op_, obj.get()); -} - -std::string FlagImpl::CurrentValue() const { - auto* guard = DataGuard(); // Make sure flag initialized - switch (ValueStorageKind()) { - case FlagValueStorageKind::kAlignedBuffer: { - absl::MutexLock l(guard); - return flags_internal::Unparse(op_, AlignedBufferValue()); - } - case FlagValueStorageKind::kOneWordAtomic: { - const auto one_word_val = - absl::bit_cast<std::array<char, sizeof(int64_t)>>( - OneWordValue().load(std::memory_order_acquire)); - return flags_internal::Unparse(op_, one_word_val.data()); - } - case FlagValueStorageKind::kTwoWordsAtomic: { - const auto two_words_val = - absl::bit_cast<std::array<char, sizeof(AlignedTwoWords)>>( - TwoWordsValue().load(std::memory_order_acquire)); - return flags_internal::Unparse(op_, two_words_val.data()); - } - } - - return ""; -} - -void FlagImpl::SetCallback(const FlagCallbackFunc mutation_callback) { - absl::MutexLock l(DataGuard()); - - if (callback_ == nullptr) { - callback_ = new FlagCallback; - } - callback_->func = mutation_callback; - - InvokeCallback(); -} - -void FlagImpl::InvokeCallback() const { - if (!callback_) return; - - // Make a copy of the C-style function pointer that we are about to invoke - // before we release the lock guarding it. - FlagCallbackFunc cb = callback_->func; - - // If the flag has a mutation callback this function invokes it. While the - // callback is being invoked the primary flag's mutex is unlocked and it is - // re-locked back after call to callback is completed. Callback invocation is - // guarded by flag's secondary mutex instead which prevents concurrent - // callback invocation. Note that it is possible for other thread to grab the - // primary lock and update flag's value at any time during the callback - // invocation. This is by design. Callback can get a value of the flag if - // necessary, but it might be different from the value initiated the callback - // and it also can be different by the time the callback invocation is - // completed. Requires that *primary_lock be held in exclusive mode; it may be - // released and reacquired by the implementation. - MutexRelock relock(*DataGuard()); - absl::MutexLock lock(&callback_->guard); - cb(); -} - -std::unique_ptr<FlagStateInterface> FlagImpl::SaveState() { - absl::MutexLock l(DataGuard()); - - bool modified = modified_; - bool on_command_line = on_command_line_; - switch (ValueStorageKind()) { - case FlagValueStorageKind::kAlignedBuffer: { - return absl::make_unique<FlagState>( - *this, flags_internal::Clone(op_, AlignedBufferValue()), modified, - on_command_line, counter_); - } - case FlagValueStorageKind::kOneWordAtomic: { - return absl::make_unique<FlagState>( - *this, OneWordValue().load(std::memory_order_acquire), modified, - on_command_line, counter_); - } - case FlagValueStorageKind::kTwoWordsAtomic: { - return absl::make_unique<FlagState>( - *this, TwoWordsValue().load(std::memory_order_acquire), modified, - on_command_line, counter_); - } - } - return nullptr; -} - -bool FlagImpl::RestoreState(const FlagState& flag_state) { - absl::MutexLock l(DataGuard()); - - if (flag_state.counter_ == counter_) { - return false; - } - - switch (ValueStorageKind()) { - case FlagValueStorageKind::kAlignedBuffer: - StoreValue(flag_state.value_.heap_allocated); - break; - case FlagValueStorageKind::kOneWordAtomic: - StoreValue(&flag_state.value_.one_word); - break; - case FlagValueStorageKind::kTwoWordsAtomic: - StoreValue(&flag_state.value_.two_words); - break; - } - - modified_ = flag_state.modified_; - on_command_line_ = flag_state.on_command_line_; - - return true; -} - -template <typename StorageT> -StorageT* FlagImpl::OffsetValue() const { - char* p = reinterpret_cast<char*>(const_cast<FlagImpl*>(this)); - // The offset is deduced via Flag value type specific op_. - size_t offset = flags_internal::ValueOffset(op_); - - return reinterpret_cast<StorageT*>(p + offset); -} - -void* FlagImpl::AlignedBufferValue() const { - assert(ValueStorageKind() == FlagValueStorageKind::kAlignedBuffer); - return OffsetValue<void>(); -} - -std::atomic<int64_t>& FlagImpl::OneWordValue() const { - assert(ValueStorageKind() == FlagValueStorageKind::kOneWordAtomic); - return OffsetValue<FlagOneWordValue>()->value; -} - -std::atomic<AlignedTwoWords>& FlagImpl::TwoWordsValue() const { - assert(ValueStorageKind() == FlagValueStorageKind::kTwoWordsAtomic); - return OffsetValue<FlagTwoWordsValue>()->value; -} - -// Attempts to parse supplied `value` string using parsing routine in the `flag` -// argument. If parsing successful, this function replaces the dst with newly -// parsed value. In case if any error is encountered in either step, the error -// message is stored in 'err' -std::unique_ptr<void, DynValueDeleter> FlagImpl::TryParse( - absl::string_view value, std::string& err) const { - std::unique_ptr<void, DynValueDeleter> tentative_value = MakeInitValue(); - - std::string parse_err; - if (!flags_internal::Parse(op_, value, tentative_value.get(), &parse_err)) { - absl::string_view err_sep = parse_err.empty() ? "" : "; "; - err = absl::StrCat("Illegal value '", value, "' specified for flag '", - Name(), "'", err_sep, parse_err); - return nullptr; - } - - return tentative_value; -} - -void FlagImpl::Read(void* dst) const { - auto* guard = DataGuard(); // Make sure flag initialized - switch (ValueStorageKind()) { - case FlagValueStorageKind::kAlignedBuffer: { - absl::MutexLock l(guard); - flags_internal::CopyConstruct(op_, AlignedBufferValue(), dst); - break; - } - case FlagValueStorageKind::kOneWordAtomic: { - const int64_t one_word_val = - OneWordValue().load(std::memory_order_acquire); - std::memcpy(dst, &one_word_val, Sizeof(op_)); - break; - } - case FlagValueStorageKind::kTwoWordsAtomic: { - const AlignedTwoWords two_words_val = - TwoWordsValue().load(std::memory_order_acquire); - std::memcpy(dst, &two_words_val, Sizeof(op_)); - break; - } - } -} - -void FlagImpl::Write(const void* src) { - absl::MutexLock l(DataGuard()); - - if (ShouldValidateFlagValue(flags_internal::FastTypeId(op_))) { - std::unique_ptr<void, DynValueDeleter> obj{flags_internal::Clone(op_, src), - DynValueDeleter{op_}}; - std::string ignored_error; - std::string src_as_str = flags_internal::Unparse(op_, src); - if (!flags_internal::Parse(op_, src_as_str, obj.get(), &ignored_error)) { - ABSL_INTERNAL_LOG(ERROR, absl::StrCat("Attempt to set flag '", Name(), - "' to invalid value ", src_as_str)); - } - } - - StoreValue(src); -} - -// Sets the value of the flag based on specified string `value`. If the flag -// was successfully set to new value, it returns true. Otherwise, sets `err` -// to indicate the error, leaves the flag unchanged, and returns false. There -// are three ways to set the flag's value: -// * Update the current flag value -// * Update the flag's default value -// * Update the current flag value if it was never set before -// The mode is selected based on 'set_mode' parameter. -bool FlagImpl::ParseFrom(absl::string_view value, FlagSettingMode set_mode, - ValueSource source, std::string& err) { - absl::MutexLock l(DataGuard()); - - switch (set_mode) { - case SET_FLAGS_VALUE: { - // set or modify the flag's value - auto tentative_value = TryParse(value, err); - if (!tentative_value) return false; - - StoreValue(tentative_value.get()); - - if (source == kCommandLine) { - on_command_line_ = true; - } - break; - } - case SET_FLAG_IF_DEFAULT: { - // set the flag's value, but only if it hasn't been set by someone else - if (modified_) { - // TODO(rogeeff): review and fix this semantic. Currently we do not fail - // in this case if flag is modified. This is misleading since the flag's - // value is not updated even though we return true. - // *err = absl::StrCat(Name(), " is already set to ", - // CurrentValue(), "\n"); - // return false; - return true; - } - auto tentative_value = TryParse(value, err); - if (!tentative_value) return false; - - StoreValue(tentative_value.get()); - break; - } - case SET_FLAGS_DEFAULT: { - auto tentative_value = TryParse(value, err); - if (!tentative_value) return false; - - if (DefaultKind() == FlagDefaultKind::kDynamicValue) { - void* old_value = default_value_.dynamic_value; - default_value_.dynamic_value = tentative_value.release(); - tentative_value.reset(old_value); - } else { - default_value_.dynamic_value = tentative_value.release(); - def_kind_ = static_cast<uint8_t>(FlagDefaultKind::kDynamicValue); - } - - if (!modified_) { - // Need to set both default value *and* current, in this case. - StoreValue(default_value_.dynamic_value); - modified_ = false; - } - break; - } - } - - return true; -} - -void FlagImpl::CheckDefaultValueParsingRoundtrip() const { - std::string v = DefaultValue(); - - absl::MutexLock lock(DataGuard()); - - auto dst = MakeInitValue(); - std::string error; - if (!flags_internal::Parse(op_, v, dst.get(), &error)) { - ABSL_INTERNAL_LOG( - FATAL, - absl::StrCat("Flag ", Name(), " (from ", Filename(), - "): string form of default value '", v, - "' could not be parsed; error=", error)); - } - - // We do not compare dst to def since parsing/unparsing may make - // small changes, e.g., precision loss for floating point types. -} - -bool FlagImpl::ValidateInputValue(absl::string_view value) const { - absl::MutexLock l(DataGuard()); - - auto obj = MakeInitValue(); - std::string ignored_error; - return flags_internal::Parse(op_, value, obj.get(), &ignored_error); -} - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/internal/flag.h b/third_party/abseil_cpp/absl/flags/internal/flag.h deleted file mode 100644 index 370d8a02ef04..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/flag.h +++ /dev/null @@ -1,775 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_INTERNAL_FLAG_H_ -#define ABSL_FLAGS_INTERNAL_FLAG_H_ - -#include <stddef.h> -#include <stdint.h> - -#include <atomic> -#include <cstring> -#include <memory> -#include <new> -#include <string> -#include <type_traits> -#include <typeinfo> - -#include "absl/base/attributes.h" -#include "absl/base/call_once.h" -#include "absl/base/config.h" -#include "absl/base/optimization.h" -#include "absl/base/thread_annotations.h" -#include "absl/flags/commandlineflag.h" -#include "absl/flags/config.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/flags/internal/registry.h" -#include "absl/flags/marshalling.h" -#include "absl/meta/type_traits.h" -#include "absl/strings/string_view.h" -#include "absl/synchronization/mutex.h" -#include "absl/utility/utility.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN - -/////////////////////////////////////////////////////////////////////////////// -// Forward declaration of absl::Flag<T> public API. -namespace flags_internal { -template <typename T> -class Flag; -} // namespace flags_internal - -#if defined(_MSC_VER) && !defined(__clang__) -template <typename T> -class Flag; -#else -template <typename T> -using Flag = flags_internal::Flag<T>; -#endif - -template <typename T> -ABSL_MUST_USE_RESULT T GetFlag(const absl::Flag<T>& flag); - -template <typename T> -void SetFlag(absl::Flag<T>* flag, const T& v); - -template <typename T, typename V> -void SetFlag(absl::Flag<T>* flag, const V& v); - -template <typename U> -const CommandLineFlag& GetFlagReflectionHandle(const absl::Flag<U>& f); - -/////////////////////////////////////////////////////////////////////////////// -// Flag value type operations, eg., parsing, copying, etc. are provided -// by function specific to that type with a signature matching FlagOpFn. - -namespace flags_internal { - -enum class FlagOp { - kAlloc, - kDelete, - kCopy, - kCopyConstruct, - kSizeof, - kFastTypeId, - kRuntimeTypeId, - kParse, - kUnparse, - kValueOffset, -}; -using FlagOpFn = void* (*)(FlagOp, const void*, void*, void*); - -// Forward declaration for Flag value specific operations. -template <typename T> -void* FlagOps(FlagOp op, const void* v1, void* v2, void* v3); - -// Allocate aligned memory for a flag value. -inline void* Alloc(FlagOpFn op) { - return op(FlagOp::kAlloc, nullptr, nullptr, nullptr); -} -// Deletes memory interpreting obj as flag value type pointer. -inline void Delete(FlagOpFn op, void* obj) { - op(FlagOp::kDelete, nullptr, obj, nullptr); -} -// Copies src to dst interpreting as flag value type pointers. -inline void Copy(FlagOpFn op, const void* src, void* dst) { - op(FlagOp::kCopy, src, dst, nullptr); -} -// Construct a copy of flag value in a location pointed by dst -// based on src - pointer to the flag's value. -inline void CopyConstruct(FlagOpFn op, const void* src, void* dst) { - op(FlagOp::kCopyConstruct, src, dst, nullptr); -} -// Makes a copy of flag value pointed by obj. -inline void* Clone(FlagOpFn op, const void* obj) { - void* res = flags_internal::Alloc(op); - flags_internal::CopyConstruct(op, obj, res); - return res; -} -// Returns true if parsing of input text is successfull. -inline bool Parse(FlagOpFn op, absl::string_view text, void* dst, - std::string* error) { - return op(FlagOp::kParse, &text, dst, error) != nullptr; -} -// Returns string representing supplied value. -inline std::string Unparse(FlagOpFn op, const void* val) { - std::string result; - op(FlagOp::kUnparse, val, &result, nullptr); - return result; -} -// Returns size of flag value type. -inline size_t Sizeof(FlagOpFn op) { - // This sequence of casts reverses the sequence from - // `flags_internal::FlagOps()` - return static_cast<size_t>(reinterpret_cast<intptr_t>( - op(FlagOp::kSizeof, nullptr, nullptr, nullptr))); -} -// Returns fast type id coresponding to the value type. -inline FlagFastTypeId FastTypeId(FlagOpFn op) { - return reinterpret_cast<FlagFastTypeId>( - op(FlagOp::kFastTypeId, nullptr, nullptr, nullptr)); -} -// Returns fast type id coresponding to the value type. -inline const std::type_info* RuntimeTypeId(FlagOpFn op) { - return reinterpret_cast<const std::type_info*>( - op(FlagOp::kRuntimeTypeId, nullptr, nullptr, nullptr)); -} -// Returns offset of the field value_ from the field impl_ inside of -// absl::Flag<T> data. Given FlagImpl pointer p you can get the -// location of the corresponding value as: -// reinterpret_cast<char*>(p) + ValueOffset(). -inline ptrdiff_t ValueOffset(FlagOpFn op) { - // This sequence of casts reverses the sequence from - // `flags_internal::FlagOps()` - return static_cast<ptrdiff_t>(reinterpret_cast<intptr_t>( - op(FlagOp::kValueOffset, nullptr, nullptr, nullptr))); -} - -// Returns an address of RTTI's typeid(T). -template <typename T> -inline const std::type_info* GenRuntimeTypeId() { -#if defined(ABSL_FLAGS_INTERNAL_HAS_RTTI) - return &typeid(T); -#else - return nullptr; -#endif -} - -/////////////////////////////////////////////////////////////////////////////// -// Flag help auxiliary structs. - -// This is help argument for absl::Flag encapsulating the string literal pointer -// or pointer to function generating it as well as enum descriminating two -// cases. -using HelpGenFunc = std::string (*)(); - -template <size_t N> -struct FixedCharArray { - char value[N]; - - template <size_t... I> - static constexpr FixedCharArray<N> FromLiteralString( - absl::string_view str, absl::index_sequence<I...>) { - return (void)str, FixedCharArray<N>({{str[I]..., '\0'}}); - } -}; - -template <typename Gen, size_t N = Gen::Value().size()> -constexpr FixedCharArray<N + 1> HelpStringAsArray(int) { - return FixedCharArray<N + 1>::FromLiteralString( - Gen::Value(), absl::make_index_sequence<N>{}); -} - -template <typename Gen> -constexpr std::false_type HelpStringAsArray(char) { - return std::false_type{}; -} - -union FlagHelpMsg { - constexpr explicit FlagHelpMsg(const char* help_msg) : literal(help_msg) {} - constexpr explicit FlagHelpMsg(HelpGenFunc help_gen) : gen_func(help_gen) {} - - const char* literal; - HelpGenFunc gen_func; -}; - -enum class FlagHelpKind : uint8_t { kLiteral = 0, kGenFunc = 1 }; - -struct FlagHelpArg { - FlagHelpMsg source; - FlagHelpKind kind; -}; - -extern const char kStrippedFlagHelp[]; - -// These two HelpArg overloads allows us to select at compile time one of two -// way to pass Help argument to absl::Flag. We'll be passing -// AbslFlagHelpGenFor##name as Gen and integer 0 as a single argument to prefer -// first overload if possible. If help message is evaluatable on constexpr -// context We'll be able to make FixedCharArray out of it and we'll choose first -// overload. In this case the help message expression is immediately evaluated -// and is used to construct the absl::Flag. No additionl code is generated by -// ABSL_FLAG Otherwise SFINAE kicks in and first overload is dropped from the -// consideration, in which case the second overload will be used. The second -// overload does not attempt to evaluate the help message expression -// immediately and instead delays the evaluation by returing the function -// pointer (&T::NonConst) genering the help message when necessary. This is -// evaluatable in constexpr context, but the cost is an extra function being -// generated in the ABSL_FLAG code. -template <typename Gen, size_t N> -constexpr FlagHelpArg HelpArg(const FixedCharArray<N>& value) { - return {FlagHelpMsg(value.value), FlagHelpKind::kLiteral}; -} - -template <typename Gen> -constexpr FlagHelpArg HelpArg(std::false_type) { - return {FlagHelpMsg(&Gen::NonConst), FlagHelpKind::kGenFunc}; -} - -/////////////////////////////////////////////////////////////////////////////// -// Flag default value auxiliary structs. - -// Signature for the function generating the initial flag value (usually -// based on default value supplied in flag's definition) -using FlagDfltGenFunc = void (*)(void*); - -union FlagDefaultSrc { - constexpr explicit FlagDefaultSrc(FlagDfltGenFunc gen_func_arg) - : gen_func(gen_func_arg) {} - -#define ABSL_FLAGS_INTERNAL_DFLT_FOR_TYPE(T, name) \ - T name##_value; \ - constexpr explicit FlagDefaultSrc(T value) : name##_value(value) {} // NOLINT - ABSL_FLAGS_INTERNAL_BUILTIN_TYPES(ABSL_FLAGS_INTERNAL_DFLT_FOR_TYPE) -#undef ABSL_FLAGS_INTERNAL_DFLT_FOR_TYPE - - void* dynamic_value; - FlagDfltGenFunc gen_func; -}; - -enum class FlagDefaultKind : uint8_t { - kDynamicValue = 0, - kGenFunc = 1, - kOneWord = 2 // for default values UP to one word in size -}; - -struct FlagDefaultArg { - FlagDefaultSrc source; - FlagDefaultKind kind; -}; - -// This struct and corresponding overload to InitDefaultValue are used to -// facilitate usage of {} as default value in ABSL_FLAG macro. -// TODO(rogeeff): Fix handling types with explicit constructors. -struct EmptyBraces {}; - -template <typename T> -constexpr T InitDefaultValue(T t) { - return t; -} - -template <typename T> -constexpr T InitDefaultValue(EmptyBraces) { - return T{}; -} - -template <typename ValueT, typename GenT, - typename std::enable_if<std::is_integral<ValueT>::value, int>::type = - (GenT{}, 0)> -constexpr FlagDefaultArg DefaultArg(int) { - return {FlagDefaultSrc(GenT{}.value), FlagDefaultKind::kOneWord}; -} - -template <typename ValueT, typename GenT> -constexpr FlagDefaultArg DefaultArg(char) { - return {FlagDefaultSrc(&GenT::Gen), FlagDefaultKind::kGenFunc}; -} - -/////////////////////////////////////////////////////////////////////////////// -// Flag current value auxiliary structs. - -constexpr int64_t UninitializedFlagValue() { return 0xababababababababll; } - -template <typename T> -using FlagUseOneWordStorage = std::integral_constant< - bool, absl::type_traits_internal::is_trivially_copyable<T>::value && - (sizeof(T) <= 8)>; - -#if defined(ABSL_FLAGS_INTERNAL_ATOMIC_DOUBLE_WORD) -// Clang does not always produce cmpxchg16b instruction when alignment of a 16 -// bytes type is not 16. -struct alignas(16) AlignedTwoWords { - int64_t first; - int64_t second; - - bool IsInitialized() const { - return first != flags_internal::UninitializedFlagValue(); - } -}; - -template <typename T> -using FlagUseTwoWordsStorage = std::integral_constant< - bool, absl::type_traits_internal::is_trivially_copyable<T>::value && - (sizeof(T) > 8) && (sizeof(T) <= 16)>; -#else -// This is actually unused and only here to avoid ifdefs in other palces. -struct AlignedTwoWords { - constexpr AlignedTwoWords() noexcept : dummy() {} - constexpr AlignedTwoWords(int64_t, int64_t) noexcept : dummy() {} - char dummy; - - bool IsInitialized() const { - std::abort(); - return true; - } -}; - -// This trait should be type dependent, otherwise SFINAE below will fail -template <typename T> -using FlagUseTwoWordsStorage = - std::integral_constant<bool, sizeof(T) != sizeof(T)>; -#endif - -template <typename T> -using FlagUseBufferStorage = - std::integral_constant<bool, !FlagUseOneWordStorage<T>::value && - !FlagUseTwoWordsStorage<T>::value>; - -enum class FlagValueStorageKind : uint8_t { - kAlignedBuffer = 0, - kOneWordAtomic = 1, - kTwoWordsAtomic = 2 -}; - -template <typename T> -static constexpr FlagValueStorageKind StorageKind() { - return FlagUseBufferStorage<T>::value - ? FlagValueStorageKind::kAlignedBuffer - : FlagUseOneWordStorage<T>::value - ? FlagValueStorageKind::kOneWordAtomic - : FlagValueStorageKind::kTwoWordsAtomic; -} - -struct FlagOneWordValue { - constexpr FlagOneWordValue() : value(UninitializedFlagValue()) {} - - std::atomic<int64_t> value; -}; - -struct FlagTwoWordsValue { - constexpr FlagTwoWordsValue() - : value(AlignedTwoWords{UninitializedFlagValue(), 0}) {} - - std::atomic<AlignedTwoWords> value; -}; - -template <typename T, - FlagValueStorageKind Kind = flags_internal::StorageKind<T>()> -struct FlagValue; - -template <typename T> -struct FlagValue<T, FlagValueStorageKind::kAlignedBuffer> { - bool Get(T&) const { return false; } - - alignas(T) char value[sizeof(T)]; -}; - -template <typename T> -struct FlagValue<T, FlagValueStorageKind::kOneWordAtomic> : FlagOneWordValue { - bool Get(T& dst) const { - int64_t one_word_val = value.load(std::memory_order_acquire); - if (ABSL_PREDICT_FALSE(one_word_val == UninitializedFlagValue())) { - return false; - } - std::memcpy(&dst, static_cast<const void*>(&one_word_val), sizeof(T)); - return true; - } -}; - -template <typename T> -struct FlagValue<T, FlagValueStorageKind::kTwoWordsAtomic> : FlagTwoWordsValue { - bool Get(T& dst) const { - AlignedTwoWords two_words_val = value.load(std::memory_order_acquire); - if (ABSL_PREDICT_FALSE(!two_words_val.IsInitialized())) { - return false; - } - std::memcpy(&dst, static_cast<const void*>(&two_words_val), sizeof(T)); - return true; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// Flag callback auxiliary structs. - -// Signature for the mutation callback used by watched Flags -// The callback is noexcept. -// TODO(rogeeff): add noexcept after C++17 support is added. -using FlagCallbackFunc = void (*)(); - -struct FlagCallback { - FlagCallbackFunc func; - absl::Mutex guard; // Guard for concurrent callback invocations. -}; - -/////////////////////////////////////////////////////////////////////////////// -// Flag implementation, which does not depend on flag value type. -// The class encapsulates the Flag's data and access to it. - -struct DynValueDeleter { - explicit DynValueDeleter(FlagOpFn op_arg = nullptr); - void operator()(void* ptr) const; - - FlagOpFn op; -}; - -class FlagState; - -class FlagImpl final : public CommandLineFlag { - public: - constexpr FlagImpl(const char* name, const char* filename, FlagOpFn op, - FlagHelpArg help, FlagValueStorageKind value_kind, - FlagDefaultArg default_arg) - : name_(name), - filename_(filename), - op_(op), - help_(help.source), - help_source_kind_(static_cast<uint8_t>(help.kind)), - value_storage_kind_(static_cast<uint8_t>(value_kind)), - def_kind_(static_cast<uint8_t>(default_arg.kind)), - modified_(false), - on_command_line_(false), - counter_(0), - callback_(nullptr), - default_value_(default_arg.source), - data_guard_{} {} - - // Constant access methods - void Read(void* dst) const override ABSL_LOCKS_EXCLUDED(*DataGuard()); - - // Mutating access methods - void Write(const void* src) ABSL_LOCKS_EXCLUDED(*DataGuard()); - - // Interfaces to operate on callbacks. - void SetCallback(const FlagCallbackFunc mutation_callback) - ABSL_LOCKS_EXCLUDED(*DataGuard()); - void InvokeCallback() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); - - // Used in read/write operations to validate source/target has correct type. - // For example if flag is declared as absl::Flag<int> FLAGS_foo, a call to - // absl::GetFlag(FLAGS_foo) validates that the type of FLAGS_foo is indeed - // int. To do that we pass the "assumed" type id (which is deduced from type - // int) as an argument `type_id`, which is in turn is validated against the - // type id stored in flag object by flag definition statement. - void AssertValidType(FlagFastTypeId type_id, - const std::type_info* (*gen_rtti)()) const; - - private: - template <typename T> - friend class Flag; - friend class FlagState; - - // Ensures that `data_guard_` is initialized and returns it. - absl::Mutex* DataGuard() const - ABSL_LOCK_RETURNED(reinterpret_cast<absl::Mutex*>(data_guard_)); - // Returns heap allocated value of type T initialized with default value. - std::unique_ptr<void, DynValueDeleter> MakeInitValue() const - ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); - // Flag initialization called via absl::call_once. - void Init(); - - // Offset value access methods. One per storage kind. These methods to not - // respect const correctness, so be very carefull using them. - - // This is a shared helper routine which encapsulates most of the magic. Since - // it is only used inside the three routines below, which are defined in - // flag.cc, we can define it in that file as well. - template <typename StorageT> - StorageT* OffsetValue() const; - // This is an accessor for a value stored in an aligned buffer storage. - // Returns a mutable pointer to the start of a buffer. - void* AlignedBufferValue() const; - // This is an accessor for a value stored as one word atomic. Returns a - // mutable reference to an atomic value. - std::atomic<int64_t>& OneWordValue() const; - // This is an accessor for a value stored as two words atomic. Returns a - // mutable reference to an atomic value. - std::atomic<AlignedTwoWords>& TwoWordsValue() const; - - // Attempts to parse supplied `value` string. If parsing is successful, - // returns new value. Otherwise returns nullptr. - std::unique_ptr<void, DynValueDeleter> TryParse(absl::string_view value, - std::string& err) const - ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); - // Stores the flag value based on the pointer to the source. - void StoreValue(const void* src) ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()); - - FlagHelpKind HelpSourceKind() const { - return static_cast<FlagHelpKind>(help_source_kind_); - } - FlagValueStorageKind ValueStorageKind() const { - return static_cast<FlagValueStorageKind>(value_storage_kind_); - } - FlagDefaultKind DefaultKind() const - ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()) { - return static_cast<FlagDefaultKind>(def_kind_); - } - - // CommandLineFlag interface implementation - absl::string_view Name() const override; - std::string Filename() const override; - std::string Help() const override; - FlagFastTypeId TypeId() const override; - bool IsSpecifiedOnCommandLine() const override - ABSL_LOCKS_EXCLUDED(*DataGuard()); - std::string DefaultValue() const override ABSL_LOCKS_EXCLUDED(*DataGuard()); - std::string CurrentValue() const override ABSL_LOCKS_EXCLUDED(*DataGuard()); - bool ValidateInputValue(absl::string_view value) const override - ABSL_LOCKS_EXCLUDED(*DataGuard()); - void CheckDefaultValueParsingRoundtrip() const override - ABSL_LOCKS_EXCLUDED(*DataGuard()); - - // Interfaces to save and restore flags to/from persistent state. - // Returns current flag state or nullptr if flag does not support - // saving and restoring a state. - std::unique_ptr<FlagStateInterface> SaveState() override - ABSL_LOCKS_EXCLUDED(*DataGuard()); - - // Restores the flag state to the supplied state object. If there is - // nothing to restore returns false. Otherwise returns true. - bool RestoreState(const FlagState& flag_state) - ABSL_LOCKS_EXCLUDED(*DataGuard()); - - bool ParseFrom(absl::string_view value, FlagSettingMode set_mode, - ValueSource source, std::string& error) override - ABSL_LOCKS_EXCLUDED(*DataGuard()); - - // Immutable flag's state. - - // Flags name passed to ABSL_FLAG as second arg. - const char* const name_; - // The file name where ABSL_FLAG resides. - const char* const filename_; - // Type-specific operations "vtable". - const FlagOpFn op_; - // Help message literal or function to generate it. - const FlagHelpMsg help_; - // Indicates if help message was supplied as literal or generator func. - const uint8_t help_source_kind_ : 1; - // Kind of storage this flag is using for the flag's value. - const uint8_t value_storage_kind_ : 2; - - uint8_t : 0; // The bytes containing the const bitfields must not be - // shared with bytes containing the mutable bitfields. - - // Mutable flag's state (guarded by `data_guard_`). - - // def_kind_ is not guard by DataGuard() since it is accessed in Init without - // locks. - uint8_t def_kind_ : 2; - // Has this flag's value been modified? - bool modified_ : 1 ABSL_GUARDED_BY(*DataGuard()); - // Has this flag been specified on command line. - bool on_command_line_ : 1 ABSL_GUARDED_BY(*DataGuard()); - - // Unique tag for absl::call_once call to initialize this flag. - absl::once_flag init_control_; - - // Mutation counter - int64_t counter_ ABSL_GUARDED_BY(*DataGuard()); - // Optional flag's callback and absl::Mutex to guard the invocations. - 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_value_; - - // This is reserved space for an absl::Mutex to guard flag data. It will be - // initialized in FlagImpl::Init via placement new. - // We can't use "absl::Mutex data_guard_", since this class is not literal. - // We do not want to use "absl::Mutex* data_guard_", since this would require - // heap allocation during initialization, which is both slows program startup - // and can fail. Using reserved space + placement new allows us to avoid both - // problems. - alignas(absl::Mutex) mutable char data_guard_[sizeof(absl::Mutex)]; -}; - -/////////////////////////////////////////////////////////////////////////////// -// The Flag object parameterized by the flag's value type. This class implements -// flag reflection handle interface. - -template <typename T> -class Flag { - public: - constexpr Flag(const char* name, const char* filename, FlagHelpArg help, - const FlagDefaultArg default_arg) - : impl_(name, filename, &FlagOps<T>, help, - flags_internal::StorageKind<T>(), default_arg), - value_() {} - - // CommandLineFlag interface - absl::string_view Name() const { return impl_.Name(); } - std::string Filename() const { return impl_.Filename(); } - std::string Help() const { return impl_.Help(); } - // Do not use. To be removed. - bool IsSpecifiedOnCommandLine() const { - return impl_.IsSpecifiedOnCommandLine(); - } - std::string DefaultValue() const { return impl_.DefaultValue(); } - std::string CurrentValue() const { return impl_.CurrentValue(); } - - private: - template <typename, bool> - friend class FlagRegistrar; - friend class FlagImplPeer; - - T Get() const { - // See implementation notes in CommandLineFlag::Get(). - union U { - T value; - U() {} - ~U() { value.~T(); } - }; - U u; - -#if !defined(NDEBUG) - impl_.AssertValidType(base_internal::FastTypeId<T>(), &GenRuntimeTypeId<T>); -#endif - - if (!value_.Get(u.value)) impl_.Read(&u.value); - return std::move(u.value); - } - void Set(const T& v) { - impl_.AssertValidType(base_internal::FastTypeId<T>(), &GenRuntimeTypeId<T>); - impl_.Write(&v); - } - - // Access to the reflection. - const CommandLineFlag& Reflect() const { return impl_; } - - // Flag's data - // The implementation depends on value_ field to be placed exactly after the - // impl_ field, so that impl_ can figure out the offset to the value and - // access it. - FlagImpl impl_; - FlagValue<T> value_; -}; - -/////////////////////////////////////////////////////////////////////////////// -// Trampoline for friend access - -class FlagImplPeer { - public: - template <typename T, typename FlagType> - static T InvokeGet(const FlagType& flag) { - return flag.Get(); - } - template <typename FlagType, typename T> - static void InvokeSet(FlagType& flag, const T& v) { - flag.Set(v); - } - template <typename FlagType> - static const CommandLineFlag& InvokeReflect(const FlagType& f) { - return f.Reflect(); - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// Implementation of Flag value specific operations routine. -template <typename T> -void* FlagOps(FlagOp op, const void* v1, void* v2, void* v3) { - switch (op) { - case FlagOp::kAlloc: { - std::allocator<T> alloc; - return std::allocator_traits<std::allocator<T>>::allocate(alloc, 1); - } - case FlagOp::kDelete: { - T* p = static_cast<T*>(v2); - p->~T(); - std::allocator<T> alloc; - std::allocator_traits<std::allocator<T>>::deallocate(alloc, p, 1); - return nullptr; - } - case FlagOp::kCopy: - *static_cast<T*>(v2) = *static_cast<const T*>(v1); - return nullptr; - case FlagOp::kCopyConstruct: - new (v2) T(*static_cast<const T*>(v1)); - return nullptr; - case FlagOp::kSizeof: - return reinterpret_cast<void*>(static_cast<uintptr_t>(sizeof(T))); - case FlagOp::kFastTypeId: - return const_cast<void*>(base_internal::FastTypeId<T>()); - case FlagOp::kRuntimeTypeId: - return const_cast<std::type_info*>(GenRuntimeTypeId<T>()); - case FlagOp::kParse: { - // Initialize the temporary instance of type T based on current value in - // destination (which is going to be flag's default value). - T temp(*static_cast<T*>(v2)); - if (!absl::ParseFlag<T>(*static_cast<const absl::string_view*>(v1), &temp, - static_cast<std::string*>(v3))) { - return nullptr; - } - *static_cast<T*>(v2) = std::move(temp); - return v2; - } - case FlagOp::kUnparse: - *static_cast<std::string*>(v2) = - absl::UnparseFlag<T>(*static_cast<const T*>(v1)); - return nullptr; - case FlagOp::kValueOffset: { - // Round sizeof(FlagImp) to a multiple of alignof(FlagValue<T>) to get the - // offset of the data. - ptrdiff_t round_to = alignof(FlagValue<T>); - ptrdiff_t offset = - (sizeof(FlagImpl) + round_to - 1) / round_to * round_to; - return reinterpret_cast<void*>(offset); - } - } - return nullptr; -} - -/////////////////////////////////////////////////////////////////////////////// -// This class facilitates Flag object registration and tail expression-based -// flag definition, for example: -// ABSL_FLAG(int, foo, 42, "Foo help").OnUpdate(NotifyFooWatcher); -struct FlagRegistrarEmpty {}; -template <typename T, bool do_register> -class FlagRegistrar { - public: - explicit FlagRegistrar(Flag<T>& flag) : flag_(flag) { - if (do_register) flags_internal::RegisterCommandLineFlag(flag_.impl_); - } - - FlagRegistrar OnUpdate(FlagCallbackFunc cb) && { - flag_.impl_.SetCallback(cb); - return *this; - } - - // Make the registrar "die" gracefully as an empty struct on a line where - // registration happens. Registrar objects are intended to live only as - // temporary. - operator FlagRegistrarEmpty() const { return {}; } // NOLINT - - private: - Flag<T>& flag_; // Flag being registered (not owned). -}; - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_INTERNAL_FLAG_H_ diff --git a/third_party/abseil_cpp/absl/flags/internal/parse.h b/third_party/abseil_cpp/absl/flags/internal/parse.h deleted file mode 100644 index de706c898470..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/parse.h +++ /dev/null @@ -1,59 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_INTERNAL_PARSE_H_ -#define ABSL_FLAGS_INTERNAL_PARSE_H_ - -#include <string> -#include <vector> - -#include "absl/base/config.h" -#include "absl/flags/declare.h" -#include "absl/strings/string_view.h" - -ABSL_DECLARE_FLAG(std::vector<std::string>, flagfile); -ABSL_DECLARE_FLAG(std::vector<std::string>, fromenv); -ABSL_DECLARE_FLAG(std::vector<std::string>, tryfromenv); -ABSL_DECLARE_FLAG(std::vector<std::string>, undefok); - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -enum class ArgvListAction { kRemoveParsedArgs, kKeepParsedArgs }; -enum class UsageFlagsAction { kHandleUsage, kIgnoreUsage }; -enum class OnUndefinedFlag { - kIgnoreUndefined, - kReportUndefined, - kAbortIfUndefined -}; - -std::vector<char*> ParseCommandLineImpl(int argc, char* argv[], - ArgvListAction arg_list_act, - UsageFlagsAction usage_flag_act, - OnUndefinedFlag on_undef_flag); - -// -------------------------------------------------------------------- -// Inspect original command line - -// Returns true if flag with specified name was either present on the original -// command line or specified in flag file present on the original command line. -bool WasPresentOnCommandLine(absl::string_view flag_name); - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_INTERNAL_PARSE_H_ diff --git a/third_party/abseil_cpp/absl/flags/internal/path_util.h b/third_party/abseil_cpp/absl/flags/internal/path_util.h deleted file mode 100644 index a6594d3347e1..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/path_util.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_INTERNAL_PATH_UTIL_H_ -#define ABSL_FLAGS_INTERNAL_PATH_UTIL_H_ - -#include "absl/base/config.h" -#include "absl/strings/string_view.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// A portable interface that returns the basename of the filename passed as an -// argument. It is similar to basename(3) -// <https://linux.die.net/man/3/basename>. -// For example: -// flags_internal::Basename("a/b/prog/file.cc") -// returns "file.cc" -// flags_internal::Basename("file.cc") -// returns "file.cc" -inline absl::string_view Basename(absl::string_view filename) { - auto last_slash_pos = filename.find_last_of("/\\"); - - return last_slash_pos == absl::string_view::npos - ? filename - : filename.substr(last_slash_pos + 1); -} - -// A portable interface that returns the directory name of the filename -// passed as an argument, including the trailing slash. -// Returns the empty string if a slash is not found in the input file name. -// For example: -// flags_internal::Package("a/b/prog/file.cc") -// returns "a/b/prog/" -// flags_internal::Package("file.cc") -// returns "" -inline absl::string_view Package(absl::string_view filename) { - auto last_slash_pos = filename.find_last_of("/\\"); - - return last_slash_pos == absl::string_view::npos - ? absl::string_view() - : filename.substr(0, last_slash_pos + 1); -} - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_INTERNAL_PATH_UTIL_H_ diff --git a/third_party/abseil_cpp/absl/flags/internal/path_util_test.cc b/third_party/abseil_cpp/absl/flags/internal/path_util_test.cc deleted file mode 100644 index 2091373c88ea..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/path_util_test.cc +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/internal/path_util.h" - -#include "gtest/gtest.h" - -namespace { - -namespace flags = absl::flags_internal; - -TEST(FlagsPathUtilTest, TestBasename) { - EXPECT_EQ(flags::Basename(""), ""); - EXPECT_EQ(flags::Basename("a.cc"), "a.cc"); - EXPECT_EQ(flags::Basename("dir/a.cc"), "a.cc"); - EXPECT_EQ(flags::Basename("dir1/dir2/a.cc"), "a.cc"); - EXPECT_EQ(flags::Basename("../dir1/dir2/a.cc"), "a.cc"); - EXPECT_EQ(flags::Basename("/dir1/dir2/a.cc"), "a.cc"); - EXPECT_EQ(flags::Basename("/dir1/dir2/../dir3/a.cc"), "a.cc"); -} - -// -------------------------------------------------------------------- - -TEST(FlagsPathUtilTest, TestPackage) { - EXPECT_EQ(flags::Package(""), ""); - EXPECT_EQ(flags::Package("a.cc"), ""); - EXPECT_EQ(flags::Package("dir/a.cc"), "dir/"); - EXPECT_EQ(flags::Package("dir1/dir2/a.cc"), "dir1/dir2/"); - EXPECT_EQ(flags::Package("../dir1/dir2/a.cc"), "../dir1/dir2/"); - EXPECT_EQ(flags::Package("/dir1/dir2/a.cc"), "/dir1/dir2/"); - EXPECT_EQ(flags::Package("/dir1/dir2/../dir3/a.cc"), "/dir1/dir2/../dir3/"); -} - -} // namespace diff --git a/third_party/abseil_cpp/absl/flags/internal/private_handle_accessor.cc b/third_party/abseil_cpp/absl/flags/internal/private_handle_accessor.cc deleted file mode 100644 index a7eb58b6d45f..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/private_handle_accessor.cc +++ /dev/null @@ -1,65 +0,0 @@ -// -// Copyright 2020 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/internal/private_handle_accessor.h" - -#include <memory> -#include <string> - -#include "absl/base/config.h" -#include "absl/flags/commandlineflag.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/strings/string_view.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -FlagFastTypeId PrivateHandleAccessor::TypeId(const CommandLineFlag& flag) { - return flag.TypeId(); -} - -std::unique_ptr<FlagStateInterface> PrivateHandleAccessor::SaveState( - CommandLineFlag& flag) { - return flag.SaveState(); -} - -bool PrivateHandleAccessor::IsSpecifiedOnCommandLine( - const CommandLineFlag& flag) { - return flag.IsSpecifiedOnCommandLine(); -} - -bool PrivateHandleAccessor::ValidateInputValue(const CommandLineFlag& flag, - absl::string_view value) { - return flag.ValidateInputValue(value); -} - -void PrivateHandleAccessor::CheckDefaultValueParsingRoundtrip( - const CommandLineFlag& flag) { - flag.CheckDefaultValueParsingRoundtrip(); -} - -bool PrivateHandleAccessor::ParseFrom(CommandLineFlag& flag, - absl::string_view value, - flags_internal::FlagSettingMode set_mode, - flags_internal::ValueSource source, - std::string& error) { - return flag.ParseFrom(value, set_mode, source, error); -} - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - diff --git a/third_party/abseil_cpp/absl/flags/internal/private_handle_accessor.h b/third_party/abseil_cpp/absl/flags/internal/private_handle_accessor.h deleted file mode 100644 index c64435cd6199..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/private_handle_accessor.h +++ /dev/null @@ -1,61 +0,0 @@ -// -// Copyright 2020 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_INTERNAL_PRIVATE_HANDLE_ACCESSOR_H_ -#define ABSL_FLAGS_INTERNAL_PRIVATE_HANDLE_ACCESSOR_H_ - -#include <memory> -#include <string> - -#include "absl/base/config.h" -#include "absl/flags/commandlineflag.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/strings/string_view.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// This class serves as a trampoline to access private methods of -// CommandLineFlag. This class is intended for use exclusively internally inside -// of the Abseil Flags implementation. -class PrivateHandleAccessor { - public: - // Access to CommandLineFlag::TypeId. - static FlagFastTypeId TypeId(const CommandLineFlag& flag); - - // Access to CommandLineFlag::SaveState. - static std::unique_ptr<FlagStateInterface> SaveState(CommandLineFlag& flag); - - // Access to CommandLineFlag::IsSpecifiedOnCommandLine. - static bool IsSpecifiedOnCommandLine(const CommandLineFlag& flag); - - // Access to CommandLineFlag::ValidateInputValue. - static bool ValidateInputValue(const CommandLineFlag& flag, - absl::string_view value); - - // Access to CommandLineFlag::CheckDefaultValueParsingRoundtrip. - static void CheckDefaultValueParsingRoundtrip(const CommandLineFlag& flag); - - static bool ParseFrom(CommandLineFlag& flag, absl::string_view value, - flags_internal::FlagSettingMode set_mode, - flags_internal::ValueSource source, std::string& error); -}; - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_INTERNAL_PRIVATE_HANDLE_ACCESSOR_H_ diff --git a/third_party/abseil_cpp/absl/flags/internal/program_name.cc b/third_party/abseil_cpp/absl/flags/internal/program_name.cc deleted file mode 100644 index 51d698da8b31..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/program_name.cc +++ /dev/null @@ -1,60 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/internal/program_name.h" - -#include <string> - -#include "absl/base/attributes.h" -#include "absl/base/config.h" -#include "absl/base/const_init.h" -#include "absl/base/thread_annotations.h" -#include "absl/flags/internal/path_util.h" -#include "absl/strings/string_view.h" -#include "absl/synchronization/mutex.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -ABSL_CONST_INIT static absl::Mutex program_name_guard(absl::kConstInit); -ABSL_CONST_INIT static std::string* program_name - ABSL_GUARDED_BY(program_name_guard) = nullptr; - -std::string ProgramInvocationName() { - absl::MutexLock l(&program_name_guard); - - return program_name ? *program_name : "UNKNOWN"; -} - -std::string ShortProgramInvocationName() { - absl::MutexLock l(&program_name_guard); - - return program_name ? std::string(flags_internal::Basename(*program_name)) - : "UNKNOWN"; -} - -void SetProgramInvocationName(absl::string_view prog_name_str) { - absl::MutexLock l(&program_name_guard); - - if (!program_name) - program_name = new std::string(prog_name_str); - else - program_name->assign(prog_name_str.data(), prog_name_str.size()); -} - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/internal/program_name.h b/third_party/abseil_cpp/absl/flags/internal/program_name.h deleted file mode 100644 index b99b94fe18ab..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/program_name.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_INTERNAL_PROGRAM_NAME_H_ -#define ABSL_FLAGS_INTERNAL_PROGRAM_NAME_H_ - -#include <string> - -#include "absl/base/config.h" -#include "absl/strings/string_view.h" - -// -------------------------------------------------------------------- -// Program name - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// Returns program invocation name or "UNKNOWN" if `SetProgramInvocationName()` -// is never called. At the moment this is always set to argv[0] as part of -// library initialization. -std::string ProgramInvocationName(); - -// Returns base name for program invocation name. For example, if -// ProgramInvocationName() == "a/b/mybinary" -// then -// ShortProgramInvocationName() == "mybinary" -std::string ShortProgramInvocationName(); - -// Sets program invocation name to a new value. Should only be called once -// during program initialization, before any threads are spawned. -void SetProgramInvocationName(absl::string_view prog_name_str); - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_INTERNAL_PROGRAM_NAME_H_ diff --git a/third_party/abseil_cpp/absl/flags/internal/program_name_test.cc b/third_party/abseil_cpp/absl/flags/internal/program_name_test.cc deleted file mode 100644 index aff9f6315e4e..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/program_name_test.cc +++ /dev/null @@ -1,61 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/internal/program_name.h" - -#include <string> - -#include "gtest/gtest.h" -#include "absl/strings/match.h" -#include "absl/strings/string_view.h" - -namespace { - -namespace flags = absl::flags_internal; - -TEST(FlagsPathUtilTest, TestProgamNameInterfaces) { - flags::SetProgramInvocationName("absl/flags/program_name_test"); - std::string program_name = flags::ProgramInvocationName(); - for (char& c : program_name) - if (c == '\\') c = '/'; - -#if !defined(__wasm__) && !defined(__asmjs__) - const std::string expect_name = "absl/flags/program_name_test"; - const std::string expect_basename = "program_name_test"; -#else - // For targets that generate javascript or webassembly the invocation name - // has the special value below. - const std::string expect_name = "this.program"; - const std::string expect_basename = "this.program"; -#endif - - EXPECT_TRUE(absl::EndsWith(program_name, expect_name)) << program_name; - EXPECT_EQ(flags::ShortProgramInvocationName(), expect_basename); - - flags::SetProgramInvocationName("a/my_test"); - - EXPECT_EQ(flags::ProgramInvocationName(), "a/my_test"); - EXPECT_EQ(flags::ShortProgramInvocationName(), "my_test"); - - absl::string_view not_null_terminated("absl/aaa/bbb"); - not_null_terminated = not_null_terminated.substr(1, 10); - - flags::SetProgramInvocationName(not_null_terminated); - - EXPECT_EQ(flags::ProgramInvocationName(), "bsl/aaa/bb"); - EXPECT_EQ(flags::ShortProgramInvocationName(), "bb"); -} - -} // namespace diff --git a/third_party/abseil_cpp/absl/flags/internal/registry.h b/third_party/abseil_cpp/absl/flags/internal/registry.h deleted file mode 100644 index a8d9eb9cb0bb..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/registry.h +++ /dev/null @@ -1,97 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_INTERNAL_REGISTRY_H_ -#define ABSL_FLAGS_INTERNAL_REGISTRY_H_ - -#include <functional> - -#include "absl/base/config.h" -#include "absl/flags/commandlineflag.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/strings/string_view.h" - -// -------------------------------------------------------------------- -// Global flags registry API. - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// Executes specified visitor for each non-retired flag in the registry. While -// callback are executed, the registry is locked and can't be changed. -void ForEachFlag(std::function<void(CommandLineFlag&)> visitor); - -//----------------------------------------------------------------------------- - -bool RegisterCommandLineFlag(CommandLineFlag&); - -void FinalizeRegistry(); - -//----------------------------------------------------------------------------- -// Retired registrations: -// -// Retired flag registrations are treated specially. A 'retired' flag is -// provided only for compatibility with automated invocations that still -// name it. A 'retired' flag: -// - is not bound to a C++ FLAGS_ reference. -// - has a type and a value, but that value is intentionally inaccessible. -// - does not appear in --help messages. -// - is fully supported by _all_ flag parsing routines. -// - consumes args normally, and complains about type mismatches in its -// argument. -// - emits a complaint but does not die (e.g. LOG(ERROR)) if it is -// accessed by name through the flags API for parsing or otherwise. -// -// The registrations for a flag happen in an unspecified order as the -// initializers for the namespace-scope objects of a program are run. -// Any number of weak registrations for a flag can weakly define the flag. -// One non-weak registration will upgrade the flag from weak to non-weak. -// Further weak registrations of a non-weak flag are ignored. -// -// This mechanism is designed to support moving dead flags into a -// 'graveyard' library. An example migration: -// -// 0: Remove references to this FLAGS_flagname in the C++ codebase. -// 1: Register as 'retired' in old_lib. -// 2: Make old_lib depend on graveyard. -// 3: Add a redundant 'retired' registration to graveyard. -// 4: Remove the old_lib 'retired' registration. -// 5: Eventually delete the graveyard registration entirely. -// - -// Retire flag with name "name" and type indicated by ops. -void Retire(const char* name, FlagFastTypeId type_id, char* buf); - -constexpr size_t kRetiredFlagObjSize = 3 * sizeof(void*); -constexpr size_t kRetiredFlagObjAlignment = alignof(void*); - -// Registered a retired flag with name 'flag_name' and type 'T'. -template <typename T> -class RetiredFlag { - public: - void Retire(const char* flag_name) { - flags_internal::Retire(flag_name, base_internal::FastTypeId<T>(), buf_); - } - - private: - alignas(kRetiredFlagObjAlignment) char buf_[kRetiredFlagObjSize]; -}; - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_INTERNAL_REGISTRY_H_ diff --git a/third_party/abseil_cpp/absl/flags/internal/usage.cc b/third_party/abseil_cpp/absl/flags/internal/usage.cc deleted file mode 100644 index f29d7c9b48f0..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/usage.cc +++ /dev/null @@ -1,524 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/internal/usage.h" - -#include <stdint.h> - -#include <functional> -#include <map> -#include <ostream> -#include <string> -#include <utility> -#include <vector> - -#include "absl/base/config.h" -#include "absl/flags/commandlineflag.h" -#include "absl/flags/flag.h" -#include "absl/flags/internal/flag.h" -#include "absl/flags/internal/path_util.h" -#include "absl/flags/internal/private_handle_accessor.h" -#include "absl/flags/internal/program_name.h" -#include "absl/flags/internal/registry.h" -#include "absl/flags/usage_config.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/str_split.h" -#include "absl/strings/string_view.h" - -// Dummy global variables to prevent anyone else defining these. -bool FLAGS_help = false; -bool FLAGS_helpfull = false; -bool FLAGS_helpshort = false; -bool FLAGS_helppackage = false; -bool FLAGS_version = false; -bool FLAGS_only_check_args = false; -bool FLAGS_helpon = false; -bool FLAGS_helpmatch = false; - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { -namespace { - -using PerFlagFilter = std::function<bool(const absl::CommandLineFlag&)>; - -// Maximum length size in a human readable format. -constexpr size_t kHrfMaxLineLength = 80; - -// This class is used to emit an XML element with `tag` and `text`. -// It adds opening and closing tags and escapes special characters in the text. -// For example: -// std::cout << XMLElement("title", "Milk & Cookies"); -// prints "<title>Milk & Cookies</title>" -class XMLElement { - public: - XMLElement(absl::string_view tag, absl::string_view txt) - : tag_(tag), txt_(txt) {} - - friend std::ostream& operator<<(std::ostream& out, - const XMLElement& xml_elem) { - out << "<" << xml_elem.tag_ << ">"; - - for (auto c : xml_elem.txt_) { - switch (c) { - case '"': - out << """; - break; - case '\'': - out << "'"; - break; - case '&': - out << "&"; - break; - case '<': - out << "<"; - break; - case '>': - out << ">"; - break; - default: - out << c; - break; - } - } - - return out << "</" << xml_elem.tag_ << ">"; - } - - private: - absl::string_view tag_; - absl::string_view txt_; -}; - -// -------------------------------------------------------------------- -// Helper class to pretty-print info about a flag. - -class FlagHelpPrettyPrinter { - public: - // Pretty printer holds on to the std::ostream& reference to direct an output - // to that stream. - FlagHelpPrettyPrinter(size_t max_line_len, size_t min_line_len, - size_t wrapped_line_indent, std::ostream& out) - : out_(out), - max_line_len_(max_line_len), - min_line_len_(min_line_len), - wrapped_line_indent_(wrapped_line_indent), - line_len_(0), - first_line_(true) {} - - void Write(absl::string_view str, bool wrap_line = false) { - // Empty string - do nothing. - if (str.empty()) return; - - std::vector<absl::string_view> tokens; - if (wrap_line) { - for (auto line : absl::StrSplit(str, absl::ByAnyChar("\n\r"))) { - if (!tokens.empty()) { - // Keep line separators in the input string. - tokens.push_back("\n"); - } - for (auto token : - absl::StrSplit(line, absl::ByAnyChar(" \t"), absl::SkipEmpty())) { - tokens.push_back(token); - } - } - } else { - tokens.push_back(str); - } - - for (auto token : tokens) { - bool new_line = (line_len_ == 0); - - // Respect line separators in the input string. - if (token == "\n") { - EndLine(); - continue; - } - - // Write the token, ending the string first if necessary/possible. - if (!new_line && - (line_len_ + static_cast<int>(token.size()) >= max_line_len_)) { - EndLine(); - new_line = true; - } - - if (new_line) { - StartLine(); - } else { - out_ << ' '; - ++line_len_; - } - - out_ << token; - line_len_ += token.size(); - } - } - - void StartLine() { - if (first_line_) { - line_len_ = min_line_len_; - first_line_ = false; - } else { - line_len_ = min_line_len_ + wrapped_line_indent_; - } - out_ << std::string(line_len_, ' '); - } - void EndLine() { - out_ << '\n'; - line_len_ = 0; - } - - private: - std::ostream& out_; - const size_t max_line_len_; - const size_t min_line_len_; - const size_t wrapped_line_indent_; - size_t line_len_; - bool first_line_; -}; - -void FlagHelpHumanReadable(const CommandLineFlag& flag, std::ostream& out) { - FlagHelpPrettyPrinter printer(kHrfMaxLineLength, 4, 2, out); - - // Flag name. - printer.Write(absl::StrCat("--", flag.Name())); - - // Flag help. - printer.Write(absl::StrCat("(", flag.Help(), ");"), /*wrap_line=*/true); - - // The listed default value will be the actual default from the flag - // definition in the originating source file, unless the value has - // subsequently been modified using SetCommandLineOption() with mode - // SET_FLAGS_DEFAULT. - std::string dflt_val = flag.DefaultValue(); - std::string curr_val = flag.CurrentValue(); - bool is_modified = curr_val != dflt_val; - - if (flag.IsOfType<std::string>()) { - dflt_val = absl::StrCat("\"", dflt_val, "\""); - } - printer.Write(absl::StrCat("default: ", dflt_val, ";")); - - if (is_modified) { - if (flag.IsOfType<std::string>()) { - curr_val = absl::StrCat("\"", curr_val, "\""); - } - printer.Write(absl::StrCat("currently: ", curr_val, ";")); - } - - printer.EndLine(); -} - -// Shows help for every filename which matches any of the filters -// If filters are empty, shows help for every file. -// If a flag's help message has been stripped (e.g. by adding '#define -// STRIP_FLAG_HELP 1' then this flag will not be displayed by '--help' -// and its variants. -void FlagsHelpImpl(std::ostream& out, PerFlagFilter filter_cb, - HelpFormat format, absl::string_view program_usage_message) { - if (format == HelpFormat::kHumanReadable) { - out << flags_internal::ShortProgramInvocationName() << ": " - << program_usage_message << "\n\n"; - } else { - // XML schema is not a part of our public API for now. - out << "<?xml version=\"1.0\"?>\n" - << "<!-- This output should be used with care. We do not report type " - "names for flags with user defined types -->\n" - << "<!-- Prefer flag only_check_args for validating flag inputs -->\n" - // The document. - << "<AllFlags>\n" - // The program name and usage. - << XMLElement("program", flags_internal::ShortProgramInvocationName()) - << '\n' - << XMLElement("usage", program_usage_message) << '\n'; - } - - // Map of package name to - // map of file name to - // vector of flags in the file. - // This map is used to output matching flags grouped by package and file - // name. - std::map<std::string, - std::map<std::string, std::vector<const absl::CommandLineFlag*>>> - matching_flags; - - flags_internal::ForEachFlag([&](absl::CommandLineFlag& flag) { - // Ignore retired flags. - if (flag.IsRetired()) return; - - // If the flag has been stripped, pretend that it doesn't exist. - if (flag.Help() == flags_internal::kStrippedFlagHelp) return; - - // Make sure flag satisfies the filter - if (!filter_cb(flag)) return; - - std::string flag_filename = flag.Filename(); - - matching_flags[std::string(flags_internal::Package(flag_filename))] - [flag_filename] - .push_back(&flag); - }); - - absl::string_view package_separator; // controls blank lines between packages - absl::string_view file_separator; // controls blank lines between files - for (const auto& package : matching_flags) { - if (format == HelpFormat::kHumanReadable) { - out << package_separator; - package_separator = "\n\n"; - } - - file_separator = ""; - for (const auto& flags_in_file : package.second) { - if (format == HelpFormat::kHumanReadable) { - out << file_separator << " Flags from " << flags_in_file.first - << ":\n"; - file_separator = "\n"; - } - - for (const auto* flag : flags_in_file.second) { - flags_internal::FlagHelp(out, *flag, format); - } - } - } - - if (format == HelpFormat::kHumanReadable) { - FlagHelpPrettyPrinter printer(kHrfMaxLineLength, 0, 0, out); - - if (filter_cb && matching_flags.empty()) { - printer.Write("No flags matched.\n", true); - } - printer.EndLine(); - printer.Write( - "Try --helpfull to get a list of all flags or --help=substring " - "shows help for flags which include specified substring in either " - "in the name, or description or path.\n", - true); - } else { - // The end of the document. - out << "</AllFlags>\n"; - } -} - -void FlagsHelpImpl(std::ostream& out, - flags_internal::FlagKindFilter filename_filter_cb, - HelpFormat format, absl::string_view program_usage_message) { - FlagsHelpImpl( - out, - [&](const absl::CommandLineFlag& flag) { - return filename_filter_cb && filename_filter_cb(flag.Filename()); - }, - format, program_usage_message); -} - -} // namespace - -// -------------------------------------------------------------------- -// Produces the help message describing specific flag. -void FlagHelp(std::ostream& out, const CommandLineFlag& flag, - HelpFormat format) { - if (format == HelpFormat::kHumanReadable) - flags_internal::FlagHelpHumanReadable(flag, out); -} - -// -------------------------------------------------------------------- -// Produces the help messages for all flags matching the filename filter. -// If filter is empty produces help messages for all flags. -void FlagsHelp(std::ostream& out, absl::string_view filter, HelpFormat format, - absl::string_view program_usage_message) { - flags_internal::FlagKindFilter filter_cb = [&](absl::string_view filename) { - return filter.empty() || filename.find(filter) != absl::string_view::npos; - }; - flags_internal::FlagsHelpImpl(out, filter_cb, format, program_usage_message); -} - -// -------------------------------------------------------------------- -// Checks all the 'usage' command line flags to see if any have been set. -// If so, handles them appropriately. -int HandleUsageFlags(std::ostream& out, - absl::string_view program_usage_message) { - switch (GetFlagsHelpMode()) { - case HelpMode::kNone: - break; - case HelpMode::kImportant: - flags_internal::FlagsHelpImpl( - out, flags_internal::GetUsageConfig().contains_help_flags, - GetFlagsHelpFormat(), program_usage_message); - return 1; - - case HelpMode::kShort: - flags_internal::FlagsHelpImpl( - out, flags_internal::GetUsageConfig().contains_helpshort_flags, - GetFlagsHelpFormat(), program_usage_message); - return 1; - - case HelpMode::kFull: - flags_internal::FlagsHelp(out, "", GetFlagsHelpFormat(), - program_usage_message); - return 1; - - case HelpMode::kPackage: - flags_internal::FlagsHelpImpl( - out, flags_internal::GetUsageConfig().contains_helppackage_flags, - GetFlagsHelpFormat(), program_usage_message); - - return 1; - - case HelpMode::kMatch: { - std::string substr = GetFlagsHelpMatchSubstr(); - if (substr.empty()) { - // show all options - flags_internal::FlagsHelp(out, substr, GetFlagsHelpFormat(), - program_usage_message); - } else { - auto filter_cb = [&substr](const absl::CommandLineFlag& flag) { - if (absl::StrContains(flag.Name(), substr)) return true; - if (absl::StrContains(flag.Filename(), substr)) return true; - if (absl::StrContains(flag.Help(), substr)) return true; - - return false; - }; - flags_internal::FlagsHelpImpl( - out, filter_cb, HelpFormat::kHumanReadable, program_usage_message); - } - - return 1; - } - case HelpMode::kVersion: - if (flags_internal::GetUsageConfig().version_string) - out << flags_internal::GetUsageConfig().version_string(); - // Unlike help, we may be asking for version in a script, so return 0 - return 0; - - case HelpMode::kOnlyCheckArgs: - return 0; - } - - return -1; -} - -// -------------------------------------------------------------------- -// Globals representing usage reporting flags - -namespace { - -ABSL_CONST_INIT absl::Mutex help_attributes_guard(absl::kConstInit); -ABSL_CONST_INIT std::string* match_substr - ABSL_GUARDED_BY(help_attributes_guard) = nullptr; -ABSL_CONST_INIT HelpMode help_mode ABSL_GUARDED_BY(help_attributes_guard) = - HelpMode::kNone; -ABSL_CONST_INIT HelpFormat help_format ABSL_GUARDED_BY(help_attributes_guard) = - HelpFormat::kHumanReadable; - -} // namespace - -std::string GetFlagsHelpMatchSubstr() { - absl::MutexLock l(&help_attributes_guard); - if (match_substr == nullptr) return ""; - return *match_substr; -} - -void SetFlagsHelpMatchSubstr(absl::string_view substr) { - absl::MutexLock l(&help_attributes_guard); - if (match_substr == nullptr) match_substr = new std::string; - match_substr->assign(substr.data(), substr.size()); -} - -HelpMode GetFlagsHelpMode() { - absl::MutexLock l(&help_attributes_guard); - // Refer to dummy variales to prevent linker dropping them - if (FLAGS_help || FLAGS_helpfull || FLAGS_helpshort || FLAGS_helppackage || - FLAGS_version || FLAGS_only_check_args || FLAGS_helpon || - FLAGS_helpmatch) { - help_mode = HelpMode::kNone; - } - return help_mode; -} - -void SetFlagsHelpMode(HelpMode mode) { - absl::MutexLock l(&help_attributes_guard); - help_mode = mode; -} - -HelpFormat GetFlagsHelpFormat() { - absl::MutexLock l(&help_attributes_guard); - return help_format; -} - -void SetFlagsHelpFormat(HelpFormat format) { - absl::MutexLock l(&help_attributes_guard); - help_format = format; -} - -// Deduces usage flags from the input argument in a form --name=value or -// --name. argument is already split into name and value before we call this -// function. -bool DeduceUsageFlags(absl::string_view name, absl::string_view value) { - if (absl::ConsumePrefix(&name, "help")) { - if (name == "") { - if (value.empty()) { - SetFlagsHelpMode(HelpMode::kImportant); - } else { - SetFlagsHelpMode(HelpMode::kMatch); - SetFlagsHelpMatchSubstr(value); - } - return true; - } - - if (name == "match") { - SetFlagsHelpMode(HelpMode::kMatch); - SetFlagsHelpMatchSubstr(value); - return true; - } - - if (name == "on") { - SetFlagsHelpMode(HelpMode::kMatch); - SetFlagsHelpMatchSubstr(absl::StrCat("/", value, ".")); - return true; - } - - if (name == "full") { - SetFlagsHelpMode(HelpMode::kFull); - return true; - } - - if (name == "short") { - SetFlagsHelpMode(HelpMode::kShort); - return true; - } - - if (name == "package") { - SetFlagsHelpMode(HelpMode::kPackage); - return true; - } - - return false; - } - - if (name == "version") { - SetFlagsHelpMode(HelpMode::kVersion); - return true; - } - - if (name == "only_check_args") { - SetFlagsHelpMode(HelpMode::kOnlyCheckArgs); - return true; - } - - return false; -} - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/internal/usage.h b/third_party/abseil_cpp/absl/flags/internal/usage.h deleted file mode 100644 index c0bcac57628a..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/usage.h +++ /dev/null @@ -1,104 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_INTERNAL_USAGE_H_ -#define ABSL_FLAGS_INTERNAL_USAGE_H_ - -#include <iosfwd> -#include <string> - -#include "absl/base/config.h" -#include "absl/flags/commandlineflag.h" -#include "absl/flags/declare.h" -#include "absl/strings/string_view.h" - -// -------------------------------------------------------------------- -// Usage reporting interfaces - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// The format to report the help messages in. -enum class HelpFormat { - kHumanReadable, -}; - -// Streams the help message describing `flag` to `out`. -// The default value for `flag` is included in the output. -void FlagHelp(std::ostream& out, const CommandLineFlag& flag, - HelpFormat format = HelpFormat::kHumanReadable); - -// Produces the help messages for all flags matching the filter. A flag matches -// the filter if it is defined in a file with a filename which includes -// filter string as a substring. You can use '/' and '.' to restrict the -// matching to a specific file names. For example: -// FlagsHelp(out, "/path/to/file."); -// restricts help to only flags which resides in files named like: -// .../path/to/file.<ext> -// for any extension 'ext'. If the filter is empty this function produces help -// messages for all flags. -void FlagsHelp(std::ostream& out, absl::string_view filter, - HelpFormat format, absl::string_view program_usage_message); - -// -------------------------------------------------------------------- - -// If any of the 'usage' related command line flags (listed on the bottom of -// this file) has been set this routine produces corresponding help message in -// the specified output stream and returns: -// 0 - if "version" or "only_check_flags" flags were set and handled. -// 1 - if some other 'usage' related flag was set and handled. -// -1 - if no usage flags were set on a commmand line. -// Non negative return values are expected to be used as an exit code for a -// binary. -int HandleUsageFlags(std::ostream& out, - absl::string_view program_usage_message); - -// -------------------------------------------------------------------- -// Globals representing usage reporting flags - -enum class HelpMode { - kNone, - kImportant, - kShort, - kFull, - kPackage, - kMatch, - kVersion, - kOnlyCheckArgs -}; - -// Returns substring to filter help output (--help=substr argument) -std::string GetFlagsHelpMatchSubstr(); -// Returns the requested help mode. -HelpMode GetFlagsHelpMode(); -// Returns the requested help format. -HelpFormat GetFlagsHelpFormat(); - -// These are corresponding setters to the attributes above. -void SetFlagsHelpMatchSubstr(absl::string_view); -void SetFlagsHelpMode(HelpMode); -void SetFlagsHelpFormat(HelpFormat); - -// Deduces usage flags from the input argument in a form --name=value or -// --name. argument is already split into name and value before we call this -// function. -bool DeduceUsageFlags(absl::string_view name, absl::string_view value); - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_INTERNAL_USAGE_H_ diff --git a/third_party/abseil_cpp/absl/flags/internal/usage_test.cc b/third_party/abseil_cpp/absl/flags/internal/usage_test.cc deleted file mode 100644 index b5c2487da577..000000000000 --- a/third_party/abseil_cpp/absl/flags/internal/usage_test.cc +++ /dev/null @@ -1,493 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/internal/usage.h" - -#include <stdint.h> - -#include <sstream> -#include <string> - -#include "gtest/gtest.h" -#include "absl/flags/flag.h" -#include "absl/flags/internal/parse.h" -#include "absl/flags/internal/path_util.h" -#include "absl/flags/internal/program_name.h" -#include "absl/flags/reflection.h" -#include "absl/flags/usage.h" -#include "absl/flags/usage_config.h" -#include "absl/strings/match.h" -#include "absl/strings/string_view.h" - -ABSL_FLAG(int, usage_reporting_test_flag_01, 101, - "usage_reporting_test_flag_01 help message"); -ABSL_FLAG(bool, usage_reporting_test_flag_02, false, - "usage_reporting_test_flag_02 help message"); -ABSL_FLAG(double, usage_reporting_test_flag_03, 1.03, - "usage_reporting_test_flag_03 help message"); -ABSL_FLAG(int64_t, usage_reporting_test_flag_04, 1000000000000004L, - "usage_reporting_test_flag_04 help message"); - -static const char kTestUsageMessage[] = "Custom usage message"; - -struct UDT { - UDT() = default; - UDT(const UDT&) = default; -}; -bool AbslParseFlag(absl::string_view, UDT*, std::string*) { return true; } -std::string AbslUnparseFlag(const UDT&) { return "UDT{}"; } - -ABSL_FLAG(UDT, usage_reporting_test_flag_05, {}, - "usage_reporting_test_flag_05 help message"); - -ABSL_FLAG( - std::string, usage_reporting_test_flag_06, {}, - "usage_reporting_test_flag_06 help message.\n" - "\n" - "Some more help.\n" - "Even more long long long long long long long long long long long long " - "help message."); - -namespace { - -namespace flags = absl::flags_internal; - -static std::string NormalizeFileName(absl::string_view fname) { -#ifdef _WIN32 - std::string normalized(fname); - std::replace(normalized.begin(), normalized.end(), '\\', '/'); - fname = normalized; -#endif - - auto absl_pos = fname.rfind("absl/"); - if (absl_pos != absl::string_view::npos) { - fname = fname.substr(absl_pos); - } - return std::string(fname); -} - -class UsageReportingTest : public testing::Test { - protected: - UsageReportingTest() { - // Install default config for the use on this unit test. - // Binary may install a custom config before tests are run. - absl::FlagsUsageConfig default_config; - default_config.normalize_filename = &NormalizeFileName; - absl::SetFlagsUsageConfig(default_config); - } - ~UsageReportingTest() override { - flags::SetFlagsHelpMode(flags::HelpMode::kNone); - flags::SetFlagsHelpMatchSubstr(""); - flags::SetFlagsHelpFormat(flags::HelpFormat::kHumanReadable); - } - - private: - absl::FlagSaver flag_saver_; -}; - -// -------------------------------------------------------------------- - -using UsageReportingDeathTest = UsageReportingTest; - -TEST_F(UsageReportingDeathTest, TestSetProgramUsageMessage) { - EXPECT_EQ(absl::ProgramUsageMessage(), kTestUsageMessage); - -#ifndef _WIN32 - // TODO(rogeeff): figure out why this does not work on Windows. - EXPECT_DEATH_IF_SUPPORTED( - absl::SetProgramUsageMessage("custom usage message"), - ".*SetProgramUsageMessage\\(\\) called twice.*"); -#endif -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_01) { - const auto* flag = absl::FindCommandLineFlag("usage_reporting_test_flag_01"); - std::stringstream test_buf; - - flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable); - EXPECT_EQ( - test_buf.str(), - R"( --usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message); - default: 101; -)"); -} - -TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_02) { - const auto* flag = absl::FindCommandLineFlag("usage_reporting_test_flag_02"); - std::stringstream test_buf; - - flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable); - EXPECT_EQ( - test_buf.str(), - R"( --usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message); - default: false; -)"); -} - -TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_03) { - const auto* flag = absl::FindCommandLineFlag("usage_reporting_test_flag_03"); - std::stringstream test_buf; - - flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable); - EXPECT_EQ( - test_buf.str(), - R"( --usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message); - default: 1.03; -)"); -} - -TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_04) { - const auto* flag = absl::FindCommandLineFlag("usage_reporting_test_flag_04"); - std::stringstream test_buf; - - flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable); - EXPECT_EQ( - test_buf.str(), - R"( --usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message); - default: 1000000000000004; -)"); -} - -TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_05) { - const auto* flag = absl::FindCommandLineFlag("usage_reporting_test_flag_05"); - std::stringstream test_buf; - - flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable); - EXPECT_EQ( - test_buf.str(), - R"( --usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message); - default: UDT{}; -)"); -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestFlagsHelpHRF) { - std::string usage_test_flags_out = - R"(usage_test: Custom usage message - - Flags from absl/flags/internal/usage_test.cc: - --usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message); - default: 101; - --usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message); - default: false; - --usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message); - default: 1.03; - --usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message); - default: 1000000000000004; - --usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message); - default: UDT{}; - --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message. - - Some more help. - Even more long long long long long long long long long long long long help - message.); default: ""; - -Try --helpfull to get a list of all flags or --help=substring shows help for -flags which include specified substring in either in the name, or description or -path. -)"; - - std::stringstream test_buf_01; - flags::FlagsHelp(test_buf_01, "usage_test.cc", - flags::HelpFormat::kHumanReadable, kTestUsageMessage); - EXPECT_EQ(test_buf_01.str(), usage_test_flags_out); - - std::stringstream test_buf_02; - flags::FlagsHelp(test_buf_02, "flags/internal/usage_test.cc", - flags::HelpFormat::kHumanReadable, kTestUsageMessage); - EXPECT_EQ(test_buf_02.str(), usage_test_flags_out); - - std::stringstream test_buf_03; - flags::FlagsHelp(test_buf_03, "usage_test", flags::HelpFormat::kHumanReadable, - kTestUsageMessage); - EXPECT_EQ(test_buf_03.str(), usage_test_flags_out); - - std::stringstream test_buf_04; - flags::FlagsHelp(test_buf_04, "flags/invalid_file_name.cc", - flags::HelpFormat::kHumanReadable, kTestUsageMessage); - EXPECT_EQ(test_buf_04.str(), - R"(usage_test: Custom usage message - -No flags matched. - -Try --helpfull to get a list of all flags or --help=substring shows help for -flags which include specified substring in either in the name, or description or -path. -)"); - - std::stringstream test_buf_05; - flags::FlagsHelp(test_buf_05, "", flags::HelpFormat::kHumanReadable, - kTestUsageMessage); - std::string test_out = test_buf_05.str(); - absl::string_view test_out_str(test_out); - EXPECT_TRUE( - absl::StartsWith(test_out_str, "usage_test: Custom usage message")); - EXPECT_TRUE(absl::StrContains( - test_out_str, "Flags from absl/flags/internal/usage_test.cc:")); - EXPECT_TRUE( - absl::StrContains(test_out_str, "-usage_reporting_test_flag_01 ")); -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestNoUsageFlags) { - std::stringstream test_buf; - EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), -1); -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestUsageFlag_helpshort) { - flags::SetFlagsHelpMode(flags::HelpMode::kShort); - - std::stringstream test_buf; - EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); - EXPECT_EQ(test_buf.str(), - R"(usage_test: Custom usage message - - Flags from absl/flags/internal/usage_test.cc: - --usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message); - default: 101; - --usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message); - default: false; - --usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message); - default: 1.03; - --usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message); - default: 1000000000000004; - --usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message); - default: UDT{}; - --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message. - - Some more help. - Even more long long long long long long long long long long long long help - message.); default: ""; - -Try --helpfull to get a list of all flags or --help=substring shows help for -flags which include specified substring in either in the name, or description or -path. -)"); -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestUsageFlag_help_simple) { - flags::SetFlagsHelpMode(flags::HelpMode::kImportant); - - std::stringstream test_buf; - EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); - EXPECT_EQ(test_buf.str(), - R"(usage_test: Custom usage message - - Flags from absl/flags/internal/usage_test.cc: - --usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message); - default: 101; - --usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message); - default: false; - --usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message); - default: 1.03; - --usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message); - default: 1000000000000004; - --usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message); - default: UDT{}; - --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message. - - Some more help. - Even more long long long long long long long long long long long long help - message.); default: ""; - -Try --helpfull to get a list of all flags or --help=substring shows help for -flags which include specified substring in either in the name, or description or -path. -)"); -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestUsageFlag_help_one_flag) { - flags::SetFlagsHelpMode(flags::HelpMode::kMatch); - flags::SetFlagsHelpMatchSubstr("usage_reporting_test_flag_06"); - - std::stringstream test_buf; - EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); - EXPECT_EQ(test_buf.str(), - R"(usage_test: Custom usage message - - Flags from absl/flags/internal/usage_test.cc: - --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message. - - Some more help. - Even more long long long long long long long long long long long long help - message.); default: ""; - -Try --helpfull to get a list of all flags or --help=substring shows help for -flags which include specified substring in either in the name, or description or -path. -)"); -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestUsageFlag_help_multiple_flag) { - flags::SetFlagsHelpMode(flags::HelpMode::kMatch); - flags::SetFlagsHelpMatchSubstr("test_flag"); - - std::stringstream test_buf; - EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); - EXPECT_EQ(test_buf.str(), - R"(usage_test: Custom usage message - - Flags from absl/flags/internal/usage_test.cc: - --usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message); - default: 101; - --usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message); - default: false; - --usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message); - default: 1.03; - --usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message); - default: 1000000000000004; - --usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message); - default: UDT{}; - --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message. - - Some more help. - Even more long long long long long long long long long long long long help - message.); default: ""; - -Try --helpfull to get a list of all flags or --help=substring shows help for -flags which include specified substring in either in the name, or description or -path. -)"); -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestUsageFlag_helppackage) { - flags::SetFlagsHelpMode(flags::HelpMode::kPackage); - - std::stringstream test_buf; - EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1); - EXPECT_EQ(test_buf.str(), - R"(usage_test: Custom usage message - - Flags from absl/flags/internal/usage_test.cc: - --usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message); - default: 101; - --usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message); - default: false; - --usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message); - default: 1.03; - --usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message); - default: 1000000000000004; - --usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message); - default: UDT{}; - --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message. - - Some more help. - Even more long long long long long long long long long long long long help - message.); default: ""; - -Try --helpfull to get a list of all flags or --help=substring shows help for -flags which include specified substring in either in the name, or description or -path. -)"); -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestUsageFlag_version) { - flags::SetFlagsHelpMode(flags::HelpMode::kVersion); - - std::stringstream test_buf; - EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 0); -#ifndef NDEBUG - EXPECT_EQ(test_buf.str(), "usage_test\nDebug build (NDEBUG not #defined)\n"); -#else - EXPECT_EQ(test_buf.str(), "usage_test\n"); -#endif -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestUsageFlag_only_check_args) { - flags::SetFlagsHelpMode(flags::HelpMode::kOnlyCheckArgs); - - std::stringstream test_buf; - EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 0); - EXPECT_EQ(test_buf.str(), ""); -} - -// -------------------------------------------------------------------- - -TEST_F(UsageReportingTest, TestUsageFlag_helpon) { - flags::SetFlagsHelpMode(flags::HelpMode::kMatch); - flags::SetFlagsHelpMatchSubstr("/bla-bla."); - - std::stringstream test_buf_01; - EXPECT_EQ(flags::HandleUsageFlags(test_buf_01, kTestUsageMessage), 1); - EXPECT_EQ(test_buf_01.str(), - R"(usage_test: Custom usage message - -No flags matched. - -Try --helpfull to get a list of all flags or --help=substring shows help for -flags which include specified substring in either in the name, or description or -path. -)"); - - flags::SetFlagsHelpMatchSubstr("/usage_test."); - - std::stringstream test_buf_02; - EXPECT_EQ(flags::HandleUsageFlags(test_buf_02, kTestUsageMessage), 1); - EXPECT_EQ(test_buf_02.str(), - R"(usage_test: Custom usage message - - Flags from absl/flags/internal/usage_test.cc: - --usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message); - default: 101; - --usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message); - default: false; - --usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message); - default: 1.03; - --usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message); - default: 1000000000000004; - --usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message); - default: UDT{}; - --usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message. - - Some more help. - Even more long long long long long long long long long long long long help - message.); default: ""; - -Try --helpfull to get a list of all flags or --help=substring shows help for -flags which include specified substring in either in the name, or description or -path. -)"); -} - -// -------------------------------------------------------------------- - -} // namespace - -int main(int argc, char* argv[]) { - (void)absl::GetFlag(FLAGS_undefok); // Force linking of parse.cc - flags::SetProgramInvocationName("usage_test"); - absl::SetProgramUsageMessage(kTestUsageMessage); - ::testing::InitGoogleTest(&argc, argv); - - return RUN_ALL_TESTS(); -} diff --git a/third_party/abseil_cpp/absl/flags/marshalling.cc b/third_party/abseil_cpp/absl/flags/marshalling.cc deleted file mode 100644 index 81f9cebd6f41..000000000000 --- a/third_party/abseil_cpp/absl/flags/marshalling.cc +++ /dev/null @@ -1,241 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/marshalling.h" - -#include <stddef.h> - -#include <cmath> -#include <limits> -#include <string> -#include <type_traits> -#include <vector> - -#include "absl/base/config.h" -#include "absl/base/log_severity.h" -#include "absl/base/macros.h" -#include "absl/strings/ascii.h" -#include "absl/strings/match.h" -#include "absl/strings/numbers.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/str_format.h" -#include "absl/strings/str_join.h" -#include "absl/strings/str_split.h" -#include "absl/strings/string_view.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// -------------------------------------------------------------------- -// AbslParseFlag specializations for boolean type. - -bool AbslParseFlag(absl::string_view text, bool* dst, std::string*) { - const char* kTrue[] = {"1", "t", "true", "y", "yes"}; - const char* kFalse[] = {"0", "f", "false", "n", "no"}; - static_assert(sizeof(kTrue) == sizeof(kFalse), "true_false_equal"); - - text = absl::StripAsciiWhitespace(text); - - for (size_t i = 0; i < ABSL_ARRAYSIZE(kTrue); ++i) { - if (absl::EqualsIgnoreCase(text, kTrue[i])) { - *dst = true; - return true; - } else if (absl::EqualsIgnoreCase(text, kFalse[i])) { - *dst = false; - return true; - } - } - return false; // didn't match a legal input -} - -// -------------------------------------------------------------------- -// AbslParseFlag for integral types. - -// Return the base to use for parsing text as an integer. Leading 0x -// puts us in base 16. But leading 0 does not put us in base 8. It -// caused too many bugs when we had that behavior. -static int NumericBase(absl::string_view text) { - const bool hex = (text.size() >= 2 && text[0] == '0' && - (text[1] == 'x' || text[1] == 'X')); - return hex ? 16 : 10; -} - -template <typename IntType> -inline bool ParseFlagImpl(absl::string_view text, IntType& dst) { - text = absl::StripAsciiWhitespace(text); - - return absl::numbers_internal::safe_strtoi_base(text, &dst, - NumericBase(text)); -} - -bool AbslParseFlag(absl::string_view text, short* dst, std::string*) { - int val; - if (!ParseFlagImpl(text, val)) return false; - if (static_cast<short>(val) != val) // worked, but number out of range - return false; - *dst = static_cast<short>(val); - return true; -} - -bool AbslParseFlag(absl::string_view text, unsigned short* dst, std::string*) { - unsigned int val; - if (!ParseFlagImpl(text, val)) return false; - if (static_cast<unsigned short>(val) != - val) // worked, but number out of range - return false; - *dst = static_cast<unsigned short>(val); - return true; -} - -bool AbslParseFlag(absl::string_view text, int* dst, std::string*) { - return ParseFlagImpl(text, *dst); -} - -bool AbslParseFlag(absl::string_view text, unsigned int* dst, std::string*) { - return ParseFlagImpl(text, *dst); -} - -bool AbslParseFlag(absl::string_view text, long* dst, std::string*) { - return ParseFlagImpl(text, *dst); -} - -bool AbslParseFlag(absl::string_view text, unsigned long* dst, std::string*) { - return ParseFlagImpl(text, *dst); -} - -bool AbslParseFlag(absl::string_view text, long long* dst, std::string*) { - return ParseFlagImpl(text, *dst); -} - -bool AbslParseFlag(absl::string_view text, unsigned long long* dst, - std::string*) { - return ParseFlagImpl(text, *dst); -} - -// -------------------------------------------------------------------- -// AbslParseFlag for floating point types. - -bool AbslParseFlag(absl::string_view text, float* dst, std::string*) { - return absl::SimpleAtof(text, dst); -} - -bool AbslParseFlag(absl::string_view text, double* dst, std::string*) { - return absl::SimpleAtod(text, dst); -} - -// -------------------------------------------------------------------- -// AbslParseFlag for strings. - -bool AbslParseFlag(absl::string_view text, std::string* dst, std::string*) { - dst->assign(text.data(), text.size()); - return true; -} - -// -------------------------------------------------------------------- -// AbslParseFlag for vector of strings. - -bool AbslParseFlag(absl::string_view text, std::vector<std::string>* dst, - std::string*) { - // An empty flag value corresponds to an empty vector, not a vector - // with a single, empty std::string. - if (text.empty()) { - dst->clear(); - return true; - } - *dst = absl::StrSplit(text, ',', absl::AllowEmpty()); - return true; -} - -// -------------------------------------------------------------------- -// AbslUnparseFlag specializations for various builtin flag types. - -std::string Unparse(bool v) { return v ? "true" : "false"; } -std::string Unparse(short v) { return absl::StrCat(v); } -std::string Unparse(unsigned short v) { return absl::StrCat(v); } -std::string Unparse(int v) { return absl::StrCat(v); } -std::string Unparse(unsigned int v) { return absl::StrCat(v); } -std::string Unparse(long v) { return absl::StrCat(v); } -std::string Unparse(unsigned long v) { return absl::StrCat(v); } -std::string Unparse(long long v) { return absl::StrCat(v); } -std::string Unparse(unsigned long long v) { return absl::StrCat(v); } -template <typename T> -std::string UnparseFloatingPointVal(T v) { - // digits10 is guaranteed to roundtrip correctly in string -> value -> string - // conversions, but may not be enough to represent all the values correctly. - std::string digit10_str = - absl::StrFormat("%.*g", std::numeric_limits<T>::digits10, v); - if (std::isnan(v) || std::isinf(v)) return digit10_str; - - T roundtrip_val = 0; - std::string err; - if (absl::ParseFlag(digit10_str, &roundtrip_val, &err) && - roundtrip_val == v) { - return digit10_str; - } - - // max_digits10 is the number of base-10 digits that are necessary to uniquely - // represent all distinct values. - return absl::StrFormat("%.*g", std::numeric_limits<T>::max_digits10, v); -} -std::string Unparse(float v) { return UnparseFloatingPointVal(v); } -std::string Unparse(double v) { return UnparseFloatingPointVal(v); } -std::string AbslUnparseFlag(absl::string_view v) { return std::string(v); } -std::string AbslUnparseFlag(const std::vector<std::string>& v) { - return absl::StrJoin(v, ","); -} - -} // namespace flags_internal - -bool AbslParseFlag(absl::string_view text, absl::LogSeverity* dst, - std::string* err) { - text = absl::StripAsciiWhitespace(text); - if (text.empty()) { - *err = "no value provided"; - return false; - } - if (text.front() == 'k' || text.front() == 'K') text.remove_prefix(1); - if (absl::EqualsIgnoreCase(text, "info")) { - *dst = absl::LogSeverity::kInfo; - return true; - } - if (absl::EqualsIgnoreCase(text, "warning")) { - *dst = absl::LogSeverity::kWarning; - return true; - } - if (absl::EqualsIgnoreCase(text, "error")) { - *dst = absl::LogSeverity::kError; - return true; - } - if (absl::EqualsIgnoreCase(text, "fatal")) { - *dst = absl::LogSeverity::kFatal; - return true; - } - std::underlying_type<absl::LogSeverity>::type numeric_value; - if (absl::ParseFlag(text, &numeric_value, err)) { - *dst = static_cast<absl::LogSeverity>(numeric_value); - return true; - } - *err = "only integers and absl::LogSeverity enumerators are accepted"; - return false; -} - -std::string AbslUnparseFlag(absl::LogSeverity v) { - if (v == absl::NormalizeLogSeverity(v)) return absl::LogSeverityName(v); - return absl::UnparseFlag(static_cast<int>(v)); -} - -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/marshalling.h b/third_party/abseil_cpp/absl/flags/marshalling.h deleted file mode 100644 index 0b5033547e97..000000000000 --- a/third_party/abseil_cpp/absl/flags/marshalling.h +++ /dev/null @@ -1,264 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ----------------------------------------------------------------------------- -// File: marshalling.h -// ----------------------------------------------------------------------------- -// -// This header file defines the API for extending Abseil flag support to -// custom types, and defines the set of overloads for fundamental types. -// -// Out of the box, the Abseil flags library supports the following types: -// -// * `bool` -// * `int16_t` -// * `uint16_t` -// * `int32_t` -// * `uint32_t` -// * `int64_t` -// * `uint64_t` -// * `float` -// * `double` -// * `std::string` -// * `std::vector<std::string>` -// * `absl::LogSeverity` (provided natively for layering reasons) -// -// Note that support for integral types is implemented using overloads for -// variable-width fundamental types (`short`, `int`, `long`, etc.). However, -// you should prefer the fixed-width integral types (`int32_t`, `uint64_t`, -// etc.) we've noted above within flag definitions. -// -// In addition, several Abseil libraries provide their own custom support for -// Abseil flags. Documentation for these formats is provided in the type's -// `AbslParseFlag()` definition. -// -// The Abseil time library provides the following support for civil time values: -// -// * `absl::CivilSecond` -// * `absl::CivilMinute` -// * `absl::CivilHour` -// * `absl::CivilDay` -// * `absl::CivilMonth` -// * `absl::CivilYear` -// -// and also provides support for the following absolute time values: -// -// * `absl::Duration` -// * `absl::Time` -// -// Additional support for Abseil types will be noted here as it is added. -// -// You can also provide your own custom flags by adding overloads for -// `AbslParseFlag()` and `AbslUnparseFlag()` to your type definitions. (See -// below.) -// -// ----------------------------------------------------------------------------- -// Adding Type Support for Abseil Flags -// ----------------------------------------------------------------------------- -// -// To add support for your user-defined type, add overloads of `AbslParseFlag()` -// and `AbslUnparseFlag()` as free (non-member) functions to your type. If `T` -// is a class type, these functions can be friend function definitions. These -// overloads must be added to the same namespace where the type is defined, so -// that they can be discovered by Argument-Dependent Lookup (ADL). -// -// Example: -// -// namespace foo { -// -// enum OutputMode { kPlainText, kHtml }; -// -// // AbslParseFlag converts from a string to OutputMode. -// // Must be in same namespace as OutputMode. -// -// // Parses an OutputMode from the command line flag value `text. Returns -// // `true` and sets `*mode` on success; returns `false` and sets `*error` -// // on failure. -// bool AbslParseFlag(absl::string_view text, -// OutputMode* mode, -// std::string* error) { -// if (text == "plaintext") { -// *mode = kPlainText; -// return true; -// } -// if (text == "html") { -// *mode = kHtml; -// return true; -// } -// *error = "unknown value for enumeration"; -// return false; -// } -// -// // AbslUnparseFlag converts from an OutputMode to a string. -// // Must be in same namespace as OutputMode. -// -// // Returns a textual flag value corresponding to the OutputMode `mode`. -// std::string AbslUnparseFlag(OutputMode mode) { -// switch (mode) { -// case kPlainText: return "plaintext"; -// case kHtml: return "html"; -// } -// return absl::StrCat(mode); -// } -// -// Notice that neither `AbslParseFlag()` nor `AbslUnparseFlag()` are class -// members, but free functions. `AbslParseFlag/AbslUnparseFlag()` overloads -// for a type should only be declared in the same file and namespace as said -// type. The proper `AbslParseFlag/AbslUnparseFlag()` implementations for a -// given type will be discovered via Argument-Dependent Lookup (ADL). -// -// `AbslParseFlag()` may need, in turn, to parse simpler constituent types -// using `absl::ParseFlag()`. For example, a custom struct `MyFlagType` -// consisting of a `std::pair<int, std::string>` would add an `AbslParseFlag()` -// overload for its `MyFlagType` like so: -// -// Example: -// -// namespace my_flag_type { -// -// struct MyFlagType { -// std::pair<int, std::string> my_flag_data; -// }; -// -// bool AbslParseFlag(absl::string_view text, MyFlagType* flag, -// std::string* err); -// -// std::string AbslUnparseFlag(const MyFlagType&); -// -// // Within the implementation, `AbslParseFlag()` will, in turn invoke -// // `absl::ParseFlag()` on its constituent `int` and `std::string` types -// // (which have built-in Abseil flag support. -// -// bool AbslParseFlag(absl::string_view text, MyFlagType* flag, -// std::string* err) { -// std::pair<absl::string_view, absl::string_view> tokens = -// absl::StrSplit(text, ','); -// if (!absl::ParseFlag(tokens.first, &flag->my_flag_data.first, err)) -// return false; -// if (!absl::ParseFlag(tokens.second, &flag->my_flag_data.second, err)) -// return false; -// return true; -// } -// -// // Similarly, for unparsing, we can simply invoke `absl::UnparseFlag()` on -// // the constituent types. -// std::string AbslUnparseFlag(const MyFlagType& flag) { -// return absl::StrCat(absl::UnparseFlag(flag.my_flag_data.first), -// ",", -// absl::UnparseFlag(flag.my_flag_data.second)); -// } -#ifndef ABSL_FLAGS_MARSHALLING_H_ -#define ABSL_FLAGS_MARSHALLING_H_ - -#include <string> -#include <vector> - -#include "absl/base/config.h" -#include "absl/strings/string_view.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// Overloads of `AbslParseFlag()` and `AbslUnparseFlag()` for fundamental types. -bool AbslParseFlag(absl::string_view, bool*, std::string*); -bool AbslParseFlag(absl::string_view, short*, std::string*); // NOLINT -bool AbslParseFlag(absl::string_view, unsigned short*, std::string*); // NOLINT -bool AbslParseFlag(absl::string_view, int*, std::string*); // NOLINT -bool AbslParseFlag(absl::string_view, unsigned int*, std::string*); // NOLINT -bool AbslParseFlag(absl::string_view, long*, std::string*); // NOLINT -bool AbslParseFlag(absl::string_view, unsigned long*, std::string*); // NOLINT -bool AbslParseFlag(absl::string_view, long long*, std::string*); // NOLINT -bool AbslParseFlag(absl::string_view, unsigned long long*, // NOLINT - std::string*); -bool AbslParseFlag(absl::string_view, float*, std::string*); -bool AbslParseFlag(absl::string_view, double*, std::string*); -bool AbslParseFlag(absl::string_view, std::string*, std::string*); -bool AbslParseFlag(absl::string_view, std::vector<std::string>*, std::string*); - -template <typename T> -bool InvokeParseFlag(absl::string_view input, T* dst, std::string* err) { - // Comment on next line provides a good compiler error message if T - // does not have AbslParseFlag(absl::string_view, T*, std::string*). - return AbslParseFlag(input, dst, err); // Is T missing AbslParseFlag? -} - -// Strings and std:: containers do not have the same overload resolution -// considerations as fundamental types. Naming these 'AbslUnparseFlag' means we -// can avoid the need for additional specializations of Unparse (below). -std::string AbslUnparseFlag(absl::string_view v); -std::string AbslUnparseFlag(const std::vector<std::string>&); - -template <typename T> -std::string Unparse(const T& v) { - // Comment on next line provides a good compiler error message if T does not - // have UnparseFlag. - return AbslUnparseFlag(v); // Is T missing AbslUnparseFlag? -} - -// Overloads for builtin types. -std::string Unparse(bool v); -std::string Unparse(short v); // NOLINT -std::string Unparse(unsigned short v); // NOLINT -std::string Unparse(int v); // NOLINT -std::string Unparse(unsigned int v); // NOLINT -std::string Unparse(long v); // NOLINT -std::string Unparse(unsigned long v); // NOLINT -std::string Unparse(long long v); // NOLINT -std::string Unparse(unsigned long long v); // NOLINT -std::string Unparse(float v); -std::string Unparse(double v); - -} // namespace flags_internal - -// ParseFlag() -// -// Parses a string value into a flag value of type `T`. Do not add overloads of -// this function for your type directly; instead, add an `AbslParseFlag()` -// free function as documented above. -// -// Some implementations of `AbslParseFlag()` for types which consist of other, -// constituent types which already have Abseil flag support, may need to call -// `absl::ParseFlag()` on those consituent string values. (See above.) -template <typename T> -inline bool ParseFlag(absl::string_view input, T* dst, std::string* error) { - return flags_internal::InvokeParseFlag(input, dst, error); -} - -// UnparseFlag() -// -// Unparses a flag value of type `T` into a string value. Do not add overloads -// of this function for your type directly; instead, add an `AbslUnparseFlag()` -// free function as documented above. -// -// Some implementations of `AbslUnparseFlag()` for types which consist of other, -// constituent types which already have Abseil flag support, may want to call -// `absl::UnparseFlag()` on those constituent types. (See above.) -template <typename T> -inline std::string UnparseFlag(const T& v) { - return flags_internal::Unparse(v); -} - -// Overloads for `absl::LogSeverity` can't (easily) appear alongside that type's -// definition because it is layered below flags. See proper documentation in -// base/log_severity.h. -enum class LogSeverity : int; -bool AbslParseFlag(absl::string_view, absl::LogSeverity*, std::string*); -std::string AbslUnparseFlag(absl::LogSeverity); - -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_MARSHALLING_H_ diff --git a/third_party/abseil_cpp/absl/flags/marshalling_test.cc b/third_party/abseil_cpp/absl/flags/marshalling_test.cc deleted file mode 100644 index 4a64ce11a165..000000000000 --- a/third_party/abseil_cpp/absl/flags/marshalling_test.cc +++ /dev/null @@ -1,904 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/marshalling.h" - -#include <stdint.h> - -#include <cmath> -#include <limits> -#include <string> -#include <vector> - -#include "gtest/gtest.h" - -namespace { - -TEST(MarshallingTest, TestBoolParsing) { - std::string err; - bool value; - - // True values. - EXPECT_TRUE(absl::ParseFlag("True", &value, &err)); - EXPECT_TRUE(value); - EXPECT_TRUE(absl::ParseFlag("true", &value, &err)); - EXPECT_TRUE(value); - EXPECT_TRUE(absl::ParseFlag("TRUE", &value, &err)); - EXPECT_TRUE(value); - - EXPECT_TRUE(absl::ParseFlag("Yes", &value, &err)); - EXPECT_TRUE(value); - EXPECT_TRUE(absl::ParseFlag("yes", &value, &err)); - EXPECT_TRUE(value); - EXPECT_TRUE(absl::ParseFlag("YES", &value, &err)); - EXPECT_TRUE(value); - - EXPECT_TRUE(absl::ParseFlag("t", &value, &err)); - EXPECT_TRUE(value); - EXPECT_TRUE(absl::ParseFlag("T", &value, &err)); - EXPECT_TRUE(value); - - EXPECT_TRUE(absl::ParseFlag("y", &value, &err)); - EXPECT_TRUE(value); - EXPECT_TRUE(absl::ParseFlag("Y", &value, &err)); - EXPECT_TRUE(value); - - EXPECT_TRUE(absl::ParseFlag("1", &value, &err)); - EXPECT_TRUE(value); - - // False values. - EXPECT_TRUE(absl::ParseFlag("False", &value, &err)); - EXPECT_FALSE(value); - EXPECT_TRUE(absl::ParseFlag("false", &value, &err)); - EXPECT_FALSE(value); - EXPECT_TRUE(absl::ParseFlag("FALSE", &value, &err)); - EXPECT_FALSE(value); - - EXPECT_TRUE(absl::ParseFlag("No", &value, &err)); - EXPECT_FALSE(value); - EXPECT_TRUE(absl::ParseFlag("no", &value, &err)); - EXPECT_FALSE(value); - EXPECT_TRUE(absl::ParseFlag("NO", &value, &err)); - EXPECT_FALSE(value); - - EXPECT_TRUE(absl::ParseFlag("f", &value, &err)); - EXPECT_FALSE(value); - EXPECT_TRUE(absl::ParseFlag("F", &value, &err)); - EXPECT_FALSE(value); - - EXPECT_TRUE(absl::ParseFlag("n", &value, &err)); - EXPECT_FALSE(value); - EXPECT_TRUE(absl::ParseFlag("N", &value, &err)); - EXPECT_FALSE(value); - - EXPECT_TRUE(absl::ParseFlag("0", &value, &err)); - EXPECT_FALSE(value); - - // Whitespace handling. - EXPECT_TRUE(absl::ParseFlag(" true", &value, &err)); - EXPECT_TRUE(value); - EXPECT_TRUE(absl::ParseFlag("true ", &value, &err)); - EXPECT_TRUE(value); - EXPECT_TRUE(absl::ParseFlag(" true ", &value, &err)); - EXPECT_TRUE(value); - - // Invalid input. - EXPECT_FALSE(absl::ParseFlag("", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\n", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\t", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("2", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("11", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("tt", &value, &err)); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestInt16Parsing) { - std::string err; - int16_t value; - - // Decimal values. - EXPECT_TRUE(absl::ParseFlag("1", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0", &value, &err)); - EXPECT_EQ(value, 0); - EXPECT_TRUE(absl::ParseFlag("-1", &value, &err)); - EXPECT_EQ(value, -1); - EXPECT_TRUE(absl::ParseFlag("123", &value, &err)); - EXPECT_EQ(value, 123); - EXPECT_TRUE(absl::ParseFlag("-18765", &value, &err)); - EXPECT_EQ(value, -18765); - EXPECT_TRUE(absl::ParseFlag("+3", &value, &err)); - EXPECT_EQ(value, 3); - - // Leading zero values. - EXPECT_TRUE(absl::ParseFlag("01", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("-001", &value, &err)); - EXPECT_EQ(value, -1); - EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err)); - EXPECT_EQ(value, 100); - - // Hex values. - EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err)); - EXPECT_EQ(value, 16); - EXPECT_TRUE(absl::ParseFlag("0X234", &value, &err)); - EXPECT_EQ(value, 564); - // TODO(rogeeff): fix below validations - EXPECT_FALSE(absl::ParseFlag("-0x7FFD", &value, &err)); - EXPECT_NE(value, -3); - EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err)); - EXPECT_NE(value, 49); - - // Whitespace handling - EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err)); - EXPECT_EQ(value, 10); - EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err)); - EXPECT_EQ(value, 11); - EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err)); - EXPECT_EQ(value, 12); - EXPECT_TRUE(absl::ParseFlag(" 0x22 ", &value, &err)); - EXPECT_EQ(value, 34); - - // Invalid values. - EXPECT_FALSE(absl::ParseFlag("", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("40000", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("--1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\n", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\t", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("2U", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err)); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestUint16Parsing) { - std::string err; - uint16_t value; - - // Decimal values. - EXPECT_TRUE(absl::ParseFlag("1", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0", &value, &err)); - EXPECT_EQ(value, 0); - EXPECT_TRUE(absl::ParseFlag("123", &value, &err)); - EXPECT_EQ(value, 123); - EXPECT_TRUE(absl::ParseFlag("+3", &value, &err)); - EXPECT_EQ(value, 3); - - // Leading zero values. - EXPECT_TRUE(absl::ParseFlag("01", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("001", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err)); - EXPECT_EQ(value, 100); - - // Hex values. - EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err)); - EXPECT_EQ(value, 16); - EXPECT_TRUE(absl::ParseFlag("0X234", &value, &err)); - EXPECT_EQ(value, 564); - // TODO(rogeeff): fix below validations - EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err)); - EXPECT_NE(value, 49); - - // Whitespace handling - EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err)); - EXPECT_EQ(value, 10); - EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err)); - EXPECT_EQ(value, 11); - EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err)); - EXPECT_EQ(value, 12); - EXPECT_TRUE(absl::ParseFlag(" 0x22 ", &value, &err)); - EXPECT_EQ(value, 34); - - // Invalid values. - EXPECT_FALSE(absl::ParseFlag("", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("70000", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("-1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("--1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\n", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\t", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("2U", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err)); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestInt32Parsing) { - std::string err; - int32_t value; - - // Decimal values. - EXPECT_TRUE(absl::ParseFlag("1", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0", &value, &err)); - EXPECT_EQ(value, 0); - EXPECT_TRUE(absl::ParseFlag("-1", &value, &err)); - EXPECT_EQ(value, -1); - EXPECT_TRUE(absl::ParseFlag("123", &value, &err)); - EXPECT_EQ(value, 123); - EXPECT_TRUE(absl::ParseFlag("-98765", &value, &err)); - EXPECT_EQ(value, -98765); - EXPECT_TRUE(absl::ParseFlag("+3", &value, &err)); - EXPECT_EQ(value, 3); - - // Leading zero values. - EXPECT_TRUE(absl::ParseFlag("01", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("-001", &value, &err)); - EXPECT_EQ(value, -1); - EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err)); - EXPECT_EQ(value, 100); - - // Hex values. - EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err)); - EXPECT_EQ(value, 16); - EXPECT_TRUE(absl::ParseFlag("0X234", &value, &err)); - EXPECT_EQ(value, 564); - // TODO(rogeeff): fix below validations - EXPECT_FALSE(absl::ParseFlag("-0x7FFFFFFD", &value, &err)); - EXPECT_NE(value, -3); - EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err)); - EXPECT_NE(value, 49); - - // Whitespace handling - EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err)); - EXPECT_EQ(value, 10); - EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err)); - EXPECT_EQ(value, 11); - EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err)); - EXPECT_EQ(value, 12); - EXPECT_TRUE(absl::ParseFlag(" 0x22 ", &value, &err)); - EXPECT_EQ(value, 34); - - // Invalid values. - EXPECT_FALSE(absl::ParseFlag("", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("70000000000", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("--1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\n", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\t", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("2U", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err)); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestUint32Parsing) { - std::string err; - uint32_t value; - - // Decimal values. - EXPECT_TRUE(absl::ParseFlag("1", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0", &value, &err)); - EXPECT_EQ(value, 0); - EXPECT_TRUE(absl::ParseFlag("123", &value, &err)); - EXPECT_EQ(value, 123); - EXPECT_TRUE(absl::ParseFlag("+3", &value, &err)); - EXPECT_EQ(value, 3); - - // Leading zero values. - EXPECT_TRUE(absl::ParseFlag("01", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err)); - EXPECT_EQ(value, 100); - - // Hex values. - EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err)); - EXPECT_EQ(value, 16); - EXPECT_TRUE(absl::ParseFlag("0X234", &value, &err)); - EXPECT_EQ(value, 564); - EXPECT_TRUE(absl::ParseFlag("0xFFFFFFFD", &value, &err)); - EXPECT_EQ(value, 4294967293); - // TODO(rogeeff): fix below validations - EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err)); - EXPECT_NE(value, 49); - - // Whitespace handling - EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err)); - EXPECT_EQ(value, 10); - EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err)); - EXPECT_EQ(value, 11); - EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err)); - EXPECT_EQ(value, 12); - EXPECT_TRUE(absl::ParseFlag(" 0x22 ", &value, &err)); - EXPECT_EQ(value, 34); - - // Invalid values. - EXPECT_FALSE(absl::ParseFlag("", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("140000000000", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("-1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("--1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\n", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\t", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("2U", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err)); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestInt64Parsing) { - std::string err; - int64_t value; - - // Decimal values. - EXPECT_TRUE(absl::ParseFlag("1", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0", &value, &err)); - EXPECT_EQ(value, 0); - EXPECT_TRUE(absl::ParseFlag("-1", &value, &err)); - EXPECT_EQ(value, -1); - EXPECT_TRUE(absl::ParseFlag("123", &value, &err)); - EXPECT_EQ(value, 123); - EXPECT_TRUE(absl::ParseFlag("-98765", &value, &err)); - EXPECT_EQ(value, -98765); - EXPECT_TRUE(absl::ParseFlag("+3", &value, &err)); - EXPECT_EQ(value, 3); - - // Leading zero values. - EXPECT_TRUE(absl::ParseFlag("01", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("001", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err)); - EXPECT_EQ(value, 100); - - // Hex values. - EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err)); - EXPECT_EQ(value, 16); - EXPECT_TRUE(absl::ParseFlag("0XFFFAAABBBCCCDDD", &value, &err)); - EXPECT_EQ(value, 1152827684197027293); - // TODO(rogeeff): fix below validation - EXPECT_FALSE(absl::ParseFlag("-0x7FFFFFFFFFFFFFFE", &value, &err)); - EXPECT_NE(value, -2); - EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err)); - EXPECT_NE(value, 49); - - // Whitespace handling - EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err)); - EXPECT_EQ(value, 10); - EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err)); - EXPECT_EQ(value, 11); - EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err)); - EXPECT_EQ(value, 12); - EXPECT_TRUE(absl::ParseFlag(" 0x7F ", &value, &err)); - EXPECT_EQ(value, 127); - - // Invalid values. - EXPECT_FALSE(absl::ParseFlag("", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("0xFFFFFFFFFFFFFFFFFF", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("--1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\n", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\t", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("2U", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err)); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestUInt64Parsing) { - std::string err; - uint64_t value; - - // Decimal values. - EXPECT_TRUE(absl::ParseFlag("1", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0", &value, &err)); - EXPECT_EQ(value, 0); - EXPECT_TRUE(absl::ParseFlag("123", &value, &err)); - EXPECT_EQ(value, 123); - EXPECT_TRUE(absl::ParseFlag("+13", &value, &err)); - EXPECT_EQ(value, 13); - - // Leading zero values. - EXPECT_TRUE(absl::ParseFlag("01", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("001", &value, &err)); - EXPECT_EQ(value, 1); - EXPECT_TRUE(absl::ParseFlag("0000300", &value, &err)); - EXPECT_EQ(value, 300); - - // Hex values. - EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err)); - EXPECT_EQ(value, 16); - EXPECT_TRUE(absl::ParseFlag("0XFFFF", &value, &err)); - EXPECT_EQ(value, 65535); - // TODO(rogeeff): fix below validation - EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err)); - EXPECT_NE(value, 49); - - // Whitespace handling - EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err)); - EXPECT_EQ(value, 10); - EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err)); - EXPECT_EQ(value, 11); - EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err)); - EXPECT_EQ(value, 12); - - // Invalid values. - EXPECT_FALSE(absl::ParseFlag("", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("0xFFFFFFFFFFFFFFFFFF", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("-1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("--1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\n", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\t", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("2U", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err)); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestFloatParsing) { - std::string err; - float value; - - // Ordinary values. - EXPECT_TRUE(absl::ParseFlag("1.3", &value, &err)); - EXPECT_FLOAT_EQ(value, 1.3f); - EXPECT_TRUE(absl::ParseFlag("-0.1", &value, &err)); - EXPECT_DOUBLE_EQ(value, -0.1f); - EXPECT_TRUE(absl::ParseFlag("+0.01", &value, &err)); - EXPECT_DOUBLE_EQ(value, 0.01f); - - // Scientific values. - EXPECT_TRUE(absl::ParseFlag("1.2e3", &value, &err)); - EXPECT_DOUBLE_EQ(value, 1.2e3f); - EXPECT_TRUE(absl::ParseFlag("9.8765402e-37", &value, &err)); - EXPECT_DOUBLE_EQ(value, 9.8765402e-37f); - EXPECT_TRUE(absl::ParseFlag("0.11e+3", &value, &err)); - EXPECT_DOUBLE_EQ(value, 0.11e+3f); - EXPECT_TRUE(absl::ParseFlag("1.e-2300", &value, &err)); - EXPECT_DOUBLE_EQ(value, 0.f); - EXPECT_TRUE(absl::ParseFlag("1.e+2300", &value, &err)); - EXPECT_TRUE(std::isinf(value)); - - // Leading zero values. - EXPECT_TRUE(absl::ParseFlag("01.6", &value, &err)); - EXPECT_DOUBLE_EQ(value, 1.6f); - EXPECT_TRUE(absl::ParseFlag("000.0001", &value, &err)); - EXPECT_DOUBLE_EQ(value, 0.0001f); - - // Trailing zero values. - EXPECT_TRUE(absl::ParseFlag("-5.1000", &value, &err)); - EXPECT_DOUBLE_EQ(value, -5.1f); - - // Exceptional values. - EXPECT_TRUE(absl::ParseFlag("NaN", &value, &err)); - EXPECT_TRUE(std::isnan(value)); - EXPECT_TRUE(absl::ParseFlag("Inf", &value, &err)); - EXPECT_TRUE(std::isinf(value)); - - // Hex values - EXPECT_TRUE(absl::ParseFlag("0x10.23p12", &value, &err)); - EXPECT_DOUBLE_EQ(value, 66096.f); - EXPECT_TRUE(absl::ParseFlag("-0xF1.A3p-2", &value, &err)); - EXPECT_NEAR(value, -60.4092f, 5e-5f); - EXPECT_TRUE(absl::ParseFlag("+0x0.0AAp-12", &value, &err)); - EXPECT_NEAR(value, 1.01328e-05f, 5e-11f); - EXPECT_TRUE(absl::ParseFlag("0x.01p1", &value, &err)); - EXPECT_NEAR(value, 0.0078125f, 5e-8f); - - // Whitespace handling - EXPECT_TRUE(absl::ParseFlag("10.1 ", &value, &err)); - EXPECT_DOUBLE_EQ(value, 10.1f); - EXPECT_TRUE(absl::ParseFlag(" 2.34", &value, &err)); - EXPECT_DOUBLE_EQ(value, 2.34f); - EXPECT_TRUE(absl::ParseFlag(" 5.7 ", &value, &err)); - EXPECT_DOUBLE_EQ(value, 5.7f); - EXPECT_TRUE(absl::ParseFlag(" -0xE0.F3p01 ", &value, &err)); - EXPECT_NEAR(value, -449.8984375f, 5e-8f); - - // Invalid values. - EXPECT_FALSE(absl::ParseFlag("", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("--1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\n", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\t", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("2.3xxx", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("0x0.1pAA", &value, &err)); - // TODO(rogeeff): below assertion should fail - EXPECT_TRUE(absl::ParseFlag("0x0.1", &value, &err)); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestDoubleParsing) { - std::string err; - double value; - - // Ordinary values. - EXPECT_TRUE(absl::ParseFlag("1.3", &value, &err)); - EXPECT_DOUBLE_EQ(value, 1.3); - EXPECT_TRUE(absl::ParseFlag("-0.1", &value, &err)); - EXPECT_DOUBLE_EQ(value, -0.1); - EXPECT_TRUE(absl::ParseFlag("+0.01", &value, &err)); - EXPECT_DOUBLE_EQ(value, 0.01); - - // Scientific values. - EXPECT_TRUE(absl::ParseFlag("1.2e3", &value, &err)); - EXPECT_DOUBLE_EQ(value, 1.2e3); - EXPECT_TRUE(absl::ParseFlag("9.00000002e-123", &value, &err)); - EXPECT_DOUBLE_EQ(value, 9.00000002e-123); - EXPECT_TRUE(absl::ParseFlag("0.11e+3", &value, &err)); - EXPECT_DOUBLE_EQ(value, 0.11e+3); - EXPECT_TRUE(absl::ParseFlag("1.e-2300", &value, &err)); - EXPECT_DOUBLE_EQ(value, 0); - EXPECT_TRUE(absl::ParseFlag("1.e+2300", &value, &err)); - EXPECT_TRUE(std::isinf(value)); - - // Leading zero values. - EXPECT_TRUE(absl::ParseFlag("01.6", &value, &err)); - EXPECT_DOUBLE_EQ(value, 1.6); - EXPECT_TRUE(absl::ParseFlag("000.0001", &value, &err)); - EXPECT_DOUBLE_EQ(value, 0.0001); - - // Trailing zero values. - EXPECT_TRUE(absl::ParseFlag("-5.1000", &value, &err)); - EXPECT_DOUBLE_EQ(value, -5.1); - - // Exceptional values. - EXPECT_TRUE(absl::ParseFlag("NaN", &value, &err)); - EXPECT_TRUE(std::isnan(value)); - EXPECT_TRUE(absl::ParseFlag("nan", &value, &err)); - EXPECT_TRUE(std::isnan(value)); - EXPECT_TRUE(absl::ParseFlag("Inf", &value, &err)); - EXPECT_TRUE(std::isinf(value)); - EXPECT_TRUE(absl::ParseFlag("inf", &value, &err)); - EXPECT_TRUE(std::isinf(value)); - - // Hex values - EXPECT_TRUE(absl::ParseFlag("0x10.23p12", &value, &err)); - EXPECT_DOUBLE_EQ(value, 66096); - EXPECT_TRUE(absl::ParseFlag("-0xF1.A3p-2", &value, &err)); - EXPECT_NEAR(value, -60.4092, 5e-5); - EXPECT_TRUE(absl::ParseFlag("+0x0.0AAp-12", &value, &err)); - EXPECT_NEAR(value, 1.01328e-05, 5e-11); - EXPECT_TRUE(absl::ParseFlag("0x.01p1", &value, &err)); - EXPECT_NEAR(value, 0.0078125, 5e-8); - - // Whitespace handling - EXPECT_TRUE(absl::ParseFlag("10.1 ", &value, &err)); - EXPECT_DOUBLE_EQ(value, 10.1); - EXPECT_TRUE(absl::ParseFlag(" 2.34", &value, &err)); - EXPECT_DOUBLE_EQ(value, 2.34); - EXPECT_TRUE(absl::ParseFlag(" 5.7 ", &value, &err)); - EXPECT_DOUBLE_EQ(value, 5.7); - EXPECT_TRUE(absl::ParseFlag(" -0xE0.F3p01 ", &value, &err)); - EXPECT_NEAR(value, -449.8984375, 5e-8); - - // Invalid values. - EXPECT_FALSE(absl::ParseFlag("", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag(" ", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("--1", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\n", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("\t", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("2.3xxx", &value, &err)); - EXPECT_FALSE(absl::ParseFlag("0x0.1pAA", &value, &err)); - // TODO(rogeeff): below assertion should fail - EXPECT_TRUE(absl::ParseFlag("0x0.1", &value, &err)); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestStringParsing) { - std::string err; - std::string value; - - EXPECT_TRUE(absl::ParseFlag("", &value, &err)); - EXPECT_EQ(value, ""); - EXPECT_TRUE(absl::ParseFlag(" ", &value, &err)); - EXPECT_EQ(value, " "); - EXPECT_TRUE(absl::ParseFlag(" ", &value, &err)); - EXPECT_EQ(value, " "); - EXPECT_TRUE(absl::ParseFlag("\n", &value, &err)); - EXPECT_EQ(value, "\n"); - EXPECT_TRUE(absl::ParseFlag("\t", &value, &err)); - EXPECT_EQ(value, "\t"); - EXPECT_TRUE(absl::ParseFlag("asdfg", &value, &err)); - EXPECT_EQ(value, "asdfg"); - EXPECT_TRUE(absl::ParseFlag("asdf ghjk", &value, &err)); - EXPECT_EQ(value, "asdf ghjk"); - EXPECT_TRUE(absl::ParseFlag("a\nb\nc", &value, &err)); - EXPECT_EQ(value, "a\nb\nc"); - EXPECT_TRUE(absl::ParseFlag("asd\0fgh", &value, &err)); - EXPECT_EQ(value, "asd"); - EXPECT_TRUE(absl::ParseFlag("\\\\", &value, &err)); - EXPECT_EQ(value, "\\\\"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestVectorOfStringParsing) { - std::string err; - std::vector<std::string> value; - - EXPECT_TRUE(absl::ParseFlag("", &value, &err)); - EXPECT_EQ(value, std::vector<std::string>{}); - EXPECT_TRUE(absl::ParseFlag("1", &value, &err)); - EXPECT_EQ(value, std::vector<std::string>({"1"})); - EXPECT_TRUE(absl::ParseFlag("a,b", &value, &err)); - EXPECT_EQ(value, std::vector<std::string>({"a", "b"})); - EXPECT_TRUE(absl::ParseFlag("a,b,c,", &value, &err)); - EXPECT_EQ(value, std::vector<std::string>({"a", "b", "c", ""})); - EXPECT_TRUE(absl::ParseFlag("a,,", &value, &err)); - EXPECT_EQ(value, std::vector<std::string>({"a", "", ""})); - EXPECT_TRUE(absl::ParseFlag(",", &value, &err)); - EXPECT_EQ(value, std::vector<std::string>({"", ""})); - EXPECT_TRUE(absl::ParseFlag("a, b,c ", &value, &err)); - EXPECT_EQ(value, std::vector<std::string>({"a", " b", "c "})); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestBoolUnparsing) { - EXPECT_EQ(absl::UnparseFlag(true), "true"); - EXPECT_EQ(absl::UnparseFlag(false), "false"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestInt16Unparsing) { - int16_t value; - - value = 1; - EXPECT_EQ(absl::UnparseFlag(value), "1"); - value = 0; - EXPECT_EQ(absl::UnparseFlag(value), "0"); - value = -1; - EXPECT_EQ(absl::UnparseFlag(value), "-1"); - value = 9876; - EXPECT_EQ(absl::UnparseFlag(value), "9876"); - value = -987; - EXPECT_EQ(absl::UnparseFlag(value), "-987"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestUint16Unparsing) { - uint16_t value; - - value = 1; - EXPECT_EQ(absl::UnparseFlag(value), "1"); - value = 0; - EXPECT_EQ(absl::UnparseFlag(value), "0"); - value = 19876; - EXPECT_EQ(absl::UnparseFlag(value), "19876"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestInt32Unparsing) { - int32_t value; - - value = 1; - EXPECT_EQ(absl::UnparseFlag(value), "1"); - value = 0; - EXPECT_EQ(absl::UnparseFlag(value), "0"); - value = -1; - EXPECT_EQ(absl::UnparseFlag(value), "-1"); - value = 12345; - EXPECT_EQ(absl::UnparseFlag(value), "12345"); - value = -987; - EXPECT_EQ(absl::UnparseFlag(value), "-987"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestUint32Unparsing) { - uint32_t value; - - value = 1; - EXPECT_EQ(absl::UnparseFlag(value), "1"); - value = 0; - EXPECT_EQ(absl::UnparseFlag(value), "0"); - value = 1234500; - EXPECT_EQ(absl::UnparseFlag(value), "1234500"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestInt64Unparsing) { - int64_t value; - - value = 1; - EXPECT_EQ(absl::UnparseFlag(value), "1"); - value = 0; - EXPECT_EQ(absl::UnparseFlag(value), "0"); - value = -1; - EXPECT_EQ(absl::UnparseFlag(value), "-1"); - value = 123456789L; - EXPECT_EQ(absl::UnparseFlag(value), "123456789"); - value = -987654321L; - EXPECT_EQ(absl::UnparseFlag(value), "-987654321"); - value = 0x7FFFFFFFFFFFFFFF; - EXPECT_EQ(absl::UnparseFlag(value), "9223372036854775807"); - value = 0xFFFFFFFFFFFFFFFF; - EXPECT_EQ(absl::UnparseFlag(value), "-1"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestUint64Unparsing) { - uint64_t value; - - value = 1; - EXPECT_EQ(absl::UnparseFlag(value), "1"); - value = 0; - EXPECT_EQ(absl::UnparseFlag(value), "0"); - value = 123456789L; - EXPECT_EQ(absl::UnparseFlag(value), "123456789"); - value = 0xFFFFFFFFFFFFFFFF; - EXPECT_EQ(absl::UnparseFlag(value), "18446744073709551615"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestFloatUnparsing) { - float value; - - value = 1.1f; - EXPECT_EQ(absl::UnparseFlag(value), "1.1"); - value = 0.01f; - EXPECT_EQ(absl::UnparseFlag(value), "0.01"); - value = 1.23e-2f; - EXPECT_EQ(absl::UnparseFlag(value), "0.0123"); - value = -0.71f; - EXPECT_EQ(absl::UnparseFlag(value), "-0.71"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestDoubleUnparsing) { - double value; - - value = 1.1; - EXPECT_EQ(absl::UnparseFlag(value), "1.1"); - value = 0.01; - EXPECT_EQ(absl::UnparseFlag(value), "0.01"); - value = 1.23e-2; - EXPECT_EQ(absl::UnparseFlag(value), "0.0123"); - value = -0.71; - EXPECT_EQ(absl::UnparseFlag(value), "-0.71"); - value = -0; - EXPECT_EQ(absl::UnparseFlag(value), "0"); - value = std::nan(""); - EXPECT_EQ(absl::UnparseFlag(value), "nan"); - value = std::numeric_limits<double>::infinity(); - EXPECT_EQ(absl::UnparseFlag(value), "inf"); -} - -// -------------------------------------------------------------------- - -TEST(MarshallingTest, TestStringUnparsing) { - EXPECT_EQ(absl::UnparseFlag(""), ""); - EXPECT_EQ(absl::UnparseFlag(" "), " "); - EXPECT_EQ(absl::UnparseFlag("qwerty"), "qwerty"); - EXPECT_EQ(absl::UnparseFlag("ASDFGH"), "ASDFGH"); - EXPECT_EQ(absl::UnparseFlag("\n\t "), "\n\t "); -} - -// -------------------------------------------------------------------- - -template <typename T> -void TestRoundtrip(T v) { - T new_v; - std::string err; - EXPECT_TRUE(absl::ParseFlag(absl::UnparseFlag(v), &new_v, &err)); - EXPECT_EQ(new_v, v); -} - -TEST(MarshallingTest, TestFloatRoundTrip) { - TestRoundtrip(0.1f); - TestRoundtrip(0.12f); - TestRoundtrip(0.123f); - TestRoundtrip(0.1234f); - TestRoundtrip(0.12345f); - TestRoundtrip(0.123456f); - TestRoundtrip(0.1234567f); - TestRoundtrip(0.12345678f); - - TestRoundtrip(0.1e20f); - TestRoundtrip(0.12e20f); - TestRoundtrip(0.123e20f); - TestRoundtrip(0.1234e20f); - TestRoundtrip(0.12345e20f); - TestRoundtrip(0.123456e20f); - TestRoundtrip(0.1234567e20f); - TestRoundtrip(0.12345678e20f); - - TestRoundtrip(0.1e-20f); - TestRoundtrip(0.12e-20f); - TestRoundtrip(0.123e-20f); - TestRoundtrip(0.1234e-20f); - TestRoundtrip(0.12345e-20f); - TestRoundtrip(0.123456e-20f); - TestRoundtrip(0.1234567e-20f); - TestRoundtrip(0.12345678e-20f); -} - -TEST(MarshallingTest, TestDoubleRoundTrip) { - TestRoundtrip(0.1); - TestRoundtrip(0.12); - TestRoundtrip(0.123); - TestRoundtrip(0.1234); - TestRoundtrip(0.12345); - TestRoundtrip(0.123456); - TestRoundtrip(0.1234567); - TestRoundtrip(0.12345678); - TestRoundtrip(0.123456789); - TestRoundtrip(0.1234567891); - TestRoundtrip(0.12345678912); - TestRoundtrip(0.123456789123); - TestRoundtrip(0.1234567891234); - TestRoundtrip(0.12345678912345); - TestRoundtrip(0.123456789123456); - TestRoundtrip(0.1234567891234567); - TestRoundtrip(0.12345678912345678); - - TestRoundtrip(0.1e50); - TestRoundtrip(0.12e50); - TestRoundtrip(0.123e50); - TestRoundtrip(0.1234e50); - TestRoundtrip(0.12345e50); - TestRoundtrip(0.123456e50); - TestRoundtrip(0.1234567e50); - TestRoundtrip(0.12345678e50); - TestRoundtrip(0.123456789e50); - TestRoundtrip(0.1234567891e50); - TestRoundtrip(0.12345678912e50); - TestRoundtrip(0.123456789123e50); - TestRoundtrip(0.1234567891234e50); - TestRoundtrip(0.12345678912345e50); - TestRoundtrip(0.123456789123456e50); - TestRoundtrip(0.1234567891234567e50); - TestRoundtrip(0.12345678912345678e50); - - TestRoundtrip(0.1e-50); - TestRoundtrip(0.12e-50); - TestRoundtrip(0.123e-50); - TestRoundtrip(0.1234e-50); - TestRoundtrip(0.12345e-50); - TestRoundtrip(0.123456e-50); - TestRoundtrip(0.1234567e-50); - TestRoundtrip(0.12345678e-50); - TestRoundtrip(0.123456789e-50); - TestRoundtrip(0.1234567891e-50); - TestRoundtrip(0.12345678912e-50); - TestRoundtrip(0.123456789123e-50); - TestRoundtrip(0.1234567891234e-50); - TestRoundtrip(0.12345678912345e-50); - TestRoundtrip(0.123456789123456e-50); - TestRoundtrip(0.1234567891234567e-50); - TestRoundtrip(0.12345678912345678e-50); -} - -} // namespace diff --git a/third_party/abseil_cpp/absl/flags/parse.cc b/third_party/abseil_cpp/absl/flags/parse.cc deleted file mode 100644 index dd1a6796cabd..000000000000 --- a/third_party/abseil_cpp/absl/flags/parse.cc +++ /dev/null @@ -1,823 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/parse.h" - -#include <stdlib.h> - -#include <algorithm> -#include <fstream> -#include <iostream> -#include <iterator> -#include <string> -#include <tuple> -#include <utility> -#include <vector> - -#ifdef _WIN32 -#include <windows.h> -#endif - -#include "absl/base/attributes.h" -#include "absl/base/config.h" -#include "absl/base/const_init.h" -#include "absl/base/thread_annotations.h" -#include "absl/flags/commandlineflag.h" -#include "absl/flags/config.h" -#include "absl/flags/flag.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/flags/internal/flag.h" -#include "absl/flags/internal/parse.h" -#include "absl/flags/internal/private_handle_accessor.h" -#include "absl/flags/internal/program_name.h" -#include "absl/flags/internal/usage.h" -#include "absl/flags/reflection.h" -#include "absl/flags/usage.h" -#include "absl/flags/usage_config.h" -#include "absl/strings/ascii.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/string_view.h" -#include "absl/strings/strip.h" -#include "absl/synchronization/mutex.h" - -// -------------------------------------------------------------------- - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { -namespace { - -ABSL_CONST_INIT absl::Mutex processing_checks_guard(absl::kConstInit); - -ABSL_CONST_INIT bool flagfile_needs_processing - ABSL_GUARDED_BY(processing_checks_guard) = false; -ABSL_CONST_INIT bool fromenv_needs_processing - ABSL_GUARDED_BY(processing_checks_guard) = false; -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 -} // namespace absl - -ABSL_FLAG(std::vector<std::string>, flagfile, {}, - "comma-separated list of files to load flags from") - .OnUpdate([]() { - if (absl::GetFlag(FLAGS_flagfile).empty()) return; - - absl::MutexLock l(&absl::flags_internal::processing_checks_guard); - - // Setting this flag twice before it is handled most likely an internal - // error and should be reviewed by developers. - if (absl::flags_internal::flagfile_needs_processing) { - ABSL_INTERNAL_LOG(WARNING, "flagfile set twice before it is handled"); - } - - absl::flags_internal::flagfile_needs_processing = true; - }); -ABSL_FLAG(std::vector<std::string>, fromenv, {}, - "comma-separated list of flags to set from the environment" - " [use 'export FLAGS_flag1=value']") - .OnUpdate([]() { - if (absl::GetFlag(FLAGS_fromenv).empty()) return; - - absl::MutexLock l(&absl::flags_internal::processing_checks_guard); - - // Setting this flag twice before it is handled most likely an internal - // error and should be reviewed by developers. - if (absl::flags_internal::fromenv_needs_processing) { - ABSL_INTERNAL_LOG(WARNING, "fromenv set twice before it is handled."); - } - - absl::flags_internal::fromenv_needs_processing = true; - }); -ABSL_FLAG(std::vector<std::string>, tryfromenv, {}, - "comma-separated list of flags to try to set from the environment if " - "present") - .OnUpdate([]() { - if (absl::GetFlag(FLAGS_tryfromenv).empty()) return; - - absl::MutexLock l(&absl::flags_internal::processing_checks_guard); - - // Setting this flag twice before it is handled most likely an internal - // error and should be reviewed by developers. - if (absl::flags_internal::tryfromenv_needs_processing) { - ABSL_INTERNAL_LOG(WARNING, - "tryfromenv set twice before it is handled."); - } - - absl::flags_internal::tryfromenv_needs_processing = true; - }); - -ABSL_FLAG(std::vector<std::string>, undefok, {}, - "comma-separated list of flag names that it is okay to specify " - "on the command line even if the program does not define a flag " - "with that name"); - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -namespace { - -class ArgsList { - public: - ArgsList() : next_arg_(0) {} - ArgsList(int argc, char* argv[]) : args_(argv, argv + argc), next_arg_(0) {} - explicit ArgsList(const std::vector<std::string>& args) - : args_(args), next_arg_(0) {} - - // Returns success status: true if parsing successful, false otherwise. - bool ReadFromFlagfile(const std::string& flag_file_name); - - int Size() const { return args_.size() - next_arg_; } - int FrontIndex() const { return next_arg_; } - absl::string_view Front() const { return args_[next_arg_]; } - void PopFront() { next_arg_++; } - - private: - std::vector<std::string> args_; - int next_arg_; -}; - -bool ArgsList::ReadFromFlagfile(const std::string& flag_file_name) { - std::ifstream flag_file(flag_file_name); - - if (!flag_file) { - flags_internal::ReportUsageError( - absl::StrCat("Can't open flagfile ", flag_file_name), true); - - return false; - } - - // This argument represents fake argv[0], which should be present in all arg - // lists. - args_.push_back(""); - - std::string line; - bool success = true; - - while (std::getline(flag_file, line)) { - absl::string_view stripped = absl::StripLeadingAsciiWhitespace(line); - - if (stripped.empty() || stripped[0] == '#') { - // Comment or empty line; just ignore. - continue; - } - - if (stripped[0] == '-') { - if (stripped == "--") { - flags_internal::ReportUsageError( - "Flagfile can't contain position arguments or --", true); - - success = false; - break; - } - - args_.push_back(std::string(stripped)); - continue; - } - - flags_internal::ReportUsageError( - absl::StrCat("Unexpected line in the flagfile ", flag_file_name, ": ", - line), - true); - - success = false; - } - - return success; -} - -// -------------------------------------------------------------------- - -// Reads the environment variable with name `name` and stores results in -// `value`. If variable is not present in environment returns false, otherwise -// returns true. -bool GetEnvVar(const char* var_name, std::string& var_value) { -#ifdef _WIN32 - char buf[1024]; - auto get_res = GetEnvironmentVariableA(var_name, buf, sizeof(buf)); - if (get_res >= sizeof(buf)) { - return false; - } - - if (get_res == 0) { - return false; - } - - var_value = std::string(buf, get_res); -#else - const char* val = ::getenv(var_name); - if (val == nullptr) { - return false; - } - - var_value = val; -#endif - - return true; -} - -// -------------------------------------------------------------------- - -// Returns: -// Flag name or empty if arg= -- -// Flag value after = in --flag=value (empty if --foo) -// "Is empty value" status. True if arg= --foo=, false otherwise. This is -// required to separate --foo from --foo=. -// For example: -// arg return values -// "--foo=bar" -> {"foo", "bar", false}. -// "--foo" -> {"foo", "", false}. -// "--foo=" -> {"foo", "", true}. -std::tuple<absl::string_view, absl::string_view, bool> SplitNameAndValue( - absl::string_view arg) { - // Allow -foo and --foo - absl::ConsumePrefix(&arg, "-"); - - if (arg.empty()) { - return std::make_tuple("", "", false); - } - - auto equal_sign_pos = arg.find("="); - - absl::string_view flag_name = arg.substr(0, equal_sign_pos); - - absl::string_view value; - bool is_empty_value = false; - - if (equal_sign_pos != absl::string_view::npos) { - value = arg.substr(equal_sign_pos + 1); - is_empty_value = value.empty(); - } - - return std::make_tuple(flag_name, value, is_empty_value); -} - -// -------------------------------------------------------------------- - -// Returns: -// found flag or nullptr -// is negative in case of --nofoo -std::tuple<CommandLineFlag*, bool> LocateFlag(absl::string_view flag_name) { - CommandLineFlag* flag = absl::FindCommandLineFlag(flag_name); - bool is_negative = false; - - if (!flag && absl::ConsumePrefix(&flag_name, "no")) { - flag = absl::FindCommandLineFlag(flag_name); - is_negative = true; - } - - return std::make_tuple(flag, is_negative); -} - -// -------------------------------------------------------------------- - -// Verify that default values of typed flags must be convertible to string and -// back. -void CheckDefaultValuesParsingRoundtrip() { -#ifndef NDEBUG - flags_internal::ForEachFlag([&](CommandLineFlag& flag) { - if (flag.IsRetired()) return; - -#define ABSL_FLAGS_INTERNAL_IGNORE_TYPE(T, _) \ - if (flag.IsOfType<T>()) return; - - ABSL_FLAGS_INTERNAL_SUPPORTED_TYPES(ABSL_FLAGS_INTERNAL_IGNORE_TYPE) -#undef ABSL_FLAGS_INTERNAL_IGNORE_TYPE - - flags_internal::PrivateHandleAccessor::CheckDefaultValueParsingRoundtrip( - flag); - }); -#endif -} - -// -------------------------------------------------------------------- - -// Returns success status, which is true if we successfully read all flag files, -// in which case new ArgLists are appended to the input_args in a reverse order -// of file names in the input flagfiles list. This order ensures that flags from -// the first flagfile in the input list are processed before the second flagfile -// etc. -bool ReadFlagfiles(const std::vector<std::string>& flagfiles, - std::vector<ArgsList>& input_args) { - bool success = true; - for (auto it = flagfiles.rbegin(); it != flagfiles.rend(); ++it) { - ArgsList al; - - if (al.ReadFromFlagfile(*it)) { - input_args.push_back(al); - } else { - success = false; - } - } - - return success; -} - -// Returns success status, which is true if were able to locate all environment -// variables correctly or if fail_on_absent_in_env is false. The environment -// variable names are expected to be of the form `FLAGS_<flag_name>`, where -// `flag_name` is a string from the input flag_names list. If successful we -// append a single ArgList at the end of the input_args. -bool ReadFlagsFromEnv(const std::vector<std::string>& flag_names, - std::vector<ArgsList>& input_args, - bool fail_on_absent_in_env) { - bool success = true; - std::vector<std::string> args; - - // This argument represents fake argv[0], which should be present in all arg - // lists. - args.push_back(""); - - for (const auto& flag_name : flag_names) { - // Avoid infinite recursion. - if (flag_name == "fromenv" || flag_name == "tryfromenv") { - flags_internal::ReportUsageError( - absl::StrCat("Infinite recursion on flag ", flag_name), true); - - success = false; - continue; - } - - const std::string envname = absl::StrCat("FLAGS_", flag_name); - std::string envval; - if (!GetEnvVar(envname.c_str(), envval)) { - if (fail_on_absent_in_env) { - flags_internal::ReportUsageError( - absl::StrCat(envname, " not found in environment"), true); - - success = false; - } - - continue; - } - - args.push_back(absl::StrCat("--", flag_name, "=", envval)); - } - - if (success) { - input_args.emplace_back(args); - } - - return success; -} - -// -------------------------------------------------------------------- - -// Returns success status, which is true if were able to handle all generator -// flags (flagfile, fromenv, tryfromemv) successfully. -bool HandleGeneratorFlags(std::vector<ArgsList>& input_args, - std::vector<std::string>& flagfile_value) { - bool success = true; - - absl::MutexLock l(&flags_internal::processing_checks_guard); - - // flagfile could have been set either on a command line or - // programmatically before invoking ParseCommandLine. Note that we do not - // actually process arguments specified in the flagfile, but instead - // create a secondary arguments list to be processed along with the rest - // of the comamnd line arguments. Since we always the process most recently - // created list of arguments first, this will result in flagfile argument - // being processed before any other argument in the command line. If - // FLAGS_flagfile contains more than one file name we create multiple new - // levels of arguments in a reverse order of file names. Thus we always - // process arguments from first file before arguments containing in a - // second file, etc. If flagfile contains another - // --flagfile inside of it, it will produce new level of arguments and - // processed before the rest of the flagfile. We are also collecting all - // flagfiles set on original command line. Unlike the rest of the flags, - // this flag can be set multiple times and is expected to be handled - // multiple times. We are collecting them all into a single list and set - // the value of FLAGS_flagfile to that value at the end of the parsing. - if (flags_internal::flagfile_needs_processing) { - auto flagfiles = absl::GetFlag(FLAGS_flagfile); - - if (input_args.size() == 1) { - flagfile_value.insert(flagfile_value.end(), flagfiles.begin(), - flagfiles.end()); - } - - success &= ReadFlagfiles(flagfiles, input_args); - - flags_internal::flagfile_needs_processing = false; - } - - // Similar to flagfile fromenv/tryfromemv can be set both - // programmatically and at runtime on a command line. Unlike flagfile these - // can't be recursive. - if (flags_internal::fromenv_needs_processing) { - auto flags_list = absl::GetFlag(FLAGS_fromenv); - - success &= ReadFlagsFromEnv(flags_list, input_args, true); - - flags_internal::fromenv_needs_processing = false; - } - - if (flags_internal::tryfromenv_needs_processing) { - auto flags_list = absl::GetFlag(FLAGS_tryfromenv); - - success &= ReadFlagsFromEnv(flags_list, input_args, false); - - flags_internal::tryfromenv_needs_processing = false; - } - - return success; -} - -// -------------------------------------------------------------------- - -void ResetGeneratorFlags(const std::vector<std::string>& flagfile_value) { - // Setting flagfile to the value which collates all the values set on a - // command line and programmatically. So if command line looked like - // --flagfile=f1 --flagfile=f2 the final value of the FLAGS_flagfile flag is - // going to be {"f1", "f2"} - if (!flagfile_value.empty()) { - absl::SetFlag(&FLAGS_flagfile, flagfile_value); - absl::MutexLock l(&flags_internal::processing_checks_guard); - flags_internal::flagfile_needs_processing = false; - } - - // fromenv/tryfromenv are set to <undefined> value. - if (!absl::GetFlag(FLAGS_fromenv).empty()) { - absl::SetFlag(&FLAGS_fromenv, {}); - } - if (!absl::GetFlag(FLAGS_tryfromenv).empty()) { - absl::SetFlag(&FLAGS_tryfromenv, {}); - } - - absl::MutexLock l(&flags_internal::processing_checks_guard); - flags_internal::fromenv_needs_processing = false; - flags_internal::tryfromenv_needs_processing = false; -} - -// -------------------------------------------------------------------- - -// Returns: -// success status -// deduced value -// We are also mutating curr_list in case if we need to get a hold of next -// argument in the input. -std::tuple<bool, absl::string_view> DeduceFlagValue(const CommandLineFlag& flag, - absl::string_view value, - bool is_negative, - bool is_empty_value, - ArgsList* curr_list) { - // Value is either an argument suffix after `=` in "--foo=<value>" - // or separate argument in case of "--foo" "<value>". - - // boolean flags have these forms: - // --foo - // --nofoo - // --foo=true - // --foo=false - // --nofoo=<value> is not supported - // --foo <value> is not supported - - // non boolean flags have these forms: - // --foo=<value> - // --foo <value> - // --nofoo is not supported - - if (flag.IsOfType<bool>()) { - if (value.empty()) { - if (is_empty_value) { - // "--bool_flag=" case - flags_internal::ReportUsageError( - absl::StrCat( - "Missing the value after assignment for the boolean flag '", - flag.Name(), "'"), - true); - return std::make_tuple(false, ""); - } - - // "--bool_flag" case - value = is_negative ? "0" : "1"; - } else if (is_negative) { - // "--nobool_flag=Y" case - flags_internal::ReportUsageError( - absl::StrCat("Negative form with assignment is not valid for the " - "boolean flag '", - flag.Name(), "'"), - true); - return std::make_tuple(false, ""); - } - } else if (is_negative) { - // "--noint_flag=1" case - flags_internal::ReportUsageError( - absl::StrCat("Negative form is not valid for the flag '", flag.Name(), - "'"), - true); - return std::make_tuple(false, ""); - } else if (value.empty() && (!is_empty_value)) { - if (curr_list->Size() == 1) { - // "--int_flag" case - flags_internal::ReportUsageError( - absl::StrCat("Missing the value for the flag '", flag.Name(), "'"), - true); - return std::make_tuple(false, ""); - } - - // "--int_flag" "10" case - curr_list->PopFront(); - value = curr_list->Front(); - - // Heuristic to detect the case where someone treats a string arg - // like a bool or just forgets to pass a value: - // --my_string_var --foo=bar - // We look for a flag of string type, whose value begins with a - // dash and corresponds to known flag or standalone --. - if (!value.empty() && value[0] == '-' && flag.IsOfType<std::string>()) { - auto maybe_flag_name = std::get<0>(SplitNameAndValue(value.substr(1))); - - if (maybe_flag_name.empty() || - std::get<0>(LocateFlag(maybe_flag_name)) != nullptr) { - // "--string_flag" "--known_flag" case - ABSL_INTERNAL_LOG( - WARNING, - absl::StrCat("Did you really mean to set flag '", flag.Name(), - "' to the value '", value, "'?")); - } - } - } - - return std::make_tuple(true, value); -} - -// -------------------------------------------------------------------- - -bool CanIgnoreUndefinedFlag(absl::string_view flag_name) { - auto undefok = absl::GetFlag(FLAGS_undefok); - if (std::find(undefok.begin(), undefok.end(), flag_name) != undefok.end()) { - return true; - } - - if (absl::ConsumePrefix(&flag_name, "no") && - std::find(undefok.begin(), undefok.end(), flag_name) != undefok.end()) { - return true; - } - - return false; -} - -} // namespace - -// -------------------------------------------------------------------- - -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, - OnUndefinedFlag on_undef_flag) { - ABSL_INTERNAL_CHECK(argc > 0, "Missing argv[0]"); - - // Once parsing has started we will not have more flag registrations. - // If we did, they would be missing during parsing, which is a problem on - // itself. - flags_internal::FinalizeRegistry(); - - // This routine does not return anything since we abort on failure. - CheckDefaultValuesParsingRoundtrip(); - - std::vector<std::string> flagfile_value; - - std::vector<ArgsList> input_args; - input_args.push_back(ArgsList(argc, argv)); - - std::vector<char*> output_args; - std::vector<char*> positional_args; - output_args.reserve(argc); - - // This is the list of undefined flags. The element of the list is the pair - // consisting of boolean indicating if flag came from command line (vs from - // some flag file we've read) and flag name. - // TODO(rogeeff): Eliminate the first element in the pair after cleanup. - std::vector<std::pair<bool, std::string>> undefined_flag_names; - - // Set program invocation name if it is not set before. - if (ProgramInvocationName() == "UNKNOWN") { - flags_internal::SetProgramInvocationName(argv[0]); - } - 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). - bool success = true; - while (!input_args.empty()) { - // 10. First we process the built-in generator flags. - success &= HandleGeneratorFlags(input_args, flagfile_value); - - // 30. Select top-most (most recent) arguments list. If it is empty drop it - // and re-try. - ArgsList& curr_list = input_args.back(); - - curr_list.PopFront(); - - if (curr_list.Size() == 0) { - input_args.pop_back(); - continue; - } - - // 40. Pick up the front remaining argument in the current list. If current - // stack of argument lists contains only one element - we are processing an - // argument from the original argv. - absl::string_view arg(curr_list.Front()); - bool arg_from_argv = input_args.size() == 1; - - // 50. If argument does not start with - or is just "-" - this is - // positional argument. - if (!absl::ConsumePrefix(&arg, "-") || arg.empty()) { - ABSL_INTERNAL_CHECK(arg_from_argv, - "Flagfile cannot contain positional argument"); - - positional_args.push_back(argv[curr_list.FrontIndex()]); - continue; - } - - if (arg_from_argv && (arg_list_act == ArgvListAction::kKeepParsedArgs)) { - output_args.push_back(argv[curr_list.FrontIndex()]); - } - - // 60. Split the current argument on '=' to figure out the argument - // name and value. If flag name is empty it means we've got "--". value - // can be empty either if there were no '=' in argument string at all or - // an argument looked like "--foo=". In a latter case is_empty_value is - // true. - absl::string_view flag_name; - absl::string_view value; - bool is_empty_value = false; - - std::tie(flag_name, value, is_empty_value) = SplitNameAndValue(arg); - - // 70. "--" alone means what it does for GNU: stop flags parsing. We do - // not support positional arguments in flagfiles, so we just drop them. - if (flag_name.empty()) { - ABSL_INTERNAL_CHECK(arg_from_argv, - "Flagfile cannot contain positional argument"); - - curr_list.PopFront(); - break; - } - - // 80. Locate the flag based on flag name. Handle both --foo and --nofoo - CommandLineFlag* flag = nullptr; - bool is_negative = false; - std::tie(flag, is_negative) = LocateFlag(flag_name); - - if (flag == nullptr) { - // Usage flags are not modeled as Abseil flags. Locate them separately. - if (flags_internal::DeduceUsageFlags(flag_name, value)) { - continue; - } - - if (on_undef_flag != OnUndefinedFlag::kIgnoreUndefined) { - undefined_flag_names.emplace_back(arg_from_argv, - std::string(flag_name)); - } - continue; - } - - // 90. Deduce flag's value (from this or next argument) - auto curr_index = curr_list.FrontIndex(); - bool value_success = true; - std::tie(value_success, value) = - DeduceFlagValue(*flag, value, is_negative, is_empty_value, &curr_list); - success &= value_success; - - // If above call consumed an argument, it was a standalone value - if (arg_from_argv && (arg_list_act == ArgvListAction::kKeepParsedArgs) && - (curr_index != curr_list.FrontIndex())) { - output_args.push_back(argv[curr_list.FrontIndex()]); - } - - // 100. Set the located flag to a new new value, unless it is retired. - // Setting retired flag fails, but we ignoring it here while also reporting - // access to retired flag. - std::string error; - if (!flags_internal::PrivateHandleAccessor::ParseFrom( - *flag, value, SET_FLAGS_VALUE, kCommandLine, error)) { - if (flag->IsRetired()) continue; - - flags_internal::ReportUsageError(error, true); - success = false; - } else { - specified_flags->push_back(flag); - } - } - - for (const auto& flag_name : undefined_flag_names) { - if (CanIgnoreUndefinedFlag(flag_name.second)) continue; - - flags_internal::ReportUsageError( - absl::StrCat("Unknown command line flag '", flag_name.second, "'"), - true); - - success = false; - } - -#if ABSL_FLAGS_STRIP_NAMES - if (!success) { - flags_internal::ReportUsageError( - "NOTE: command line flags are disabled in this build", true); - } -#endif - - if (!success) { - flags_internal::HandleUsageFlags(std::cout, - ProgramUsageMessage()); - std::exit(1); - } - - if (usage_flag_act == UsageFlagsAction::kHandleUsage) { - int exit_code = flags_internal::HandleUsageFlags( - std::cout, ProgramUsageMessage()); - - if (exit_code != -1) { - std::exit(exit_code); - } - } - - ResetGeneratorFlags(flagfile_value); - - // Reinstate positional args which were intermixed with flags in the arguments - // list. - for (auto arg : positional_args) { - output_args.push_back(arg); - } - - // All the remaining arguments are positional. - if (!input_args.empty()) { - for (int arg_index = input_args.back().FrontIndex(); arg_index < argc; - ++arg_index) { - output_args.push_back(argv[arg_index]); - } - } - - // Trim and sort the vector. - specified_flags->shrink_to_fit(); - std::sort(specified_flags->begin(), specified_flags->end(), - SpecifiedFlagsCompare{}); - return output_args; -} - -} // namespace flags_internal - -// -------------------------------------------------------------------- - -std::vector<char*> ParseCommandLine(int argc, char* argv[]) { - return flags_internal::ParseCommandLineImpl( - argc, argv, flags_internal::ArgvListAction::kRemoveParsedArgs, - flags_internal::UsageFlagsAction::kHandleUsage, - flags_internal::OnUndefinedFlag::kAbortIfUndefined); -} - -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/parse.h b/third_party/abseil_cpp/absl/flags/parse.h deleted file mode 100644 index 929de2cb40de..000000000000 --- a/third_party/abseil_cpp/absl/flags/parse.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ----------------------------------------------------------------------------- -// File: parse.h -// ----------------------------------------------------------------------------- -// -// This file defines the main parsing function for Abseil flags: -// `absl::ParseCommandLine()`. - -#ifndef ABSL_FLAGS_PARSE_H_ -#define ABSL_FLAGS_PARSE_H_ - -#include <vector> - -#include "absl/base/config.h" -#include "absl/flags/internal/parse.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN - -// ParseCommandLine() -// -// Parses the set of command-line arguments passed in the `argc` (argument -// count) and `argv[]` (argument vector) parameters from `main()`, assigning -// values to any defined Abseil flags. (Any arguments passed after the -// flag-terminating delimiter (`--`) are treated as positional arguments and -// ignored.) -// -// Any command-line flags (and arguments to those flags) are parsed into Abseil -// Flag values, if those flags are defined. Any undefined flags will either -// return an error, or be ignored if that flag is designated using `undefok` to -// indicate "undefined is OK." -// -// Any command-line positional arguments not part of any command-line flag (or -// arguments to a flag) are returned in a vector, with the program invocation -// name at position 0 of that vector. (Note that this includes positional -// arguments after the flag-terminating delimiter `--`.) -// -// After all flags and flag arguments are parsed, this function looks for any -// built-in usage flags (e.g. `--help`), and if any were specified, it reports -// help messages and then exits the program. -std::vector<char*> ParseCommandLine(int argc, char* argv[]); - -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_PARSE_H_ diff --git a/third_party/abseil_cpp/absl/flags/parse_test.cc b/third_party/abseil_cpp/absl/flags/parse_test.cc deleted file mode 100644 index 41bc0bc6b3a4..000000000000 --- a/third_party/abseil_cpp/absl/flags/parse_test.cc +++ /dev/null @@ -1,929 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/parse.h" - -#include <stdlib.h> - -#include <fstream> -#include <string> -#include <vector> - -#include "gmock/gmock.h" -#include "gtest/gtest.h" -#include "absl/base/internal/raw_logging.h" -#include "absl/base/internal/scoped_set_env.h" -#include "absl/flags/declare.h" -#include "absl/flags/flag.h" -#include "absl/flags/internal/parse.h" -#include "absl/flags/internal/usage.h" -#include "absl/flags/reflection.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/string_view.h" -#include "absl/strings/substitute.h" -#include "absl/types/span.h" - -#ifdef _WIN32 -#include <windows.h> -#endif - -namespace { - -using absl::base_internal::ScopedSetEnv; - -struct UDT { - UDT() = default; - UDT(const UDT&) = default; - UDT(int v) : value(v) {} // NOLINT - - int value; -}; - -bool AbslParseFlag(absl::string_view in, UDT* udt, std::string* err) { - if (in == "A") { - udt->value = 1; - return true; - } - if (in == "AAA") { - udt->value = 10; - return true; - } - - *err = "Use values A, AAA instead"; - return false; -} -std::string AbslUnparseFlag(const UDT& udt) { - return udt.value == 1 ? "A" : "AAA"; -} - -std::string GetTestTmpDirEnvVar(const char* const env_var_name) { -#ifdef _WIN32 - char buf[MAX_PATH]; - auto get_res = GetEnvironmentVariableA(env_var_name, buf, sizeof(buf)); - if (get_res >= sizeof(buf) || get_res == 0) { - return ""; - } - - return std::string(buf, get_res); -#else - const char* val = ::getenv(env_var_name); - if (val == nullptr) { - return ""; - } - - return val; -#endif -} - -const std::string& GetTestTempDir() { - static std::string* temp_dir_name = []() -> std::string* { - std::string* res = new std::string(GetTestTmpDirEnvVar("TEST_TMPDIR")); - - if (res->empty()) { - *res = GetTestTmpDirEnvVar("TMPDIR"); - } - - if (res->empty()) { -#ifdef _WIN32 - char temp_path_buffer[MAX_PATH]; - - auto len = GetTempPathA(MAX_PATH, temp_path_buffer); - if (len < MAX_PATH && len != 0) { - std::string temp_dir_name = temp_path_buffer; - if (!absl::EndsWith(temp_dir_name, "\\")) { - temp_dir_name.push_back('\\'); - } - absl::StrAppend(&temp_dir_name, "parse_test.", GetCurrentProcessId()); - if (CreateDirectoryA(temp_dir_name.c_str(), nullptr)) { - *res = temp_dir_name; - } - } -#else - char temp_dir_template[] = "/tmp/parse_test.XXXXXX"; - if (auto* unique_name = ::mkdtemp(temp_dir_template)) { - *res = unique_name; - } -#endif - } - - if (res->empty()) { - ABSL_INTERNAL_LOG(FATAL, - "Failed to make temporary directory for data files"); - } - -#ifdef _WIN32 - *res += "\\"; -#else - *res += "/"; -#endif - - return res; - }(); - - return *temp_dir_name; -} - -struct FlagfileData { - const absl::string_view file_name; - const absl::Span<const char* const> file_lines; -}; - -// clang-format off -constexpr const char* const ff1_data[] = { - "# comment ", - " # comment ", - "", - " ", - "--int_flag=-1", - " --string_flag=q2w2 ", - " ## ", - " --double_flag=0.1", - "--bool_flag=Y " -}; - -constexpr const char* const ff2_data[] = { - "# Setting legacy flag", - "--legacy_int=1111", - "--legacy_bool", - "--nobool_flag", - "--legacy_str=aqsw", - "--int_flag=100", - " ## =============" -}; -// clang-format on - -// Builds flagfile flag in the flagfile_flag buffer and returns it. This -// function also creates a temporary flagfile based on FlagfileData input. -// We create a flagfile in a temporary directory with the name specified in -// FlagfileData and populate it with lines specifed in FlagfileData. If $0 is -// referenced in any of the lines in FlagfileData they are replaced with -// temporary directory location. This way we can test inclusion of one flagfile -// from another flagfile. -const char* GetFlagfileFlag(const std::vector<FlagfileData>& ffd, - std::string& flagfile_flag) { - flagfile_flag = "--flagfile="; - absl::string_view separator; - for (const auto& flagfile_data : ffd) { - std::string flagfile_name = - absl::StrCat(GetTestTempDir(), flagfile_data.file_name); - - std::ofstream flagfile_out(flagfile_name); - for (auto line : flagfile_data.file_lines) { - flagfile_out << absl::Substitute(line, GetTestTempDir()) << "\n"; - } - - absl::StrAppend(&flagfile_flag, separator, flagfile_name); - separator = ","; - } - - return flagfile_flag.c_str(); -} - -} // namespace - -ABSL_FLAG(int, int_flag, 1, ""); -ABSL_FLAG(double, double_flag, 1.1, ""); -ABSL_FLAG(std::string, string_flag, "a", ""); -ABSL_FLAG(bool, bool_flag, false, ""); -ABSL_FLAG(UDT, udt_flag, -1, ""); -ABSL_RETIRED_FLAG(int, legacy_int, 1, ""); -ABSL_RETIRED_FLAG(bool, legacy_bool, false, ""); -ABSL_RETIRED_FLAG(std::string, legacy_str, "l", ""); - -namespace { - -namespace flags = absl::flags_internal; -using testing::ElementsAreArray; - -class ParseTest : public testing::Test { - public: - ~ParseTest() override { flags::SetFlagsHelpMode(flags::HelpMode::kNone); } - - private: - absl::FlagSaver flag_saver_; -}; - -// -------------------------------------------------------------------- - -template <int N> -std::vector<char*> InvokeParse(const char* (&in_argv)[N]) { - return absl::ParseCommandLine(N, const_cast<char**>(in_argv)); -} - -// -------------------------------------------------------------------- - -template <int N> -void TestParse(const char* (&in_argv)[N], int int_flag_value, - double double_flag_val, absl::string_view string_flag_val, - bool bool_flag_val, int exp_position_args = 0) { - auto out_args = InvokeParse(in_argv); - - EXPECT_EQ(out_args.size(), 1 + exp_position_args); - EXPECT_STREQ(out_args[0], "testbin"); - - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), int_flag_value); - EXPECT_NEAR(absl::GetFlag(FLAGS_double_flag), double_flag_val, 0.0001); - EXPECT_EQ(absl::GetFlag(FLAGS_string_flag), string_flag_val); - EXPECT_EQ(absl::GetFlag(FLAGS_bool_flag), bool_flag_val); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestEmptyArgv) { - const char* in_argv[] = {"testbin"}; - - auto out_args = InvokeParse(in_argv); - - EXPECT_EQ(out_args.size(), 1); - EXPECT_STREQ(out_args[0], "testbin"); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestValidIntArg) { - const char* in_args1[] = { - "testbin", - "--int_flag=10", - }; - TestParse(in_args1, 10, 1.1, "a", false); - - const char* in_args2[] = { - "testbin", - "-int_flag=020", - }; - TestParse(in_args2, 20, 1.1, "a", false); - - const char* in_args3[] = { - "testbin", - "--int_flag", - "-30", - }; - TestParse(in_args3, -30, 1.1, "a", false); - - const char* in_args4[] = { - "testbin", - "-int_flag", - "0x21", - }; - TestParse(in_args4, 33, 1.1, "a", false); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestValidDoubleArg) { - const char* in_args1[] = { - "testbin", - "--double_flag=2.3", - }; - TestParse(in_args1, 1, 2.3, "a", false); - - const char* in_args2[] = { - "testbin", - "--double_flag=0x1.2", - }; - TestParse(in_args2, 1, 1.125, "a", false); - - const char* in_args3[] = { - "testbin", - "--double_flag", - "99.7", - }; - TestParse(in_args3, 1, 99.7, "a", false); - - const char* in_args4[] = { - "testbin", - "--double_flag", - "0x20.1", - }; - TestParse(in_args4, 1, 32.0625, "a", false); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestValidStringArg) { - const char* in_args1[] = { - "testbin", - "--string_flag=aqswde", - }; - TestParse(in_args1, 1, 1.1, "aqswde", false); - - const char* in_args2[] = { - "testbin", - "-string_flag=a=b=c", - }; - TestParse(in_args2, 1, 1.1, "a=b=c", false); - - const char* in_args3[] = { - "testbin", - "--string_flag", - "zaxscd", - }; - TestParse(in_args3, 1, 1.1, "zaxscd", false); - - const char* in_args4[] = { - "testbin", - "-string_flag", - "--int_flag", - }; - TestParse(in_args4, 1, 1.1, "--int_flag", false); - - const char* in_args5[] = { - "testbin", - "--string_flag", - "--no_a_flag=11", - }; - TestParse(in_args5, 1, 1.1, "--no_a_flag=11", false); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestValidBoolArg) { - const char* in_args1[] = { - "testbin", - "--bool_flag", - }; - TestParse(in_args1, 1, 1.1, "a", true); - - const char* in_args2[] = { - "testbin", - "--nobool_flag", - }; - TestParse(in_args2, 1, 1.1, "a", false); - - const char* in_args3[] = { - "testbin", - "--bool_flag=true", - }; - TestParse(in_args3, 1, 1.1, "a", true); - - const char* in_args4[] = { - "testbin", - "-bool_flag=false", - }; - TestParse(in_args4, 1, 1.1, "a", false); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestValidUDTArg) { - const char* in_args1[] = { - "testbin", - "--udt_flag=A", - }; - InvokeParse(in_args1); - - EXPECT_EQ(absl::GetFlag(FLAGS_udt_flag).value, 1); - - const char* in_args2[] = {"testbin", "--udt_flag", "AAA"}; - InvokeParse(in_args2); - - EXPECT_EQ(absl::GetFlag(FLAGS_udt_flag).value, 10); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestValidMultipleArg) { - const char* in_args1[] = { - "testbin", "--bool_flag", "--int_flag=2", - "--double_flag=0.1", "--string_flag=asd", - }; - TestParse(in_args1, 2, 0.1, "asd", true); - - const char* in_args2[] = { - "testbin", "--string_flag=", "--nobool_flag", "--int_flag", - "-011", "--double_flag", "-1e-2", - }; - TestParse(in_args2, -11, -0.01, "", false); - - const char* in_args3[] = { - "testbin", "--int_flag", "-0", "--string_flag", "\"\"", - "--bool_flag=true", "--double_flag=1e18", - }; - TestParse(in_args3, 0, 1e18, "\"\"", true); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestPositionalArgs) { - const char* in_args1[] = { - "testbin", - "p1", - "p2", - }; - TestParse(in_args1, 1, 1.1, "a", false, 2); - - auto out_args1 = InvokeParse(in_args1); - - EXPECT_STREQ(out_args1[1], "p1"); - EXPECT_STREQ(out_args1[2], "p2"); - - const char* in_args2[] = { - "testbin", - "--int_flag=2", - "p1", - }; - TestParse(in_args2, 2, 1.1, "a", false, 1); - - auto out_args2 = InvokeParse(in_args2); - - EXPECT_STREQ(out_args2[1], "p1"); - - const char* in_args3[] = {"testbin", "p1", "--int_flag=3", - "p2", "--bool_flag", "true"}; - TestParse(in_args3, 3, 1.1, "a", true, 3); - - auto out_args3 = InvokeParse(in_args3); - - EXPECT_STREQ(out_args3[1], "p1"); - EXPECT_STREQ(out_args3[2], "p2"); - EXPECT_STREQ(out_args3[3], "true"); - - const char* in_args4[] = { - "testbin", - "--", - "p1", - "p2", - }; - TestParse(in_args4, 3, 1.1, "a", true, 2); - - auto out_args4 = InvokeParse(in_args4); - - EXPECT_STREQ(out_args4[1], "p1"); - EXPECT_STREQ(out_args4[2], "p2"); - - const char* in_args5[] = { - "testbin", "p1", "--int_flag=4", "--", "--bool_flag", "false", "p2", - }; - TestParse(in_args5, 4, 1.1, "a", true, 4); - - auto out_args5 = InvokeParse(in_args5); - - EXPECT_STREQ(out_args5[1], "p1"); - EXPECT_STREQ(out_args5[2], "--bool_flag"); - EXPECT_STREQ(out_args5[3], "false"); - EXPECT_STREQ(out_args5[4], "p2"); -} - -// -------------------------------------------------------------------- - -using ParseDeathTest = ParseTest; - -TEST_F(ParseDeathTest, TestUndefinedArg) { - const char* in_args1[] = { - "testbin", - "--undefined_flag", - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args1), - "Unknown command line flag 'undefined_flag'"); - - const char* in_args2[] = { - "testbin", - "--noprefixed_flag", - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args2), - "Unknown command line flag 'noprefixed_flag'"); - - const char* in_args3[] = { - "testbin", - "--Int_flag=1", - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args3), - "Unknown command line flag 'Int_flag'"); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseDeathTest, TestInvalidBoolFlagFormat) { - const char* in_args1[] = { - "testbin", - "--bool_flag=", - }; - EXPECT_DEATH_IF_SUPPORTED( - InvokeParse(in_args1), - "Missing the value after assignment for the boolean flag 'bool_flag'"); - - const char* in_args2[] = { - "testbin", - "--nobool_flag=true", - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args2), - "Negative form with assignment is not valid for the boolean " - "flag 'bool_flag'"); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseDeathTest, TestInvalidNonBoolFlagFormat) { - const char* in_args1[] = { - "testbin", - "--nostring_flag", - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args1), - "Negative form is not valid for the flag 'string_flag'"); - - const char* in_args2[] = { - "testbin", - "--int_flag", - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args2), - "Missing the value for the flag 'int_flag'"); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseDeathTest, TestInvalidUDTFlagFormat) { - const char* in_args1[] = { - "testbin", - "--udt_flag=1", - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args1), - "Illegal value '1' specified for flag 'udt_flag'; Use values A, " - "AAA instead"); - - const char* in_args2[] = { - "testbin", - "--udt_flag", - "AA", - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args2), - "Illegal value 'AA' specified for flag 'udt_flag'; Use values " - "A, AAA instead"); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestLegacyFlags) { - const char* in_args1[] = { - "testbin", - "--legacy_int=11", - }; - TestParse(in_args1, 1, 1.1, "a", false); - - const char* in_args2[] = { - "testbin", - "--legacy_bool", - }; - TestParse(in_args2, 1, 1.1, "a", false); - - const char* in_args3[] = { - "testbin", "--legacy_int", "22", "--int_flag=2", - "--legacy_bool", "true", "--legacy_str", "--string_flag=qwe", - }; - TestParse(in_args3, 2, 1.1, "a", false, 1); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestSimpleValidFlagfile) { - std::string flagfile_flag; - - const char* in_args1[] = { - "testbin", - GetFlagfileFlag({{"parse_test.ff1", absl::MakeConstSpan(ff1_data)}}, - flagfile_flag), - }; - TestParse(in_args1, -1, 0.1, "q2w2 ", true); - - const char* in_args2[] = { - "testbin", - GetFlagfileFlag({{"parse_test.ff2", absl::MakeConstSpan(ff2_data)}}, - flagfile_flag), - }; - TestParse(in_args2, 100, 0.1, "q2w2 ", false); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestValidMultiFlagfile) { - std::string flagfile_flag; - - const char* in_args1[] = { - "testbin", - GetFlagfileFlag({{"parse_test.ff2", absl::MakeConstSpan(ff2_data)}, - {"parse_test.ff1", absl::MakeConstSpan(ff1_data)}}, - flagfile_flag), - }; - TestParse(in_args1, -1, 0.1, "q2w2 ", true); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestFlagfileMixedWithRegularFlags) { - std::string flagfile_flag; - - const char* in_args1[] = { - "testbin", "--int_flag=3", - GetFlagfileFlag({{"parse_test.ff1", absl::MakeConstSpan(ff1_data)}}, - flagfile_flag), - "-double_flag=0.2"}; - TestParse(in_args1, -1, 0.2, "q2w2 ", true); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestFlagfileInFlagfile) { - std::string flagfile_flag; - - constexpr const char* const ff3_data[] = { - "--flagfile=$0/parse_test.ff1", - "--flagfile=$0/parse_test.ff2", - }; - - GetFlagfileFlag({{"parse_test.ff2", absl::MakeConstSpan(ff2_data)}, - {"parse_test.ff1", absl::MakeConstSpan(ff1_data)}}, - flagfile_flag); - - const char* in_args1[] = { - "testbin", - GetFlagfileFlag({{"parse_test.ff3", absl::MakeConstSpan(ff3_data)}}, - flagfile_flag), - }; - TestParse(in_args1, 100, 0.1, "q2w2 ", false); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseDeathTest, TestInvalidFlagfiles) { - std::string flagfile_flag; - - constexpr const char* const ff4_data[] = { - "--unknown_flag=10" - }; - - const char* in_args1[] = { - "testbin", - GetFlagfileFlag({{"parse_test.ff4", - absl::MakeConstSpan(ff4_data)}}, flagfile_flag), - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args1), - "Unknown command line flag 'unknown_flag'"); - - constexpr const char* const ff5_data[] = { - "--int_flag 10", - }; - - const char* in_args2[] = { - "testbin", - GetFlagfileFlag({{"parse_test.ff5", - absl::MakeConstSpan(ff5_data)}}, flagfile_flag), - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args2), - "Unknown command line flag 'int_flag 10'"); - - constexpr const char* const ff6_data[] = { - "--int_flag=10", "--", "arg1", "arg2", "arg3", - }; - - const char* in_args3[] = { - "testbin", - GetFlagfileFlag({{"parse_test.ff6", absl::MakeConstSpan(ff6_data)}}, - flagfile_flag), - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args3), - "Flagfile can't contain position arguments or --"); - - const char* in_args4[] = { - "testbin", - "--flagfile=invalid_flag_file", - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args4), - "Can't open flagfile invalid_flag_file"); - - constexpr const char* const ff7_data[] = { - "--int_flag=10", - "*bin*", - "--str_flag=aqsw", - }; - - const char* in_args5[] = { - "testbin", - GetFlagfileFlag({{"parse_test.ff7", absl::MakeConstSpan(ff7_data)}}, - flagfile_flag), - }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args5), - "Unexpected line in the flagfile .*: \\*bin\\*"); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestReadingRequiredFlagsFromEnv) { - const char* in_args1[] = {"testbin", - "--fromenv=int_flag,bool_flag,string_flag"}; - - ScopedSetEnv set_int_flag("FLAGS_int_flag", "33"); - ScopedSetEnv set_bool_flag("FLAGS_bool_flag", "True"); - ScopedSetEnv set_string_flag("FLAGS_string_flag", "AQ12"); - - TestParse(in_args1, 33, 1.1, "AQ12", true); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseDeathTest, TestReadingUnsetRequiredFlagsFromEnv) { - const char* in_args1[] = {"testbin", "--fromenv=int_flag"}; - - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args1), - "FLAGS_int_flag not found in environment"); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseDeathTest, TestRecursiveFlagsFromEnv) { - const char* in_args1[] = {"testbin", "--fromenv=tryfromenv"}; - - ScopedSetEnv set_tryfromenv("FLAGS_tryfromenv", "int_flag"); - - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args1), - "Infinite recursion on flag tryfromenv"); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestReadingOptionalFlagsFromEnv) { - const char* in_args1[] = { - "testbin", "--tryfromenv=int_flag,bool_flag,string_flag,other_flag"}; - - ScopedSetEnv set_int_flag("FLAGS_int_flag", "17"); - ScopedSetEnv set_bool_flag("FLAGS_bool_flag", "Y"); - - TestParse(in_args1, 17, 1.1, "a", true); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestReadingFlagsFromEnvMoxedWithRegularFlags) { - const char* in_args1[] = { - "testbin", - "--bool_flag=T", - "--tryfromenv=int_flag,bool_flag", - "--int_flag=-21", - }; - - ScopedSetEnv set_int_flag("FLAGS_int_flag", "-15"); - ScopedSetEnv set_bool_flag("FLAGS_bool_flag", "F"); - - TestParse(in_args1, -21, 1.1, "a", false); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestKeepParsedArgs) { - const char* in_args1[] = { - "testbin", "arg1", "--bool_flag", - "--int_flag=211", "arg2", "--double_flag=1.1", - "--string_flag", "asd", "--", - "arg3", "arg4", - }; - - auto out_args1 = InvokeParse(in_args1); - - EXPECT_THAT( - out_args1, - ElementsAreArray({absl::string_view("testbin"), absl::string_view("arg1"), - absl::string_view("arg2"), absl::string_view("arg3"), - absl::string_view("arg4")})); - - auto out_args2 = flags::ParseCommandLineImpl( - 11, const_cast<char**>(in_args1), flags::ArgvListAction::kKeepParsedArgs, - flags::UsageFlagsAction::kHandleUsage, - flags::OnUndefinedFlag::kAbortIfUndefined); - - EXPECT_THAT( - out_args2, - ElementsAreArray({absl::string_view("testbin"), - absl::string_view("--bool_flag"), - absl::string_view("--int_flag=211"), - absl::string_view("--double_flag=1.1"), - absl::string_view("--string_flag"), - absl::string_view("asd"), absl::string_view("--"), - absl::string_view("arg1"), absl::string_view("arg2"), - absl::string_view("arg3"), absl::string_view("arg4")})); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, TestIgnoreUndefinedFlags) { - const char* in_args1[] = { - "testbin", - "arg1", - "--undef_flag=aa", - "--int_flag=21", - }; - - auto out_args1 = flags::ParseCommandLineImpl( - 4, const_cast<char**>(in_args1), flags::ArgvListAction::kRemoveParsedArgs, - flags::UsageFlagsAction::kHandleUsage, - flags::OnUndefinedFlag::kIgnoreUndefined); - - EXPECT_THAT(out_args1, ElementsAreArray({absl::string_view("testbin"), - absl::string_view("arg1")})); - - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 21); - - const char* in_args2[] = { - "testbin", - "arg1", - "--undef_flag=aa", - "--string_flag=AA", - }; - - auto out_args2 = flags::ParseCommandLineImpl( - 4, const_cast<char**>(in_args2), flags::ArgvListAction::kKeepParsedArgs, - flags::UsageFlagsAction::kHandleUsage, - flags::OnUndefinedFlag::kIgnoreUndefined); - - EXPECT_THAT( - out_args2, - ElementsAreArray( - {absl::string_view("testbin"), absl::string_view("--undef_flag=aa"), - absl::string_view("--string_flag=AA"), absl::string_view("arg1")})); - - EXPECT_EQ(absl::GetFlag(FLAGS_string_flag), "AA"); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseDeathTest, TestSimpleHelpFlagHandling) { - const char* in_args1[] = { - "testbin", - "--help", - }; - - EXPECT_EXIT(InvokeParse(in_args1), testing::ExitedWithCode(1), ""); - - const char* in_args2[] = { - "testbin", - "--help", - "--int_flag=3", - }; - - auto out_args2 = flags::ParseCommandLineImpl( - 3, const_cast<char**>(in_args2), flags::ArgvListAction::kRemoveParsedArgs, - flags::UsageFlagsAction::kIgnoreUsage, - flags::OnUndefinedFlag::kAbortIfUndefined); - - EXPECT_EQ(flags::GetFlagsHelpMode(), flags::HelpMode::kImportant); - EXPECT_EQ(absl::GetFlag(FLAGS_int_flag), 3); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseDeathTest, TestSubstringHelpFlagHandling) { - const char* in_args1[] = { - "testbin", - "--help=abcd", - }; - - auto out_args1 = flags::ParseCommandLineImpl( - 2, const_cast<char**>(in_args1), flags::ArgvListAction::kRemoveParsedArgs, - flags::UsageFlagsAction::kIgnoreUsage, - flags::OnUndefinedFlag::kAbortIfUndefined); - - EXPECT_EQ(flags::GetFlagsHelpMode(), flags::HelpMode::kMatch); - EXPECT_EQ(flags::GetFlagsHelpMatchSubstr(), "abcd"); - - const char* in_args2[] = {"testbin", "--help", "some_positional_arg"}; - - auto out_args2 = flags::ParseCommandLineImpl( - 3, const_cast<char**>(in_args2), flags::ArgvListAction::kRemoveParsedArgs, - flags::UsageFlagsAction::kIgnoreUsage, - flags::OnUndefinedFlag::kAbortIfUndefined); - - EXPECT_EQ(flags::GetFlagsHelpMode(), flags::HelpMode::kImportant); -} - -// -------------------------------------------------------------------- - -TEST_F(ParseTest, WasPresentOnCommandLine) { - const char* in_args1[] = { - "testbin", "arg1", "--bool_flag", - "--int_flag=211", "arg2", "--double_flag=1.1", - "--string_flag", "asd", "--", - "--some_flag", "arg4", - }; - - InvokeParse(in_args1); - - EXPECT_TRUE(flags::WasPresentOnCommandLine("bool_flag")); - EXPECT_TRUE(flags::WasPresentOnCommandLine("int_flag")); - EXPECT_TRUE(flags::WasPresentOnCommandLine("double_flag")); - EXPECT_TRUE(flags::WasPresentOnCommandLine("string_flag")); - EXPECT_FALSE(flags::WasPresentOnCommandLine("some_flag")); - EXPECT_FALSE(flags::WasPresentOnCommandLine("another_flag")); -} - -// -------------------------------------------------------------------- - -} // namespace diff --git a/third_party/abseil_cpp/absl/flags/reflection.cc b/third_party/abseil_cpp/absl/flags/reflection.cc deleted file mode 100644 index c976d4679601..000000000000 --- a/third_party/abseil_cpp/absl/flags/reflection.cc +++ /dev/null @@ -1,337 +0,0 @@ -// -// Copyright 2020 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/reflection.h" - -#include <assert.h> - -#include <atomic> -#include <map> -#include <string> - -#include "absl/base/config.h" -#include "absl/base/thread_annotations.h" -#include "absl/flags/commandlineflag.h" -#include "absl/flags/internal/private_handle_accessor.h" -#include "absl/flags/internal/registry.h" -#include "absl/flags/usage_config.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/string_view.h" -#include "absl/synchronization/mutex.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -// -------------------------------------------------------------------- -// FlagRegistry -// A FlagRegistry singleton object holds all flag objects indexed by their -// names so that if you know a flag's name, you can access or set it. If the -// function is named FooLocked(), you must own the registry lock before -// calling the function; otherwise, you should *not* hold the lock, and the -// function will acquire it itself if needed. -// -------------------------------------------------------------------- - -class FlagRegistry { - public: - FlagRegistry() = default; - ~FlagRegistry() = default; - - // Store a flag in this registry. Takes ownership of *flag. - void RegisterFlag(CommandLineFlag& flag); - - void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION(lock_) { lock_.Lock(); } - void Unlock() ABSL_UNLOCK_FUNCTION(lock_) { lock_.Unlock(); } - - // Returns the flag object for the specified name, or nullptr if not found. - // Will emit a warning if a 'retired' flag is specified. - CommandLineFlag* FindFlag(absl::string_view name); - - static FlagRegistry& GlobalRegistry(); // returns a singleton registry - - private: - friend class flags_internal::FlagSaverImpl; // reads all the flags in order - // to copy them - friend void ForEachFlag(std::function<void(CommandLineFlag&)> visitor); - friend void FinalizeRegistry(); - - // The map from name to flag, for FindFlag(). - using FlagMap = std::map<absl::string_view, CommandLineFlag*>; - using FlagIterator = FlagMap::iterator; - using FlagConstIterator = FlagMap::const_iterator; - FlagMap flags_; - std::vector<CommandLineFlag*> flat_flags_; - std::atomic<bool> finalized_flags_{false}; - - absl::Mutex lock_; - - // Disallow - FlagRegistry(const FlagRegistry&); - FlagRegistry& operator=(const FlagRegistry&); -}; - -namespace { - -class FlagRegistryLock { - public: - explicit FlagRegistryLock(FlagRegistry& fr) : fr_(fr) { fr_.Lock(); } - ~FlagRegistryLock() { fr_.Unlock(); } - - private: - FlagRegistry& fr_; -}; - -} // namespace - -CommandLineFlag* FlagRegistry::FindFlag(absl::string_view name) { - if (finalized_flags_.load(std::memory_order_acquire)) { - // We could save some gcus here if we make `Name()` be non-virtual. - // We could move the `const char*` name to the base class. - auto it = std::partition_point( - flat_flags_.begin(), flat_flags_.end(), - [=](CommandLineFlag* f) { return f->Name() < name; }); - if (it != flat_flags_.end() && (*it)->Name() == name) return *it; - } - - FlagRegistryLock frl(*this); - auto it = flags_.find(name); - return it != flags_.end() ? it->second : nullptr; -} - -void FlagRegistry::RegisterFlag(CommandLineFlag& flag) { - FlagRegistryLock registry_lock(*this); - - std::pair<FlagIterator, bool> ins = - flags_.insert(FlagMap::value_type(flag.Name(), &flag)); - if (ins.second == false) { // means the name was already in the map - CommandLineFlag& old_flag = *ins.first->second; - if (flag.IsRetired() != old_flag.IsRetired()) { - // All registrations must agree on the 'retired' flag. - flags_internal::ReportUsageError( - absl::StrCat( - "Retired flag '", flag.Name(), "' was defined normally in file '", - (flag.IsRetired() ? old_flag.Filename() : flag.Filename()), "'."), - true); - } else if (flags_internal::PrivateHandleAccessor::TypeId(flag) != - flags_internal::PrivateHandleAccessor::TypeId(old_flag)) { - flags_internal::ReportUsageError( - absl::StrCat("Flag '", flag.Name(), - "' was defined more than once but with " - "differing types. Defined in files '", - old_flag.Filename(), "' and '", flag.Filename(), "'."), - true); - } else if (old_flag.IsRetired()) { - return; - } else if (old_flag.Filename() != flag.Filename()) { - flags_internal::ReportUsageError( - absl::StrCat("Flag '", flag.Name(), - "' was defined more than once (in files '", - old_flag.Filename(), "' and '", flag.Filename(), "')."), - true); - } else { - flags_internal::ReportUsageError( - absl::StrCat( - "Something is wrong with flag '", flag.Name(), "' in file '", - flag.Filename(), "'. One possibility: file '", flag.Filename(), - "' is being linked both statically and dynamically into this " - "executable. e.g. some files listed as srcs to a test and also " - "listed as srcs of some shared lib deps of the same test."), - true); - } - // All cases above are fatal, except for the retired flags. - std::exit(1); - } -} - -FlagRegistry& FlagRegistry::GlobalRegistry() { - static FlagRegistry* global_registry = new FlagRegistry; - return *global_registry; -} - -// -------------------------------------------------------------------- - -void ForEachFlag(std::function<void(CommandLineFlag&)> visitor) { - FlagRegistry& registry = FlagRegistry::GlobalRegistry(); - - if (registry.finalized_flags_.load(std::memory_order_acquire)) { - for (const auto& i : registry.flat_flags_) visitor(*i); - } - - FlagRegistryLock frl(registry); - for (const auto& i : registry.flags_) visitor(*i.second); -} - -// -------------------------------------------------------------------- - -bool RegisterCommandLineFlag(CommandLineFlag& flag) { - FlagRegistry::GlobalRegistry().RegisterFlag(flag); - return true; -} - -void FinalizeRegistry() { - auto& registry = FlagRegistry::GlobalRegistry(); - FlagRegistryLock frl(registry); - if (registry.finalized_flags_.load(std::memory_order_relaxed)) { - // Was already finalized. Ignore the second time. - return; - } - registry.flat_flags_.reserve(registry.flags_.size()); - for (const auto& f : registry.flags_) { - registry.flat_flags_.push_back(f.second); - } - registry.flags_.clear(); - registry.finalized_flags_.store(true, std::memory_order_release); -} - -// -------------------------------------------------------------------- - -namespace { - -class RetiredFlagObj final : public CommandLineFlag { - public: - constexpr RetiredFlagObj(const char* name, FlagFastTypeId type_id) - : name_(name), type_id_(type_id) {} - - private: - absl::string_view Name() const override { return name_; } - std::string Filename() const override { - OnAccess(); - return "RETIRED"; - } - FlagFastTypeId TypeId() const override { return type_id_; } - std::string Help() const override { - OnAccess(); - return ""; - } - bool IsRetired() const override { return true; } - bool IsSpecifiedOnCommandLine() const override { - OnAccess(); - return false; - } - std::string DefaultValue() const override { - OnAccess(); - return ""; - } - std::string CurrentValue() const override { - OnAccess(); - return ""; - } - - // Any input is valid - bool ValidateInputValue(absl::string_view) const override { - OnAccess(); - return true; - } - - std::unique_ptr<flags_internal::FlagStateInterface> SaveState() override { - return nullptr; - } - - bool ParseFrom(absl::string_view, flags_internal::FlagSettingMode, - flags_internal::ValueSource, std::string&) override { - OnAccess(); - return false; - } - - void CheckDefaultValueParsingRoundtrip() const override { OnAccess(); } - - void Read(void*) const override { OnAccess(); } - - void OnAccess() const { - flags_internal::ReportUsageError( - absl::StrCat("Accessing retired flag '", name_, "'"), false); - } - - // Data members - const char* const name_; - const FlagFastTypeId type_id_; -}; - -} // namespace - -void Retire(const char* name, FlagFastTypeId type_id, char* buf) { - static_assert(sizeof(RetiredFlagObj) == kRetiredFlagObjSize, ""); - static_assert(alignof(RetiredFlagObj) == kRetiredFlagObjAlignment, ""); - auto* flag = ::new (static_cast<void*>(buf)) - flags_internal::RetiredFlagObj(name, type_id); - FlagRegistry::GlobalRegistry().RegisterFlag(*flag); -} - -// -------------------------------------------------------------------- - -class FlagSaverImpl { - public: - FlagSaverImpl() = default; - FlagSaverImpl(const FlagSaverImpl&) = delete; - void operator=(const FlagSaverImpl&) = delete; - - // Saves the flag states from the flag registry into this object. - // It's an error to call this more than once. - void SaveFromRegistry() { - assert(backup_registry_.empty()); // call only once! - flags_internal::ForEachFlag([&](CommandLineFlag& flag) { - if (auto flag_state = - flags_internal::PrivateHandleAccessor::SaveState(flag)) { - backup_registry_.emplace_back(std::move(flag_state)); - } - }); - } - - // Restores the saved flag states into the flag registry. - void RestoreToRegistry() { - for (const auto& flag_state : backup_registry_) { - flag_state->Restore(); - } - } - - private: - std::vector<std::unique_ptr<flags_internal::FlagStateInterface>> - backup_registry_; -}; - -} // namespace flags_internal - -FlagSaver::FlagSaver() : impl_(new flags_internal::FlagSaverImpl) { - impl_->SaveFromRegistry(); -} - -FlagSaver::~FlagSaver() { - if (!impl_) return; - - impl_->RestoreToRegistry(); - delete impl_; -} - -// -------------------------------------------------------------------- - -CommandLineFlag* FindCommandLineFlag(absl::string_view name) { - if (name.empty()) return nullptr; - flags_internal::FlagRegistry& registry = - flags_internal::FlagRegistry::GlobalRegistry(); - return registry.FindFlag(name); -} - -// -------------------------------------------------------------------- - -absl::flat_hash_map<absl::string_view, absl::CommandLineFlag*> GetAllFlags() { - absl::flat_hash_map<absl::string_view, absl::CommandLineFlag*> res; - flags_internal::ForEachFlag([&](CommandLineFlag& flag) { - if (!flag.IsRetired()) res.insert({flag.Name(), &flag}); - }); - return res; -} - -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/reflection.h b/third_party/abseil_cpp/absl/flags/reflection.h deleted file mode 100644 index e6baf5de4b0c..000000000000 --- a/third_party/abseil_cpp/absl/flags/reflection.h +++ /dev/null @@ -1,90 +0,0 @@ -// -// Copyright 2020 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ----------------------------------------------------------------------------- -// File: reflection.h -// ----------------------------------------------------------------------------- -// -// This file defines the routines to access and operate on an Abseil Flag's -// reflection handle. - -#ifndef ABSL_FLAGS_REFLECTION_H_ -#define ABSL_FLAGS_REFLECTION_H_ - -#include <string> - -#include "absl/base/config.h" -#include "absl/container/flat_hash_map.h" -#include "absl/flags/commandlineflag.h" -#include "absl/flags/internal/commandlineflag.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { -class FlagSaverImpl; -} // namespace flags_internal - -// FindCommandLineFlag() -// -// Returns the reflection handle of an Abseil flag of the specified name, or -// `nullptr` if not found. This function will emit a warning if the name of a -// 'retired' flag is specified. -absl::CommandLineFlag* FindCommandLineFlag(absl::string_view name); - -// Returns current state of the Flags registry in a form of mapping from flag -// name to a flag reflection handle. -absl::flat_hash_map<absl::string_view, absl::CommandLineFlag*> GetAllFlags(); - -//------------------------------------------------------------------------------ -// FlagSaver -//------------------------------------------------------------------------------ -// -// A FlagSaver object stores the state of flags in the scope where the FlagSaver -// is defined, allowing modification of those flags within that scope and -// automatic restoration of the flags to their previous state upon leaving the -// scope. -// -// A FlagSaver can be used within tests to temporarily change the test -// environment and restore the test case to its previous state. -// -// Example: -// -// void MyFunc() { -// absl::FlagSaver fs; -// ... -// absl::SetFlag(&FLAGS_myFlag, otherValue); -// ... -// } // scope of FlagSaver left, flags return to previous state -// -// This class is thread-safe. - -class FlagSaver { - public: - FlagSaver(); - ~FlagSaver(); - - FlagSaver(const FlagSaver&) = delete; - void operator=(const FlagSaver&) = delete; - - private: - flags_internal::FlagSaverImpl* impl_; -}; - -//----------------------------------------------------------------------------- - -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_REFLECTION_H_ diff --git a/third_party/abseil_cpp/absl/flags/reflection_test.cc b/third_party/abseil_cpp/absl/flags/reflection_test.cc deleted file mode 100644 index 4c80900956a9..000000000000 --- a/third_party/abseil_cpp/absl/flags/reflection_test.cc +++ /dev/null @@ -1,267 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/reflection.h" - -#include <memory> -#include <string> - -#include "gmock/gmock.h" -#include "gtest/gtest.h" -#include "absl/flags/declare.h" -#include "absl/flags/flag.h" -#include "absl/flags/internal/commandlineflag.h" -#include "absl/flags/marshalling.h" -#include "absl/memory/memory.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/str_split.h" - -ABSL_FLAG(int, int_flag, 1, "int_flag help"); -ABSL_FLAG(std::string, string_flag, "dflt", "string_flag help"); -ABSL_RETIRED_FLAG(bool, bool_retired_flag, false, "bool_retired_flag help"); - -namespace { - -namespace flags = absl::flags_internal; - -class ReflectionTest : public testing::Test { - protected: - void SetUp() override { flag_saver_ = absl::make_unique<absl::FlagSaver>(); } - void TearDown() override { flag_saver_.reset(); } - - private: - std::unique_ptr<absl::FlagSaver> flag_saver_; -}; - -// -------------------------------------------------------------------- - -TEST_F(ReflectionTest, TestFindCommandLineFlag) { - auto* handle = absl::FindCommandLineFlag("some_flag"); - EXPECT_EQ(handle, nullptr); - - handle = absl::FindCommandLineFlag("int_flag"); - EXPECT_NE(handle, nullptr); - - handle = absl::FindCommandLineFlag("string_flag"); - EXPECT_NE(handle, nullptr); - - handle = absl::FindCommandLineFlag("bool_retired_flag"); - EXPECT_NE(handle, nullptr); -} - -// -------------------------------------------------------------------- - -TEST_F(ReflectionTest, TestGetAllFlags) { - auto all_flags = absl::GetAllFlags(); - EXPECT_NE(all_flags.find("int_flag"), all_flags.end()); - EXPECT_EQ(all_flags.find("bool_retired_flag"), all_flags.end()); - EXPECT_EQ(all_flags.find("some_undefined_flag"), all_flags.end()); - - std::vector<absl::string_view> flag_names_first_attempt; - auto all_flags_1 = absl::GetAllFlags(); - for (auto f : all_flags_1) { - flag_names_first_attempt.push_back(f.first); - } - - std::vector<absl::string_view> flag_names_second_attempt; - auto all_flags_2 = absl::GetAllFlags(); - for (auto f : all_flags_2) { - flag_names_second_attempt.push_back(f.first); - } - - EXPECT_THAT(flag_names_first_attempt, - ::testing::UnorderedElementsAreArray(flag_names_second_attempt)); -} - -// -------------------------------------------------------------------- - -struct CustomUDT { - CustomUDT() : a(1), b(1) {} - CustomUDT(int a_, int b_) : a(a_), b(b_) {} - - friend bool operator==(const CustomUDT& f1, const CustomUDT& f2) { - return f1.a == f2.a && f1.b == f2.b; - } - - int a; - int b; -}; -bool AbslParseFlag(absl::string_view in, CustomUDT* f, std::string*) { - std::vector<absl::string_view> parts = - absl::StrSplit(in, ':', absl::SkipWhitespace()); - - if (parts.size() != 2) return false; - - if (!absl::SimpleAtoi(parts[0], &f->a)) return false; - - if (!absl::SimpleAtoi(parts[1], &f->b)) return false; - - return true; -} -std::string AbslUnparseFlag(const CustomUDT& f) { - return absl::StrCat(f.a, ":", f.b); -} - -} // namespace - -// -------------------------------------------------------------------- - -ABSL_FLAG(bool, test_flag_01, true, ""); -ABSL_FLAG(int, test_flag_02, 1234, ""); -ABSL_FLAG(int16_t, test_flag_03, -34, ""); -ABSL_FLAG(uint16_t, test_flag_04, 189, ""); -ABSL_FLAG(int32_t, test_flag_05, 10765, ""); -ABSL_FLAG(uint32_t, test_flag_06, 40000, ""); -ABSL_FLAG(int64_t, test_flag_07, -1234567, ""); -ABSL_FLAG(uint64_t, test_flag_08, 9876543, ""); -ABSL_FLAG(double, test_flag_09, -9.876e-50, ""); -ABSL_FLAG(float, test_flag_10, 1.234e12f, ""); -ABSL_FLAG(std::string, test_flag_11, "", ""); -ABSL_FLAG(absl::Duration, test_flag_12, absl::Minutes(10), ""); -static int counter = 0; -ABSL_FLAG(int, test_flag_13, 200, "").OnUpdate([]() { counter++; }); -ABSL_FLAG(CustomUDT, test_flag_14, {}, ""); - -namespace { - -TEST_F(ReflectionTest, TestFlagSaverInScope) { - { - absl::FlagSaver s; - counter = 0; - absl::SetFlag(&FLAGS_test_flag_01, false); - absl::SetFlag(&FLAGS_test_flag_02, -1021); - absl::SetFlag(&FLAGS_test_flag_03, 6009); - absl::SetFlag(&FLAGS_test_flag_04, 44); - absl::SetFlag(&FLAGS_test_flag_05, +800); - absl::SetFlag(&FLAGS_test_flag_06, -40978756); - absl::SetFlag(&FLAGS_test_flag_07, 23405); - absl::SetFlag(&FLAGS_test_flag_08, 975310); - absl::SetFlag(&FLAGS_test_flag_09, 1.00001); - absl::SetFlag(&FLAGS_test_flag_10, -3.54f); - absl::SetFlag(&FLAGS_test_flag_11, "asdf"); - absl::SetFlag(&FLAGS_test_flag_12, absl::Hours(20)); - absl::SetFlag(&FLAGS_test_flag_13, 4); - absl::SetFlag(&FLAGS_test_flag_14, CustomUDT{-1, -2}); - } - - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), true); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 1234); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), -34); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_04), 189); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_05), 10765); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_06), 40000); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_07), -1234567); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 9876543); - EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_09), -9.876e-50, 1e-55); - EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_10), 1.234e12f, 1e5f); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), ""); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Minutes(10)); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_13), 200); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_14), CustomUDT{}); - EXPECT_EQ(counter, 2); -} - -// -------------------------------------------------------------------- - -TEST_F(ReflectionTest, TestFlagSaverVsUpdateViaReflection) { - { - absl::FlagSaver s; - counter = 0; - std::string error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_01")->ParseFrom("false", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_02")->ParseFrom("-4536", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_03")->ParseFrom("111", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_04")->ParseFrom("909", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_05")->ParseFrom("-2004", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_06")->ParseFrom("1000023", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_07")->ParseFrom("69305", &error)) - << error; - EXPECT_TRUE(absl::FindCommandLineFlag("test_flag_08") - ->ParseFrom("1000000001", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_09")->ParseFrom("2.09021", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_10")->ParseFrom("-33.1", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_11")->ParseFrom("ADD_FOO", &error)) - << error; - EXPECT_TRUE(absl::FindCommandLineFlag("test_flag_12") - ->ParseFrom("3h11m16s", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_13")->ParseFrom("0", &error)) - << error; - EXPECT_TRUE( - absl::FindCommandLineFlag("test_flag_14")->ParseFrom("10:1", &error)) - << error; - } - - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), true); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 1234); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), -34); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_04), 189); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_05), 10765); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_06), 40000); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_07), -1234567); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 9876543); - EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_09), -9.876e-50, 1e-55); - EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_10), 1.234e12f, 1e5f); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), ""); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Minutes(10)); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_13), 200); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_14), CustomUDT{}); - EXPECT_EQ(counter, 2); -} - -// -------------------------------------------------------------------- - -TEST_F(ReflectionTest, TestMultipleFlagSaversInEnclosedScopes) { - { - absl::FlagSaver s; - absl::SetFlag(&FLAGS_test_flag_08, 10); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 10); - { - absl::FlagSaver s; - absl::SetFlag(&FLAGS_test_flag_08, 20); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 20); - { - absl::FlagSaver s; - absl::SetFlag(&FLAGS_test_flag_08, -200); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), -200); - } - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 20); - } - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 10); - } - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 9876543); -} - -} // namespace diff --git a/third_party/abseil_cpp/absl/flags/usage.cc b/third_party/abseil_cpp/absl/flags/usage.cc deleted file mode 100644 index 452f667512e8..000000000000 --- a/third_party/abseil_cpp/absl/flags/usage.cc +++ /dev/null @@ -1,65 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#include "absl/flags/usage.h" - -#include <stdlib.h> - -#include <string> - -#include "absl/base/attributes.h" -#include "absl/base/config.h" -#include "absl/base/const_init.h" -#include "absl/base/thread_annotations.h" -#include "absl/flags/internal/usage.h" -#include "absl/strings/string_view.h" -#include "absl/synchronization/mutex.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { -namespace { -ABSL_CONST_INIT absl::Mutex usage_message_guard(absl::kConstInit); -ABSL_CONST_INIT std::string* program_usage_message - ABSL_GUARDED_BY(usage_message_guard) = nullptr; -} // namespace -} // namespace flags_internal - -// -------------------------------------------------------------------- -// Sets the "usage" message to be used by help reporting routines. -void SetProgramUsageMessage(absl::string_view new_usage_message) { - absl::MutexLock l(&flags_internal::usage_message_guard); - - if (flags_internal::program_usage_message != nullptr) { - ABSL_INTERNAL_LOG(FATAL, "SetProgramUsageMessage() called twice."); - std::exit(1); - } - - flags_internal::program_usage_message = new std::string(new_usage_message); -} - -// -------------------------------------------------------------------- -// Returns the usage message set by SetProgramUsageMessage(). -// Note: We able to return string_view here only because calling -// SetProgramUsageMessage twice is prohibited. -absl::string_view ProgramUsageMessage() { - absl::MutexLock l(&flags_internal::usage_message_guard); - - return flags_internal::program_usage_message != nullptr - ? absl::string_view(*flags_internal::program_usage_message) - : "Warning: SetProgramUsageMessage() never called"; -} - -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/usage.h b/third_party/abseil_cpp/absl/flags/usage.h deleted file mode 100644 index ad12ab7ad902..000000000000 --- a/third_party/abseil_cpp/absl/flags/usage.h +++ /dev/null @@ -1,43 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ABSL_FLAGS_USAGE_H_ -#define ABSL_FLAGS_USAGE_H_ - -#include "absl/base/config.h" -#include "absl/strings/string_view.h" - -// -------------------------------------------------------------------- -// Usage reporting interfaces - -namespace absl { -ABSL_NAMESPACE_BEGIN - -// Sets the "usage" message to be used by help reporting routines. -// For example: -// absl::SetProgramUsageMessage( -// absl::StrCat("This program does nothing. Sample usage:\n", argv[0], -// " <uselessarg1> <uselessarg2>")); -// Do not include commandline flags in the usage: we do that for you! -// Note: Calling SetProgramUsageMessage twice will trigger a call to std::exit. -void SetProgramUsageMessage(absl::string_view new_usage_message); - -// Returns the usage message set by SetProgramUsageMessage(). -absl::string_view ProgramUsageMessage(); - -ABSL_NAMESPACE_END -} // namespace absl - -#endif // ABSL_FLAGS_USAGE_H_ diff --git a/third_party/abseil_cpp/absl/flags/usage_config.cc b/third_party/abseil_cpp/absl/flags/usage_config.cc deleted file mode 100644 index ae2f548a570b..000000000000 --- a/third_party/abseil_cpp/absl/flags/usage_config.cc +++ /dev/null @@ -1,164 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/usage_config.h" - -#include <functional> -#include <iostream> -#include <string> - -#include "absl/base/attributes.h" -#include "absl/base/config.h" -#include "absl/base/const_init.h" -#include "absl/base/thread_annotations.h" -#include "absl/flags/internal/path_util.h" -#include "absl/flags/internal/program_name.h" -#include "absl/strings/match.h" -#include "absl/strings/string_view.h" -#include "absl/strings/strip.h" -#include "absl/synchronization/mutex.h" - -extern "C" { - -// Additional report of fatal usage error message before we std::exit. Error is -// fatal if is_fatal argument to ReportUsageError is true. -ABSL_ATTRIBUTE_WEAK void AbslInternalReportFatalUsageError(absl::string_view) {} - -} // extern "C" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace flags_internal { - -namespace { - -// -------------------------------------------------------------------- -// Returns true if flags defined in the filename should be reported with -// -helpshort flag. - -bool ContainsHelpshortFlags(absl::string_view filename) { - // By default we only want flags in binary's main. We expect the main - // routine to reside in <program>.cc or <program>-main.cc or - // <program>_main.cc, where the <program> is the name of the binary - // (without .exe on Windows). - auto suffix = flags_internal::Basename(filename); - auto program_name = flags_internal::ShortProgramInvocationName(); - absl::string_view program_name_ref = program_name; -#if defined(_WIN32) - absl::ConsumeSuffix(&program_name_ref, ".exe"); -#endif - if (!absl::ConsumePrefix(&suffix, program_name_ref)) - return false; - return absl::StartsWith(suffix, ".") || absl::StartsWith(suffix, "-main.") || - absl::StartsWith(suffix, "_main."); -} - -// -------------------------------------------------------------------- -// Returns true if flags defined in the filename should be reported with -// -helppackage flag. - -bool ContainsHelppackageFlags(absl::string_view filename) { - // TODO(rogeeff): implement properly when registry is available. - return ContainsHelpshortFlags(filename); -} - -// -------------------------------------------------------------------- -// Generates program version information into supplied output. - -std::string VersionString() { - std::string version_str(flags_internal::ShortProgramInvocationName()); - - version_str += "\n"; - -#if !defined(NDEBUG) - version_str += "Debug build (NDEBUG not #defined)\n"; -#endif - - return version_str; -} - -// -------------------------------------------------------------------- -// Normalizes the filename specific to the build system/filesystem used. - -std::string NormalizeFilename(absl::string_view filename) { - // Skip any leading slashes - auto pos = filename.find_first_not_of("\\/"); - if (pos == absl::string_view::npos) return ""; - - filename.remove_prefix(pos); - return std::string(filename); -} - -// -------------------------------------------------------------------- - -ABSL_CONST_INIT absl::Mutex custom_usage_config_guard(absl::kConstInit); -ABSL_CONST_INIT FlagsUsageConfig* custom_usage_config - ABSL_GUARDED_BY(custom_usage_config_guard) = nullptr; - -} // namespace - -FlagsUsageConfig GetUsageConfig() { - absl::MutexLock l(&custom_usage_config_guard); - - if (custom_usage_config) return *custom_usage_config; - - FlagsUsageConfig default_config; - default_config.contains_helpshort_flags = &ContainsHelpshortFlags; - default_config.contains_help_flags = &ContainsHelppackageFlags; - default_config.contains_helppackage_flags = &ContainsHelppackageFlags; - default_config.version_string = &VersionString; - default_config.normalize_filename = &NormalizeFilename; - - return default_config; -} - -void ReportUsageError(absl::string_view msg, bool is_fatal) { - std::cerr << "ERROR: " << msg << std::endl; - - if (is_fatal) { - AbslInternalReportFatalUsageError(msg); - } -} - -} // namespace flags_internal - -void SetFlagsUsageConfig(FlagsUsageConfig usage_config) { - absl::MutexLock l(&flags_internal::custom_usage_config_guard); - - if (!usage_config.contains_helpshort_flags) - usage_config.contains_helpshort_flags = - flags_internal::ContainsHelpshortFlags; - - if (!usage_config.contains_help_flags) - usage_config.contains_help_flags = flags_internal::ContainsHelppackageFlags; - - if (!usage_config.contains_helppackage_flags) - usage_config.contains_helppackage_flags = - flags_internal::ContainsHelppackageFlags; - - if (!usage_config.version_string) - usage_config.version_string = flags_internal::VersionString; - - if (!usage_config.normalize_filename) - usage_config.normalize_filename = flags_internal::NormalizeFilename; - - if (flags_internal::custom_usage_config) - *flags_internal::custom_usage_config = usage_config; - else - flags_internal::custom_usage_config = new FlagsUsageConfig(usage_config); -} - -ABSL_NAMESPACE_END -} // namespace absl diff --git a/third_party/abseil_cpp/absl/flags/usage_config.h b/third_party/abseil_cpp/absl/flags/usage_config.h deleted file mode 100644 index 96eecea23159..000000000000 --- a/third_party/abseil_cpp/absl/flags/usage_config.h +++ /dev/null @@ -1,134 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ----------------------------------------------------------------------------- -// File: usage_config.h -// ----------------------------------------------------------------------------- -// -// This file defines the main usage reporting configuration interfaces and -// documents Abseil's supported built-in usage flags. If these flags are found -// when parsing a command-line, Abseil will exit the program and display -// appropriate help messages. -#ifndef ABSL_FLAGS_USAGE_CONFIG_H_ -#define ABSL_FLAGS_USAGE_CONFIG_H_ - -#include <functional> -#include <string> - -#include "absl/base/config.h" -#include "absl/strings/string_view.h" - -// ----------------------------------------------------------------------------- -// Built-in Usage Flags -// ----------------------------------------------------------------------------- -// -// Abseil supports the following built-in usage flags. When passed, these flags -// exit the program and : -// -// * --help -// Shows help on important flags for this binary -// * --helpfull -// Shows help on all flags -// * --helpshort -// Shows help on only the main module for this program -// * --helppackage -// Shows help on all modules in the main package -// * --version -// Shows the version and build info for this binary and exits -// * --only_check_args -// Exits after checking all flags -// * --helpon -// Shows help on the modules named by this flag value -// * --helpmatch -// Shows help on modules whose name contains the specified substring - -namespace absl { -ABSL_NAMESPACE_BEGIN - -namespace flags_internal { -using FlagKindFilter = std::function<bool (absl::string_view)>; -} // namespace flags_internal - -// FlagsUsageConfig -// -// This structure contains the collection of callbacks for changing the behavior -// of the usage reporting routines in Abseil Flags. -struct FlagsUsageConfig { - // Returns true if flags defined in the given source code file should be - // reported with --helpshort flag. For example, if the file - // "path/to/my/code.cc" defines the flag "--my_flag", and - // contains_helpshort_flags("path/to/my/code.cc") returns true, invoking the - // program with --helpshort will include information about --my_flag in the - // program output. - flags_internal::FlagKindFilter contains_helpshort_flags; - - // Returns true if flags defined in the filename should be reported with - // --help flag. For example, if the file - // "path/to/my/code.cc" defines the flag "--my_flag", and - // contains_help_flags("path/to/my/code.cc") returns true, invoking the - // program with --help will include information about --my_flag in the - // program output. - flags_internal::FlagKindFilter contains_help_flags; - - // Returns true if flags defined in the filename should be reported with - // --helppackage flag. For example, if the file - // "path/to/my/code.cc" defines the flag "--my_flag", and - // contains_helppackage_flags("path/to/my/code.cc") returns true, invoking the - // program with --helppackage will include information about --my_flag in the - // program output. - flags_internal::FlagKindFilter contains_helppackage_flags; - - // Generates string containing program version. This is the string reported - // when user specifies --version in a command line. - std::function<std::string()> version_string; - - // Normalizes the filename specific to the build system/filesystem used. This - // routine is used when we report the information about the flag definition - // location. For instance, if your build resides at some location you do not - // want to expose in the usage output, you can trim it to show only relevant - // part. - // For example: - // normalize_filename("/my_company/some_long_path/src/project/file.cc") - // might produce - // "project/file.cc". - std::function<std::string(absl::string_view)> normalize_filename; -}; - -// SetFlagsUsageConfig() -// -// Sets the usage reporting configuration callbacks. If any of the callbacks are -// not set in usage_config instance, then the default value of the callback is -// used. -void SetFlagsUsageConfig(FlagsUsageConfig usage_config); - -namespace flags_internal { - -FlagsUsageConfig GetUsageConfig(); - -void ReportUsageError(absl::string_view msg, bool is_fatal); - -} // namespace flags_internal -ABSL_NAMESPACE_END -} // namespace absl - -extern "C" { - -// Additional report of fatal usage error message before we std::exit. Error is -// fatal if is_fatal argument to ReportUsageError is true. -void AbslInternalReportFatalUsageError(absl::string_view); - -} // extern "C" - -#endif // ABSL_FLAGS_USAGE_CONFIG_H_ diff --git a/third_party/abseil_cpp/absl/flags/usage_config_test.cc b/third_party/abseil_cpp/absl/flags/usage_config_test.cc deleted file mode 100644 index e57a8832f645..000000000000 --- a/third_party/abseil_cpp/absl/flags/usage_config_test.cc +++ /dev/null @@ -1,205 +0,0 @@ -// -// Copyright 2019 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "absl/flags/usage_config.h" - -#include <string> - -#include "gtest/gtest.h" -#include "absl/flags/internal/path_util.h" -#include "absl/flags/internal/program_name.h" -#include "absl/strings/match.h" -#include "absl/strings/string_view.h" - -namespace { - -class FlagsUsageConfigTest : public testing::Test { - protected: - void SetUp() override { - // Install Default config for the use on this unit test. - // Binary may install a custom config before tests are run. - absl::FlagsUsageConfig default_config; - absl::SetFlagsUsageConfig(default_config); - } -}; - -namespace flags = absl::flags_internal; - -bool TstContainsHelpshortFlags(absl::string_view f) { - return absl::StartsWith(flags::Basename(f), "progname."); -} - -bool TstContainsHelppackageFlags(absl::string_view f) { - return absl::EndsWith(flags::Package(f), "aaa/"); -} - -bool TstContainsHelpFlags(absl::string_view f) { - return absl::EndsWith(flags::Package(f), "zzz/"); -} - -std::string TstVersionString() { return "program 1.0.0"; } - -std::string TstNormalizeFilename(absl::string_view filename) { - return std::string(filename.substr(2)); -} - -void TstReportUsageMessage(absl::string_view msg) {} - -// -------------------------------------------------------------------- - -TEST_F(FlagsUsageConfigTest, TestGetSetFlagsUsageConfig) { - EXPECT_TRUE(flags::GetUsageConfig().contains_helpshort_flags); - EXPECT_TRUE(flags::GetUsageConfig().contains_help_flags); - EXPECT_TRUE(flags::GetUsageConfig().contains_helppackage_flags); - EXPECT_TRUE(flags::GetUsageConfig().version_string); - EXPECT_TRUE(flags::GetUsageConfig().normalize_filename); - - absl::FlagsUsageConfig empty_config; - empty_config.contains_helpshort_flags = &TstContainsHelpshortFlags; - empty_config.contains_help_flags = &TstContainsHelpFlags; - empty_config.contains_helppackage_flags = &TstContainsHelppackageFlags; - empty_config.version_string = &TstVersionString; - empty_config.normalize_filename = &TstNormalizeFilename; - absl::SetFlagsUsageConfig(empty_config); - - EXPECT_TRUE(flags::GetUsageConfig().contains_helpshort_flags); - EXPECT_TRUE(flags::GetUsageConfig().contains_help_flags); - EXPECT_TRUE(flags::GetUsageConfig().contains_helppackage_flags); - EXPECT_TRUE(flags::GetUsageConfig().version_string); - EXPECT_TRUE(flags::GetUsageConfig().normalize_filename); -} - -// -------------------------------------------------------------------- - -TEST_F(FlagsUsageConfigTest, TestContainsHelpshortFlags) { -#if defined(_WIN32) - flags::SetProgramInvocationName("usage_config_test.exe"); -#else - flags::SetProgramInvocationName("usage_config_test"); -#endif - - auto config = flags::GetUsageConfig(); - EXPECT_TRUE(config.contains_helpshort_flags("adir/cd/usage_config_test.cc")); - EXPECT_TRUE( - config.contains_helpshort_flags("aaaa/usage_config_test-main.cc")); - EXPECT_TRUE(config.contains_helpshort_flags("abc/usage_config_test_main.cc")); - EXPECT_FALSE(config.contains_helpshort_flags("usage_config_main.cc")); - - absl::FlagsUsageConfig empty_config; - empty_config.contains_helpshort_flags = &TstContainsHelpshortFlags; - absl::SetFlagsUsageConfig(empty_config); - - EXPECT_TRUE( - flags::GetUsageConfig().contains_helpshort_flags("aaa/progname.cpp")); - EXPECT_FALSE( - flags::GetUsageConfig().contains_helpshort_flags("aaa/progmane.cpp")); -} - -// -------------------------------------------------------------------- - -TEST_F(FlagsUsageConfigTest, TestContainsHelpFlags) { - flags::SetProgramInvocationName("usage_config_test"); - - auto config = flags::GetUsageConfig(); - EXPECT_TRUE(config.contains_help_flags("zzz/usage_config_test.cc")); - EXPECT_TRUE( - config.contains_help_flags("bdir/a/zzz/usage_config_test-main.cc")); - EXPECT_TRUE( - config.contains_help_flags("//aqse/zzz/usage_config_test_main.cc")); - EXPECT_FALSE(config.contains_help_flags("zzz/aa/usage_config_main.cc")); - - absl::FlagsUsageConfig empty_config; - empty_config.contains_help_flags = &TstContainsHelpFlags; - absl::SetFlagsUsageConfig(empty_config); - - EXPECT_TRUE(flags::GetUsageConfig().contains_help_flags("zzz/main-body.c")); - EXPECT_FALSE( - flags::GetUsageConfig().contains_help_flags("zzz/dir/main-body.c")); -} - -// -------------------------------------------------------------------- - -TEST_F(FlagsUsageConfigTest, TestContainsHelppackageFlags) { - flags::SetProgramInvocationName("usage_config_test"); - - auto config = flags::GetUsageConfig(); - EXPECT_TRUE(config.contains_helppackage_flags("aaa/usage_config_test.cc")); - EXPECT_TRUE( - config.contains_helppackage_flags("bbdir/aaa/usage_config_test-main.cc")); - EXPECT_TRUE(config.contains_helppackage_flags( - "//aqswde/aaa/usage_config_test_main.cc")); - EXPECT_FALSE(config.contains_helppackage_flags("aadir/usage_config_main.cc")); - - absl::FlagsUsageConfig empty_config; - empty_config.contains_helppackage_flags = &TstContainsHelppackageFlags; - absl::SetFlagsUsageConfig(empty_config); - - EXPECT_TRUE( - flags::GetUsageConfig().contains_helppackage_flags("aaa/main-body.c")); - EXPECT_FALSE( - flags::GetUsageConfig().contains_helppackage_flags("aadir/main-body.c")); -} - -// -------------------------------------------------------------------- - -TEST_F(FlagsUsageConfigTest, TestVersionString) { - flags::SetProgramInvocationName("usage_config_test"); - -#ifdef NDEBUG - std::string expected_output = "usage_config_test\n"; -#else - std::string expected_output = - "usage_config_test\nDebug build (NDEBUG not #defined)\n"; -#endif - - EXPECT_EQ(flags::GetUsageConfig().version_string(), expected_output); - - absl::FlagsUsageConfig empty_config; - empty_config.version_string = &TstVersionString; - absl::SetFlagsUsageConfig(empty_config); - - EXPECT_EQ(flags::GetUsageConfig().version_string(), "program 1.0.0"); -} - -// -------------------------------------------------------------------- - -TEST_F(FlagsUsageConfigTest, TestNormalizeFilename) { - // This tests the default implementation. - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("a/a.cc"), "a/a.cc"); - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("/a/a.cc"), "a/a.cc"); - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("///a/a.cc"), "a/a.cc"); - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("/"), ""); - - // This tests that the custom implementation is called. - absl::FlagsUsageConfig empty_config; - empty_config.normalize_filename = &TstNormalizeFilename; - absl::SetFlagsUsageConfig(empty_config); - - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("a/a.cc"), "a.cc"); - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("aaa/a.cc"), "a/a.cc"); - - // This tests that the default implementation is called. - empty_config.normalize_filename = nullptr; - absl::SetFlagsUsageConfig(empty_config); - - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("a/a.cc"), "a/a.cc"); - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("/a/a.cc"), "a/a.cc"); - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("///a/a.cc"), "a/a.cc"); - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("\\a\\a.cc"), "a\\a.cc"); - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("//"), ""); - EXPECT_EQ(flags::GetUsageConfig().normalize_filename("\\\\"), ""); -} - -} // namespace |