aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/restricted/abseil-cpp-tstring
diff options
context:
space:
mode:
authorrobot-piglet <robot-piglet@yandex-team.com>2023-03-23 12:15:53 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2023-03-23 12:15:53 +0300
commit8d5942b8f813c0e704a166c3c83902ccceefca07 (patch)
treed717bac5cbd96eaff6a15e1c3f7b664b3b5dfce8 /contrib/restricted/abseil-cpp-tstring
parent091daa0ca1dd4df8f596b17239c6f9a72abf3aab (diff)
downloadydb-8d5942b8f813c0e704a166c3c83902ccceefca07.tar.gz
Intermediate changes
Diffstat (limited to 'contrib/restricted/abseil-cpp-tstring')
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/commandlineflag.cc34
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/commandlineflag.h200
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/config.h68
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/declare.h73
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/flag.cc38
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/flag.h310
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/commandlineflag.cc26
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/commandlineflag.h68
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag.cc615
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag.h800
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag_msvc.inc116
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/parse.h59
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/path_util.h62
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/private_handle_accessor.cc65
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/private_handle_accessor.h61
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/program_name.cc60
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/program_name.h50
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/registry.h97
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/sequence_lock.h187
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/usage.cc524
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/usage.h104
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/marshalling.cc241
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/marshalling.h356
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/parse.cc823
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/parse.h60
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/reflection.cc354
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/reflection.h90
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage.cc65
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage.h43
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage_config.cc165
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage_config.h135
-rw-r--r--contrib/restricted/abseil-cpp-tstring/y_absl/flags/ya.make44
32 files changed, 0 insertions, 5993 deletions
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/commandlineflag.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/commandlineflag.cc
deleted file mode 100644
index b70a9815c9..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 "y_absl/flags/commandlineflag.h"
-
-#include <util/generic/string.h>
-
-#include "y_absl/base/config.h"
-#include "y_absl/flags/internal/commandlineflag.h"
-#include "y_absl/strings/string_view.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-
-bool CommandLineFlag::IsRetired() const { return false; }
-bool CommandLineFlag::ParseFrom(y_absl::string_view value, TString* error) {
- return ParseFrom(value, flags_internal::SET_FLAGS_VALUE,
- flags_internal::kProgrammaticChange, *error);
-}
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/commandlineflag.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/commandlineflag.h
deleted file mode 100644
index 30c2bb07a5..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_COMMANDLINEFLAG_H_
-#define Y_ABSL_FLAGS_COMMANDLINEFLAG_H_
-
-#include <memory>
-#include <util/generic/string.h>
-
-#include "y_absl/base/config.h"
-#include "y_absl/base/internal/fast_type_id.h"
-#include "y_absl/flags/internal/commandlineflag.h"
-#include "y_absl/strings/string_view.h"
-#include "y_absl/types/optional.h"
-
-namespace y_absl {
-Y_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 y_absl::CommandLineFlag, invoke `y_absl::FindCommandLineFlag()`
-// passing it the flag name string.
-//
-// Example:
-//
-// // Obtain reflection handle for a flag named "flagname".
-// const y_absl::CommandLineFlag* my_flag_data =
-// y_absl::FindCommandLineFlag("flagname");
-//
-// // Now you can get flag info from that reflection handle.
-// TString flag_location = my_flag_data->Filename();
-// ...
-class CommandLineFlag {
- public:
- constexpr CommandLineFlag() = default;
-
- // Not copyable/assignable.
- CommandLineFlag(const CommandLineFlag&) = delete;
- CommandLineFlag& operator=(const CommandLineFlag&) = delete;
-
- // y_absl::CommandLineFlag::IsOfType()
- //
- // Return true iff flag has type T.
- template <typename T>
- inline bool IsOfType() const {
- return TypeId() == base_internal::FastTypeId<T>();
- }
-
- // y_absl::CommandLineFlag::TryGet()
- //
- // Attempts to retrieve the flag value. Returns value on success,
- // y_absl::nullopt otherwise.
- template <typename T>
- y_absl::optional<T> TryGet() const {
- if (IsRetired() || !IsOfType<T>()) {
- return y_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 y_absl::nullopt;
- }
- return std::move(u.value);
- }
-
- // y_absl::CommandLineFlag::Name()
- //
- // Returns name of this flag.
- virtual y_absl::string_view Name() const = 0;
-
- // y_absl::CommandLineFlag::Filename()
- //
- // Returns name of the file where this flag is defined.
- virtual TString Filename() const = 0;
-
- // y_absl::CommandLineFlag::Help()
- //
- // Returns help message associated with this flag.
- virtual TString Help() const = 0;
-
- // y_absl::CommandLineFlag::IsRetired()
- //
- // Returns true iff this object corresponds to retired flag.
- virtual bool IsRetired() const;
-
- // y_absl::CommandLineFlag::DefaultValue()
- //
- // Returns the default value for this flag.
- virtual TString DefaultValue() const = 0;
-
- // y_absl::CommandLineFlag::CurrentValue()
- //
- // Returns the current value for this flag.
- virtual TString CurrentValue() const = 0;
-
- // y_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(y_absl::string_view value, TString* 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(y_absl::string_view value,
- flags_internal::FlagSettingMode set_mode,
- flags_internal::ValueSource source,
- TString& 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(y_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;
-};
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_COMMANDLINEFLAG_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/config.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/config.h
deleted file mode 100644
index 08de490eb1..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/config.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 Y_ABSL_FLAGS_CONFIG_H_
-#define Y_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(Y_ABSL_FLAGS_STRIP_NAMES)
-
-#if defined(__ANDROID__)
-#define Y_ABSL_FLAGS_STRIP_NAMES 1
-
-#elif defined(__APPLE__)
-#include <TargetConditionals.h>
-#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-#define Y_ABSL_FLAGS_STRIP_NAMES 1
-#elif defined(TARGET_OS_EMBEDDED) && TARGET_OS_EMBEDDED
-#define Y_ABSL_FLAGS_STRIP_NAMES 1
-#endif // TARGET_OS_*
-#endif
-
-#endif // !defined(Y_ABSL_FLAGS_STRIP_NAMES)
-
-#if !defined(Y_ABSL_FLAGS_STRIP_NAMES)
-// If Y_ABSL_FLAGS_STRIP_NAMES wasn't set on the command line or above,
-// the default is not to strip.
-#define Y_ABSL_FLAGS_STRIP_NAMES 0
-#endif
-
-#if !defined(Y_ABSL_FLAGS_STRIP_HELP)
-// By default, if we strip names, we also strip help.
-#define Y_ABSL_FLAGS_STRIP_HELP Y_ABSL_FLAGS_STRIP_NAMES
-#endif
-
-// These macros represent the "source of truth" for the list of supported
-// built-in types.
-#define Y_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 Y_ABSL_FLAGS_INTERNAL_SUPPORTED_TYPES(A) \
- Y_ABSL_FLAGS_INTERNAL_BUILTIN_TYPES(A) \
- A(TString, std_string) \
- A(std::vector<TString>, std_vector_of_string)
-
-#endif // Y_ABSL_FLAGS_CONFIG_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/declare.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/declare.h
deleted file mode 100644
index 0b36402496..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/declare.h
+++ /dev/null
@@ -1,73 +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 Y_ABSL_DECLARE_FLAG macro, allowing you to declare an
-// `y_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 Y_ABSL_FLAGS_DECLARE_H_
-#define Y_ABSL_FLAGS_DECLARE_H_
-
-#include "y_absl/base/config.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-
-// y_absl::Flag<T> represents a flag of type 'T' created by Y_ABSL_FLAG.
-template <typename T>
-class Flag;
-
-} // namespace flags_internal
-
-// Flag
-//
-// Forward declaration of the `y_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
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-// Y_ABSL_DECLARE_FLAG()
-//
-// This macro is a convenience for declaring use of an `y_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 Y_ABSL_DECLARE_FLAG(type, name) macro expands to:
-//
-// extern y_absl::Flag<type> FLAGS_name;
-#define Y_ABSL_DECLARE_FLAG(type, name) Y_ABSL_DECLARE_FLAG_INTERNAL(type, name)
-
-// Internal implementation of Y_ABSL_DECLARE_FLAG to allow macro expansion of its
-// arguments. Clients must use Y_ABSL_DECLARE_FLAG instead.
-#define Y_ABSL_DECLARE_FLAG_INTERNAL(type, name) \
- extern y_absl::Flag<type> FLAGS_##name; \
- namespace y_absl /* block flags in namespaces */ {} \
- /* second redeclaration is to allow applying attributes */ \
- extern y_absl::Flag<type> FLAGS_##name
-
-#endif // Y_ABSL_FLAGS_DECLARE_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/flag.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/flag.cc
deleted file mode 100644
index 9bc5137f3e..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 "y_absl/flags/flag.h"
-
-#include "y_absl/base/config.h"
-
-namespace y_absl {
-Y_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 {
-
-Y_ABSL_CONST_INIT static y_absl::Mutex construction_guard(y_absl::kConstInit);
-
-y_absl::Mutex* GetGlobalConstructionGuard() { return &construction_guard; }
-
-} // namespace flags_internal
-
-#endif
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/flag.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/flag.h
deleted file mode 100644
index 65448650d3..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/flag.h
+++ /dev/null
@@ -1,310 +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 `y_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 `y_absl::Flag<T>`
-// instances. Instead, you define and declare flags using the
-// `Y_ABSL_FLAG()` and `Y_ABSL_DECLARE_FLAG()` macros, and get and set flag values
-// using the `y_absl::GetFlag()` and `y_absl::SetFlag()` functions.
-
-#ifndef Y_ABSL_FLAGS_FLAG_H_
-#define Y_ABSL_FLAGS_FLAG_H_
-
-#include <util/generic/string.h>
-#include <type_traits>
-
-#include "y_absl/base/attributes.h"
-#include "y_absl/base/config.h"
-#include "y_absl/base/optimization.h"
-#include "y_absl/flags/config.h"
-#include "y_absl/flags/internal/flag.h"
-#include "y_absl/flags/internal/registry.h"
-#include "y_absl/strings/string_view.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-
-// Flag
-//
-// An `y_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 `y_absl::Flag` type directly;
-// instead, you should declare flags using the `Y_ABSL_DECLARE_FLAG()` macro
-// within a header file, and define your flag using `Y_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"
-// Y_ABSL_DECLARE_FLAG(int, count);
-//
-// .cc file
-//
-// // Defines a flag named "FLAGS_count" with a default `int` value of 0.
-// Y_ABSL_FLAG(int, count, 0, "Count of items to process");
-//
-// No public methods of `y_absl::Flag<T>` are part of the Abseil Flags API.
-//
-// For type support of Abseil Flags, see the marshalling.h header file, which
-// discusses supported standard types, optional flags, and additional Abseil
-// type support.
-#if !defined(_MSC_VER) || defined(__clang__)
-template <typename T>
-using Flag = flags_internal::Flag<T>;
-#else
-#include "y_absl/flags/internal/flag_msvc.inc"
-#endif
-
-// GetFlag()
-//
-// Returns the value (of type `T`) of an `y_absl::Flag<T>` instance, by value. Do
-// not construct an `y_absl::Flag<T>` directly and call `y_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
-// `y_absl::GetFlag()` within any tight loops.
-//
-// Example:
-//
-// // FLAGS_count is a Flag of type `int`
-// int my_count = y_absl::GetFlag(FLAGS_count);
-//
-// // FLAGS_firstname is a Flag of type `TString`
-// TString first_name = y_absl::GetFlag(FLAGS_firstname);
-template <typename T>
-Y_ABSL_MUST_USE_RESULT T GetFlag(const y_absl::Flag<T>& flag) {
- return flags_internal::FlagImplPeer::InvokeGet<T>(flag);
-}
-
-// SetFlag()
-//
-// Sets the value of an `y_absl::Flag` to the value `v`. Do not construct an
-// `y_absl::Flag<T>` directly and call `y_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(y_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 `TString`.
-template <typename T, typename V>
-void SetFlag(y_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:
-//
-// TString = y_absl::GetFlagReflectionHandle(FLAGS_count).DefaultValue();
-
-template <typename T>
-const CommandLineFlag& GetFlagReflectionHandle(const y_absl::Flag<T>& f) {
- return flags_internal::FlagImplPeer::InvokeReflect(f);
-}
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-
-// Y_ABSL_FLAG()
-//
-// This macro defines an `y_absl::Flag<T>` instance of a specified type `T`:
-//
-// Y_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':
-//
-// y_absl::Flag<T> FLAGS_name = ...;
-//
-// Note that all such instances are created as global variables.
-//
-// For `Y_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 `y_absl::Flag<T>` directly. Only use the
-// `Y_ABSL_FLAG()` macro for such construction.
-#define Y_ABSL_FLAG(Type, name, default_value, help) \
- Y_ABSL_FLAG_IMPL(Type, name, default_value, help)
-
-// Y_ABSL_FLAG().OnUpdate()
-//
-// Defines a flag of type `T` with a callback attached:
-//
-// Y_ABSL_FLAG(T, name, default_value, help).OnUpdate(callback);
-//
-// `callback` should be convertible to `void (*)()`.
-//
-// 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: Y_ABSL_FLAG.OnUpdate() does not have a public definition. Hence, this
-// comment serves as its API documentation.
-
-// -----------------------------------------------------------------------------
-// Implementation details below this section
-// -----------------------------------------------------------------------------
-
-// Y_ABSL_FLAG_IMPL macro definition conditional on Y_ABSL_FLAGS_STRIP_NAMES
-#if !defined(_MSC_VER) || defined(__clang__)
-#define Y_ABSL_FLAG_IMPL_FLAG_PTR(flag) flag
-#define Y_ABSL_FLAG_IMPL_HELP_ARG(name) \
- y_absl::flags_internal::HelpArg<AbslFlagHelpGenFor##name>( \
- FLAGS_help_storage_##name)
-#define Y_ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name) \
- y_absl::flags_internal::DefaultArg<Type, AbslFlagDefaultGenFor##name>(0)
-#else
-#define Y_ABSL_FLAG_IMPL_FLAG_PTR(flag) flag.GetImpl()
-#define Y_ABSL_FLAG_IMPL_HELP_ARG(name) &AbslFlagHelpGenFor##name::NonConst
-#define Y_ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name) &AbslFlagDefaultGenFor##name::Gen
-#endif
-
-#if Y_ABSL_FLAGS_STRIP_NAMES
-#define Y_ABSL_FLAG_IMPL_FLAGNAME(txt) ""
-#define Y_ABSL_FLAG_IMPL_FILENAME() ""
-#define Y_ABSL_FLAG_IMPL_REGISTRAR(T, flag) \
- y_absl::flags_internal::FlagRegistrar<T, false>(Y_ABSL_FLAG_IMPL_FLAG_PTR(flag), \
- nullptr)
-#else
-#define Y_ABSL_FLAG_IMPL_FLAGNAME(txt) txt
-#define Y_ABSL_FLAG_IMPL_FILENAME() __FILE__
-#define Y_ABSL_FLAG_IMPL_REGISTRAR(T, flag) \
- y_absl::flags_internal::FlagRegistrar<T, true>(Y_ABSL_FLAG_IMPL_FLAG_PTR(flag), \
- __FILE__)
-#endif
-
-// Y_ABSL_FLAG_IMPL macro definition conditional on Y_ABSL_FLAGS_STRIP_HELP
-
-#if Y_ABSL_FLAGS_STRIP_HELP
-#define Y_ABSL_FLAG_IMPL_FLAGHELP(txt) y_absl::flags_internal::kStrippedFlagHelp
-#else
-#define Y_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 y_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
-// Y_ABSL_INTERNAL_UNIQUE_SHORT_NAME.
-// TODO(rogeeff): Apply __attribute__((nodebug)) to FLAGS_help_storage_##name
-#define Y_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 y_absl::string_view Value( \
- y_absl::string_view absl_flag_help = Y_ABSL_FLAG_IMPL_FLAGHELP(txt)) { \
- return absl_flag_help; \
- } \
- static TString NonConst() { return TString(Value()); } \
- }; \
- constexpr auto FLAGS_help_storage_##name Y_ABSL_INTERNAL_UNIQUE_SMALL_NAME() \
- Y_ABSL_ATTRIBUTE_SECTION_VARIABLE(flags_help_cold) = \
- y_absl::flags_internal::HelpStringAsArray<AbslFlagHelpGenFor##name>( \
- 0);
-
-#define Y_ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \
- struct AbslFlagDefaultGenFor##name { \
- Type value = y_absl::flags_internal::InitDefaultValue<Type>(default_value); \
- static void Gen(void* absl_flag_default_loc) { \
- new (absl_flag_default_loc) Type(AbslFlagDefaultGenFor##name{}.value); \
- } \
- };
-
-// Y_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 Y_ABSL_FLAG_IMPL(Type, name, default_value, help) \
- extern ::y_absl::Flag<Type> FLAGS_##name; \
- namespace y_absl /* block flags in namespaces */ {} \
- Y_ABSL_FLAG_IMPL_DECLARE_DEF_VAL_WRAPPER(name, Type, default_value) \
- Y_ABSL_FLAG_IMPL_DECLARE_HELP_WRAPPER(name, help) \
- Y_ABSL_CONST_INIT y_absl::Flag<Type> FLAGS_##name{ \
- Y_ABSL_FLAG_IMPL_FLAGNAME(#name), Y_ABSL_FLAG_IMPL_FILENAME(), \
- Y_ABSL_FLAG_IMPL_HELP_ARG(name), Y_ABSL_FLAG_IMPL_DEFAULT_ARG(Type, name)}; \
- extern y_absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name; \
- y_absl::flags_internal::FlagRegistrarEmpty FLAGS_no##name = \
- Y_ABSL_FLAG_IMPL_REGISTRAR(Type, FLAGS_##name)
-
-// Y_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 `Y_ABSL_FLAG`. To retire a flag, simply
-// replace an `Y_ABSL_FLAG` definition with `Y_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 Y_ABSL_RETIRED_FLAG(type, name, default_value, explanation) \
- static y_absl::flags_internal::RetiredFlag<type> RETIRED_FLAGS_##name; \
- Y_ABSL_ATTRIBUTE_UNUSED static const auto RETIRED_FLAGS_REG_##name = \
- (RETIRED_FLAGS_##name.Retire(#name), \
- ::y_absl::flags_internal::FlagRegistrarEmpty{})
-
-#endif // Y_ABSL_FLAGS_FLAG_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/commandlineflag.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/commandlineflag.cc
deleted file mode 100644
index d9c0f4d40e..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 "y_absl/flags/internal/commandlineflag.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-
-FlagStateInterface::~FlagStateInterface() {}
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/commandlineflag.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/commandlineflag.h
deleted file mode 100644
index 70d90d5441..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_INTERNAL_COMMANDLINEFLAG_H_
-#define Y_ABSL_FLAGS_INTERNAL_COMMANDLINEFLAG_H_
-
-#include "y_absl/base/config.h"
-#include "y_absl/base/internal/fast_type_id.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-
-// An alias for flag fast type id. This value identifies the flag value type
-// similarly 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 = y_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
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_INTERNAL_COMMANDLINEFLAG_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag.cc
deleted file mode 100644
index d3047ee045..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag.cc
+++ /dev/null
@@ -1,615 +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 "y_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 <util/generic/string.h>
-#include <typeinfo>
-
-#include "y_absl/base/call_once.h"
-#include "y_absl/base/casts.h"
-#include "y_absl/base/config.h"
-#include "y_absl/base/dynamic_annotations.h"
-#include "y_absl/base/optimization.h"
-#include "y_absl/flags/config.h"
-#include "y_absl/flags/internal/commandlineflag.h"
-#include "y_absl/flags/usage_config.h"
-#include "y_absl/memory/memory.h"
-#include "y_absl/strings/str_cat.h"
-#include "y_absl/strings/string_view.h"
-#include "y_absl/synchronization/mutex.h"
-
-namespace y_absl {
-Y_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 Y_ABSL_FLAGS_STRIP_HELP is set to 1
-// before including y_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;
- Y_ABSL_FLAGS_INTERNAL_SUPPORTED_TYPES(DONT_VALIDATE)
-#undef DONT_VALIDATE
-
- return true;
-}
-
-// RAII helper used to temporarily unlock and relock `y_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(y_absl::Mutex& mu) : mu_(mu) { mu_.Unlock(); }
- ~MutexRelock() { mu_.Lock(); }
-
- MutexRelock(const MutexRelock&) = delete;
- MutexRelock& operator=(const MutexRelock&) = delete;
-
- private:
- y_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 &&
- flag_impl_.ValueStorageKind() != FlagValueStorageKind::kSequenceLocked)
- 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;
-
- Y_ABSL_INTERNAL_LOG(INFO,
- y_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) {}
-
- void* heap_allocated;
- int64_t one_word;
- } 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_) y_absl::Mutex;
-
- auto def_kind = static_cast<FlagDefaultKind>(def_kind_);
-
- switch (ValueStorageKind()) {
- case FlagValueStorageKind::kValueAndInitBit:
- 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_));
- }
- if (ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit) {
- // We presume here the memory layout of FlagValueAndInitBit struct.
- uint8_t initialized = 1;
- std::memcpy(buf.data() + Sizeof(op_), &initialized,
- sizeof(initialized));
- }
- // Type can contain valid uninitialized bits, e.g. padding.
- Y_ABSL_ANNOTATE_MEMORY_IS_INITIALIZED(buf.data(), buf.size());
- OneWordValue().store(y_absl::bit_cast<int64_t>(buf),
- std::memory_order_release);
- break;
- }
- case FlagValueStorageKind::kSequenceLocked: {
- // For this storage kind the default_value_ always points to gen_func
- // during initialization.
- assert(def_kind == FlagDefaultKind::kGenFunc);
- (*default_value_.gen_func)(AtomicBufferValue());
- break;
- }
- 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;
- }
- seq_lock_.MarkInitialized();
-}
-
-y_absl::Mutex* FlagImpl::DataGuard() const {
- y_absl::call_once(const_cast<FlagImpl*>(this)->init_control_, &FlagImpl::Init,
- const_cast<FlagImpl*>(this));
-
- // data_guard_ is initialized inside Init.
- return reinterpret_cast<y_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 (Y_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;
-
-#ifdef Y_ABSL_INTERNAL_HAS_RTTI
- if (*lhs_runtime_type_id == *rhs_runtime_type_id) return;
-#endif
-
- Y_ABSL_INTERNAL_LOG(
- FATAL, y_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::kValueAndInitBit:
- case FlagValueStorageKind::kOneWordAtomic: {
- // Load the current value to avoid setting 'init' bit manualy.
- int64_t one_word_val = OneWordValue().load(std::memory_order_acquire);
- std::memcpy(&one_word_val, src, Sizeof(op_));
- OneWordValue().store(one_word_val, std::memory_order_release);
- seq_lock_.IncrementModificationCount();
- break;
- }
- case FlagValueStorageKind::kSequenceLocked: {
- seq_lock_.Write(AtomicBufferValue(), src, Sizeof(op_));
- break;
- }
- case FlagValueStorageKind::kAlignedBuffer:
- Copy(op_, src, AlignedBufferValue());
- seq_lock_.IncrementModificationCount();
- break;
- }
- modified_ = true;
- InvokeCallback();
-}
-
-y_absl::string_view FlagImpl::Name() const { return name_; }
-
-TString FlagImpl::Filename() const {
- return flags_internal::GetUsageConfig().normalize_filename(filename_);
-}
-
-TString FlagImpl::Help() const {
- return HelpSourceKind() == FlagHelpKind::kLiteral ? help_.literal
- : help_.gen_func();
-}
-
-FlagFastTypeId FlagImpl::TypeId() const {
- return flags_internal::FastTypeId(op_);
-}
-
-int64_t FlagImpl::ModificationCount() const {
- return seq_lock_.ModificationCount();
-}
-
-bool FlagImpl::IsSpecifiedOnCommandLine() const {
- y_absl::MutexLock l(DataGuard());
- return on_command_line_;
-}
-
-TString FlagImpl::DefaultValue() const {
- y_absl::MutexLock l(DataGuard());
-
- auto obj = MakeInitValue();
- return flags_internal::Unparse(op_, obj.get());
-}
-
-TString FlagImpl::CurrentValue() const {
- auto* guard = DataGuard(); // Make sure flag initialized
- switch (ValueStorageKind()) {
- case FlagValueStorageKind::kValueAndInitBit:
- case FlagValueStorageKind::kOneWordAtomic: {
- const auto one_word_val =
- y_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::kSequenceLocked: {
- std::unique_ptr<void, DynValueDeleter> cloned(flags_internal::Alloc(op_),
- DynValueDeleter{op_});
- ReadSequenceLockedData(cloned.get());
- return flags_internal::Unparse(op_, cloned.get());
- }
- case FlagValueStorageKind::kAlignedBuffer: {
- y_absl::MutexLock l(guard);
- return flags_internal::Unparse(op_, AlignedBufferValue());
- }
- }
-
- return "";
-}
-
-void FlagImpl::SetCallback(const FlagCallbackFunc mutation_callback) {
- y_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());
- y_absl::MutexLock lock(&callback_->guard);
- cb();
-}
-
-std::unique_ptr<FlagStateInterface> FlagImpl::SaveState() {
- y_absl::MutexLock l(DataGuard());
-
- bool modified = modified_;
- bool on_command_line = on_command_line_;
- switch (ValueStorageKind()) {
- case FlagValueStorageKind::kValueAndInitBit:
- case FlagValueStorageKind::kOneWordAtomic: {
- return y_absl::make_unique<FlagState>(
- *this, OneWordValue().load(std::memory_order_acquire), modified,
- on_command_line, ModificationCount());
- }
- case FlagValueStorageKind::kSequenceLocked: {
- void* cloned = flags_internal::Alloc(op_);
- // Read is guaranteed to be successful because we hold the lock.
- bool success =
- seq_lock_.TryRead(cloned, AtomicBufferValue(), Sizeof(op_));
- assert(success);
- static_cast<void>(success);
- return y_absl::make_unique<FlagState>(*this, cloned, modified,
- on_command_line, ModificationCount());
- }
- case FlagValueStorageKind::kAlignedBuffer: {
- return y_absl::make_unique<FlagState>(
- *this, flags_internal::Clone(op_, AlignedBufferValue()), modified,
- on_command_line, ModificationCount());
- }
- }
- return nullptr;
-}
-
-bool FlagImpl::RestoreState(const FlagState& flag_state) {
- y_absl::MutexLock l(DataGuard());
- if (flag_state.counter_ == ModificationCount()) {
- return false;
- }
-
- switch (ValueStorageKind()) {
- case FlagValueStorageKind::kValueAndInitBit:
- case FlagValueStorageKind::kOneWordAtomic:
- StoreValue(&flag_state.value_.one_word);
- break;
- case FlagValueStorageKind::kSequenceLocked:
- case FlagValueStorageKind::kAlignedBuffer:
- StoreValue(flag_state.value_.heap_allocated);
- 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<uint64_t>* FlagImpl::AtomicBufferValue() const {
- assert(ValueStorageKind() == FlagValueStorageKind::kSequenceLocked);
- return OffsetValue<std::atomic<uint64_t>>();
-}
-
-std::atomic<int64_t>& FlagImpl::OneWordValue() const {
- assert(ValueStorageKind() == FlagValueStorageKind::kOneWordAtomic ||
- ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit);
- return OffsetValue<FlagOneWordValue>()->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(
- y_absl::string_view value, TString& err) const {
- std::unique_ptr<void, DynValueDeleter> tentative_value = MakeInitValue();
-
- TString parse_err;
- if (!flags_internal::Parse(op_, value, tentative_value.get(), &parse_err)) {
- y_absl::string_view err_sep = parse_err.empty() ? "" : "; ";
- err = y_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::kValueAndInitBit:
- 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::kSequenceLocked: {
- ReadSequenceLockedData(dst);
- break;
- }
- case FlagValueStorageKind::kAlignedBuffer: {
- y_absl::MutexLock l(guard);
- flags_internal::CopyConstruct(op_, AlignedBufferValue(), dst);
- break;
- }
- }
-}
-
-int64_t FlagImpl::ReadOneWord() const {
- assert(ValueStorageKind() == FlagValueStorageKind::kOneWordAtomic ||
- ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit);
- auto* guard = DataGuard(); // Make sure flag initialized
- (void)guard;
- return OneWordValue().load(std::memory_order_acquire);
-}
-
-bool FlagImpl::ReadOneBool() const {
- assert(ValueStorageKind() == FlagValueStorageKind::kValueAndInitBit);
- auto* guard = DataGuard(); // Make sure flag initialized
- (void)guard;
- return y_absl::bit_cast<FlagValueAndInitBit<bool>>(
- OneWordValue().load(std::memory_order_acquire))
- .value;
-}
-
-void FlagImpl::ReadSequenceLockedData(void* dst) const {
- int size = Sizeof(op_);
- // Attempt to read using the sequence lock.
- if (Y_ABSL_PREDICT_TRUE(seq_lock_.TryRead(dst, AtomicBufferValue(), size))) {
- return;
- }
- // We failed due to contention. Acquire the lock to prevent contention
- // and try again.
- y_absl::ReaderMutexLock l(DataGuard());
- bool success = seq_lock_.TryRead(dst, AtomicBufferValue(), size);
- assert(success);
- static_cast<void>(success);
-}
-
-void FlagImpl::Write(const void* src) {
- y_absl::MutexLock l(DataGuard());
-
- if (ShouldValidateFlagValue(flags_internal::FastTypeId(op_))) {
- std::unique_ptr<void, DynValueDeleter> obj{flags_internal::Clone(op_, src),
- DynValueDeleter{op_}};
- TString ignored_error;
- TString src_as_str = flags_internal::Unparse(op_, src);
- if (!flags_internal::Parse(op_, src_as_str, obj.get(), &ignored_error)) {
- Y_ABSL_INTERNAL_LOG(ERROR, y_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(y_absl::string_view value, FlagSettingMode set_mode,
- ValueSource source, TString& err) {
- y_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 = y_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 {
- TString v = DefaultValue();
-
- y_absl::MutexLock lock(DataGuard());
-
- auto dst = MakeInitValue();
- TString error;
- if (!flags_internal::Parse(op_, v, dst.get(), &error)) {
- Y_ABSL_INTERNAL_LOG(
- FATAL,
- y_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(y_absl::string_view value) const {
- y_absl::MutexLock l(DataGuard());
-
- auto obj = MakeInitValue();
- TString ignored_error;
- return flags_internal::Parse(op_, value, obj.get(), &ignored_error);
-}
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag.h
deleted file mode 100644
index bce5e32656..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag.h
+++ /dev/null
@@ -1,800 +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 Y_ABSL_FLAGS_INTERNAL_FLAG_H_
-#define Y_ABSL_FLAGS_INTERNAL_FLAG_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <atomic>
-#include <cstring>
-#include <memory>
-#include <new>
-#include <util/generic/string.h>
-#include <type_traits>
-#include <typeinfo>
-
-#include "y_absl/base/attributes.h"
-#include "y_absl/base/call_once.h"
-#include "y_absl/base/casts.h"
-#include "y_absl/base/config.h"
-#include "y_absl/base/optimization.h"
-#include "y_absl/base/thread_annotations.h"
-#include "y_absl/flags/commandlineflag.h"
-#include "y_absl/flags/config.h"
-#include "y_absl/flags/internal/commandlineflag.h"
-#include "y_absl/flags/internal/registry.h"
-#include "y_absl/flags/internal/sequence_lock.h"
-#include "y_absl/flags/marshalling.h"
-#include "y_absl/meta/type_traits.h"
-#include "y_absl/strings/string_view.h"
-#include "y_absl/synchronization/mutex.h"
-#include "y_absl/utility/utility.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-
-///////////////////////////////////////////////////////////////////////////////
-// Forward declaration of y_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>
-Y_ABSL_MUST_USE_RESULT T GetFlag(const y_absl::Flag<T>& flag);
-
-template <typename T>
-void SetFlag(y_absl::Flag<T>* flag, const T& v);
-
-template <typename T, typename V>
-void SetFlag(y_absl::Flag<T>* flag, const V& v);
-
-template <typename U>
-const CommandLineFlag& GetFlagReflectionHandle(const y_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, y_absl::string_view text, void* dst,
- TString* error) {
- return op(FlagOp::kParse, &text, dst, error) != nullptr;
-}
-// Returns string representing supplied value.
-inline TString Unparse(FlagOpFn op, const void* val) {
- TString 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
-// y_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() {
-#ifdef Y_ABSL_INTERNAL_HAS_RTTI
- return &typeid(T);
-#else
- return nullptr;
-#endif
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Flag help auxiliary structs.
-
-// This is help argument for y_absl::Flag encapsulating the string literal pointer
-// or pointer to function generating it as well as enum descriminating two
-// cases.
-using HelpGenFunc = TString (*)();
-
-template <size_t N>
-struct FixedCharArray {
- char value[N];
-
- template <size_t... I>
- static constexpr FixedCharArray<N> FromLiteralString(
- y_absl::string_view str, y_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(), y_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 y_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 y_absl::Flag. No additionl code is generated by
-// Y_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 Y_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 Y_ABSL_FLAGS_INTERNAL_DFLT_FOR_TYPE(T, name) \
- T name##_value; \
- constexpr explicit FlagDefaultSrc(T value) : name##_value(value) {} // NOLINT
- Y_ABSL_FLAGS_INTERNAL_BUILTIN_TYPES(Y_ABSL_FLAGS_INTERNAL_DFLT_FOR_TYPE)
-#undef Y_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 Y_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 =
- ((void)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 static_cast<int64_t>(0xababababababababll);
-}
-
-template <typename T>
-using FlagUseValueAndInitBitStorage = std::integral_constant<
- bool, y_absl::type_traits_internal::is_trivially_copyable<T>::value &&
- std::is_default_constructible<T>::value && (sizeof(T) < 8)>;
-
-template <typename T>
-using FlagUseOneWordStorage = std::integral_constant<
- bool, y_absl::type_traits_internal::is_trivially_copyable<T>::value &&
- (sizeof(T) <= 8)>;
-
-template <class T>
-using FlagUseSequenceLockStorage = std::integral_constant<
- bool, y_absl::type_traits_internal::is_trivially_copyable<T>::value &&
- (sizeof(T) > 8)>;
-
-enum class FlagValueStorageKind : uint8_t {
- kValueAndInitBit = 0,
- kOneWordAtomic = 1,
- kSequenceLocked = 2,
- kAlignedBuffer = 3,
-};
-
-template <typename T>
-static constexpr FlagValueStorageKind StorageKind() {
- return FlagUseValueAndInitBitStorage<T>::value
- ? FlagValueStorageKind::kValueAndInitBit
- : FlagUseOneWordStorage<T>::value
- ? FlagValueStorageKind::kOneWordAtomic
- : FlagUseSequenceLockStorage<T>::value
- ? FlagValueStorageKind::kSequenceLocked
- : FlagValueStorageKind::kAlignedBuffer;
-}
-
-struct FlagOneWordValue {
- constexpr explicit FlagOneWordValue(int64_t v) : value(v) {}
- std::atomic<int64_t> value;
-};
-
-template <typename T>
-struct alignas(8) FlagValueAndInitBit {
- T value;
- // Use an int instead of a bool to guarantee that a non-zero value has
- // a bit set.
- uint8_t init;
-};
-
-template <typename T,
- FlagValueStorageKind Kind = flags_internal::StorageKind<T>()>
-struct FlagValue;
-
-template <typename T>
-struct FlagValue<T, FlagValueStorageKind::kValueAndInitBit> : FlagOneWordValue {
- constexpr FlagValue() : FlagOneWordValue(0) {}
- bool Get(const SequenceLock&, T& dst) const {
- int64_t storage = value.load(std::memory_order_acquire);
- if (Y_ABSL_PREDICT_FALSE(storage == 0)) {
- return false;
- }
- dst = y_absl::bit_cast<FlagValueAndInitBit<T>>(storage).value;
- return true;
- }
-};
-
-template <typename T>
-struct FlagValue<T, FlagValueStorageKind::kOneWordAtomic> : FlagOneWordValue {
- constexpr FlagValue() : FlagOneWordValue(UninitializedFlagValue()) {}
- bool Get(const SequenceLock&, T& dst) const {
- int64_t one_word_val = value.load(std::memory_order_acquire);
- if (Y_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::kSequenceLocked> {
- bool Get(const SequenceLock& lock, T& dst) const {
- return lock.TryRead(&dst, value_words, sizeof(T));
- }
-
- static constexpr int kNumWords =
- flags_internal::AlignUp(sizeof(T), sizeof(uint64_t)) / sizeof(uint64_t);
-
- alignas(T) alignas(
- std::atomic<uint64_t>) std::atomic<uint64_t> value_words[kNumWords];
-};
-
-template <typename T>
-struct FlagValue<T, FlagValueStorageKind::kAlignedBuffer> {
- bool Get(const SequenceLock&, T&) const { return false; }
-
- alignas(T) char value[sizeof(T)];
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// 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;
- y_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),
- callback_(nullptr),
- default_value_(default_arg.source),
- data_guard_{} {}
-
- // Constant access methods
- int64_t ReadOneWord() const Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
- bool ReadOneBool() const Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
- void Read(void* dst) const override Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
- void Read(bool* value) const Y_ABSL_LOCKS_EXCLUDED(*DataGuard()) {
- *value = ReadOneBool();
- }
- template <typename T,
- y_absl::enable_if_t<flags_internal::StorageKind<T>() ==
- FlagValueStorageKind::kOneWordAtomic,
- int> = 0>
- void Read(T* value) const Y_ABSL_LOCKS_EXCLUDED(*DataGuard()) {
- int64_t v = ReadOneWord();
- std::memcpy(value, static_cast<const void*>(&v), sizeof(T));
- }
- template <typename T,
- typename std::enable_if<flags_internal::StorageKind<T>() ==
- FlagValueStorageKind::kValueAndInitBit,
- int>::type = 0>
- void Read(T* value) const Y_ABSL_LOCKS_EXCLUDED(*DataGuard()) {
- *value = y_absl::bit_cast<FlagValueAndInitBit<T>>(ReadOneWord()).value;
- }
-
- // Mutating access methods
- void Write(const void* src) Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
-
- // Interfaces to operate on callbacks.
- void SetCallback(const FlagCallbackFunc mutation_callback)
- Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
- void InvokeCallback() const Y_ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard());
-
- // Used in read/write operations to validate source/target has correct type.
- // For example if flag is declared as y_absl::Flag<int> FLAGS_foo, a call to
- // y_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.
- y_absl::Mutex* DataGuard() const
- Y_ABSL_LOCK_RETURNED(reinterpret_cast<y_absl::Mutex*>(data_guard_));
- // Returns heap allocated value of type T initialized with default value.
- std::unique_ptr<void, DynValueDeleter> MakeInitValue() const
- Y_ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard());
- // Flag initialization called via y_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
- // used for non-trivially-copyable data types.
- // Returns a mutable pointer to the start of a buffer.
- void* AlignedBufferValue() const;
-
- // The same as above, but used for sequencelock-protected storage.
- std::atomic<uint64_t>* AtomicBufferValue() 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;
-
- // Attempts to parse supplied `value` string. If parsing is successful,
- // returns new value. Otherwise returns nullptr.
- std::unique_ptr<void, DynValueDeleter> TryParse(y_absl::string_view value,
- TString& err) const
- Y_ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard());
- // Stores the flag value based on the pointer to the source.
- void StoreValue(const void* src) Y_ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard());
-
- // Copy the flag data, protected by `seq_lock_` into `dst`.
- //
- // REQUIRES: ValueStorageKind() == kSequenceLocked.
- void ReadSequenceLockedData(void* dst) const
- Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
-
- FlagHelpKind HelpSourceKind() const {
- return static_cast<FlagHelpKind>(help_source_kind_);
- }
- FlagValueStorageKind ValueStorageKind() const {
- return static_cast<FlagValueStorageKind>(value_storage_kind_);
- }
- FlagDefaultKind DefaultKind() const
- Y_ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard()) {
- return static_cast<FlagDefaultKind>(def_kind_);
- }
-
- // CommandLineFlag interface implementation
- y_absl::string_view Name() const override;
- TString Filename() const override;
- TString Help() const override;
- FlagFastTypeId TypeId() const override;
- bool IsSpecifiedOnCommandLine() const override
- Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
- TString DefaultValue() const override Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
- TString CurrentValue() const override Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
- bool ValidateInputValue(y_absl::string_view value) const override
- Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
- void CheckDefaultValueParsingRoundtrip() const override
- Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
-
- int64_t ModificationCount() const Y_ABSL_EXCLUSIVE_LOCKS_REQUIRED(*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
- Y_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)
- Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
-
- bool ParseFrom(y_absl::string_view value, FlagSettingMode set_mode,
- ValueSource source, TString& error) override
- Y_ABSL_LOCKS_EXCLUDED(*DataGuard());
-
- // Immutable flag's state.
-
- // Flags name passed to Y_ABSL_FLAG as second arg.
- const char* const name_;
- // The file name where Y_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 Y_ABSL_GUARDED_BY(*DataGuard());
- // Has this flag been specified on command line.
- bool on_command_line_ : 1 Y_ABSL_GUARDED_BY(*DataGuard());
-
- // Unique tag for y_absl::call_once call to initialize this flag.
- y_absl::once_flag init_control_;
-
- // Sequence lock / mutation counter.
- flags_internal::SequenceLock seq_lock_;
-
- // Optional flag's callback and y_absl::Mutex to guard the invocations.
- FlagCallback* callback_ Y_ABSL_GUARDED_BY(*DataGuard());
- // Either a pointer to the function generating the default value based on the
- // value specified in Y_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 y_absl::Mutex to guard flag data. It will be
- // initialized in FlagImpl::Init via placement new.
- // We can't use "y_absl::Mutex data_guard_", since this class is not literal.
- // We do not want to use "y_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(y_absl::Mutex) mutable char data_guard_[sizeof(y_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
- y_absl::string_view Name() const { return impl_.Name(); }
- TString Filename() const { return impl_.Filename(); }
- TString Help() const { return impl_.Help(); }
- // Do not use. To be removed.
- bool IsSpecifiedOnCommandLine() const {
- return impl_.IsSpecifiedOnCommandLine();
- }
- TString DefaultValue() const { return impl_.DefaultValue(); }
- TString 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 (Y_ABSL_PREDICT_FALSE(!value_.Get(impl_.seq_lock_, 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 (!y_absl::ParseFlag<T>(*static_cast<const y_absl::string_view*>(v1), &temp,
- static_cast<TString*>(v3))) {
- return nullptr;
- }
- *static_cast<T*>(v2) = std::move(temp);
- return v2;
- }
- case FlagOp::kUnparse:
- *static_cast<TString*>(v2) =
- y_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.
- size_t round_to = alignof(FlagValue<T>);
- size_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:
-// Y_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, const char* filename) : flag_(flag) {
- if (do_register)
- flags_internal::RegisterCommandLineFlag(flag_.impl_, filename);
- }
-
- 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
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_INTERNAL_FLAG_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag_msvc.inc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag_msvc.inc
deleted file mode 100644
index f9beb09f90..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/flag_msvc.inc
+++ /dev/null
@@ -1,116 +0,0 @@
-//
-// Copyright 2021 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.
-
-// Do not include this file directly.
-// Include y_absl/flags/flag.h instead.
-
-// 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 `y_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 `y_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 {
-y_absl::Mutex* GetGlobalConstructionGuard();
-} // namespace flags_internal
-
-// Public methods of `y_absl::Flag<T>` are NOT part of the Abseil Flags API.
-// See https://abseil.io/docs/cpp/guides/flags
-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)) {
- y_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 `y_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(); }
- y_absl::string_view Name() const { return GetImpl().Name(); }
- TString Help() const { return GetImpl().Help(); }
- bool IsModified() const { return GetImpl().IsModified(); }
- bool IsSpecifiedOnCommandLine() const {
- return GetImpl().IsSpecifiedOnCommandLine();
- }
- TString Filename() const { return GetImpl().Filename(); }
- TString DefaultValue() const { return GetImpl().DefaultValue(); }
- TString 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_;
-};
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/parse.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/parse.h
deleted file mode 100644
index 64125f1489..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_INTERNAL_PARSE_H_
-#define Y_ABSL_FLAGS_INTERNAL_PARSE_H_
-
-#include <util/generic/string.h>
-#include <vector>
-
-#include "y_absl/base/config.h"
-#include "y_absl/flags/declare.h"
-#include "y_absl/strings/string_view.h"
-
-Y_ABSL_DECLARE_FLAG(std::vector<TString>, flagfile);
-Y_ABSL_DECLARE_FLAG(std::vector<TString>, fromenv);
-Y_ABSL_DECLARE_FLAG(std::vector<TString>, tryfromenv);
-Y_ABSL_DECLARE_FLAG(std::vector<TString>, undefok);
-
-namespace y_absl {
-Y_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(y_absl::string_view flag_name);
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_INTERNAL_PARSE_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/path_util.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/path_util.h
deleted file mode 100644
index 7c382c87db..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_INTERNAL_PATH_UTIL_H_
-#define Y_ABSL_FLAGS_INTERNAL_PATH_UTIL_H_
-
-#include "y_absl/base/config.h"
-#include "y_absl/strings/string_view.h"
-
-namespace y_absl {
-Y_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 y_absl::string_view Basename(y_absl::string_view filename) {
- auto last_slash_pos = filename.find_last_of("/\\");
-
- return last_slash_pos == y_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 y_absl::string_view Package(y_absl::string_view filename) {
- auto last_slash_pos = filename.find_last_of("/\\");
-
- return last_slash_pos == y_absl::string_view::npos
- ? y_absl::string_view()
- : filename.substr(0, last_slash_pos + 1);
-}
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_INTERNAL_PATH_UTIL_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/private_handle_accessor.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/private_handle_accessor.cc
deleted file mode 100644
index 4bba3943dc..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 "y_absl/flags/internal/private_handle_accessor.h"
-
-#include <memory>
-#include <util/generic/string.h>
-
-#include "y_absl/base/config.h"
-#include "y_absl/flags/commandlineflag.h"
-#include "y_absl/flags/internal/commandlineflag.h"
-#include "y_absl/strings/string_view.h"
-
-namespace y_absl {
-Y_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,
- y_absl::string_view value) {
- return flag.ValidateInputValue(value);
-}
-
-void PrivateHandleAccessor::CheckDefaultValueParsingRoundtrip(
- const CommandLineFlag& flag) {
- flag.CheckDefaultValueParsingRoundtrip();
-}
-
-bool PrivateHandleAccessor::ParseFrom(CommandLineFlag& flag,
- y_absl::string_view value,
- flags_internal::FlagSettingMode set_mode,
- flags_internal::ValueSource source,
- TString& error) {
- return flag.ParseFrom(value, set_mode, source, error);
-}
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/private_handle_accessor.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/private_handle_accessor.h
deleted file mode 100644
index 889a09537f..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_INTERNAL_PRIVATE_HANDLE_ACCESSOR_H_
-#define Y_ABSL_FLAGS_INTERNAL_PRIVATE_HANDLE_ACCESSOR_H_
-
-#include <memory>
-#include <util/generic/string.h>
-
-#include "y_absl/base/config.h"
-#include "y_absl/flags/commandlineflag.h"
-#include "y_absl/flags/internal/commandlineflag.h"
-#include "y_absl/strings/string_view.h"
-
-namespace y_absl {
-Y_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,
- y_absl::string_view value);
-
- // Access to CommandLineFlag::CheckDefaultValueParsingRoundtrip.
- static void CheckDefaultValueParsingRoundtrip(const CommandLineFlag& flag);
-
- static bool ParseFrom(CommandLineFlag& flag, y_absl::string_view value,
- flags_internal::FlagSettingMode set_mode,
- flags_internal::ValueSource source, TString& error);
-};
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_INTERNAL_PRIVATE_HANDLE_ACCESSOR_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/program_name.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/program_name.cc
deleted file mode 100644
index 7739f99089..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 "y_absl/flags/internal/program_name.h"
-
-#include <util/generic/string.h>
-
-#include "y_absl/base/attributes.h"
-#include "y_absl/base/config.h"
-#include "y_absl/base/const_init.h"
-#include "y_absl/base/thread_annotations.h"
-#include "y_absl/flags/internal/path_util.h"
-#include "y_absl/strings/string_view.h"
-#include "y_absl/synchronization/mutex.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-
-Y_ABSL_CONST_INIT static y_absl::Mutex program_name_guard(y_absl::kConstInit);
-Y_ABSL_CONST_INIT static TString* program_name
- Y_ABSL_GUARDED_BY(program_name_guard) = nullptr;
-
-TString ProgramInvocationName() {
- y_absl::MutexLock l(&program_name_guard);
-
- return program_name ? *program_name : "UNKNOWN";
-}
-
-TString ShortProgramInvocationName() {
- y_absl::MutexLock l(&program_name_guard);
-
- return program_name ? TString(flags_internal::Basename(*program_name))
- : "UNKNOWN";
-}
-
-void SetProgramInvocationName(y_absl::string_view prog_name_str) {
- y_absl::MutexLock l(&program_name_guard);
-
- if (!program_name)
- program_name = new TString(prog_name_str);
- else
- program_name->assign(prog_name_str.data(), prog_name_str.size());
-}
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/program_name.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/program_name.h
deleted file mode 100644
index 817f93e094..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_INTERNAL_PROGRAM_NAME_H_
-#define Y_ABSL_FLAGS_INTERNAL_PROGRAM_NAME_H_
-
-#include <util/generic/string.h>
-
-#include "y_absl/base/config.h"
-#include "y_absl/strings/string_view.h"
-
-// --------------------------------------------------------------------
-// Program name
-
-namespace y_absl {
-Y_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.
-TString ProgramInvocationName();
-
-// Returns base name for program invocation name. For example, if
-// ProgramInvocationName() == "a/b/mybinary"
-// then
-// ShortProgramInvocationName() == "mybinary"
-TString ShortProgramInvocationName();
-
-// Sets program invocation name to a new value. Should only be called once
-// during program initialization, before any threads are spawned.
-void SetProgramInvocationName(y_absl::string_view prog_name_str);
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_INTERNAL_PROGRAM_NAME_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/registry.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/registry.h
deleted file mode 100644
index cb3afdd890..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_INTERNAL_REGISTRY_H_
-#define Y_ABSL_FLAGS_INTERNAL_REGISTRY_H_
-
-#include <functional>
-
-#include "y_absl/base/config.h"
-#include "y_absl/flags/commandlineflag.h"
-#include "y_absl/flags/internal/commandlineflag.h"
-#include "y_absl/strings/string_view.h"
-
-// --------------------------------------------------------------------
-// Global flags registry API.
-
-namespace y_absl {
-Y_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&, const char* filename);
-
-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
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_INTERNAL_REGISTRY_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/sequence_lock.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/sequence_lock.h
deleted file mode 100644
index 269b3413c8..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/sequence_lock.h
+++ /dev/null
@@ -1,187 +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 Y_ABSL_FLAGS_INTERNAL_SEQUENCE_LOCK_H_
-#define Y_ABSL_FLAGS_INTERNAL_SEQUENCE_LOCK_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <atomic>
-#include <cassert>
-#include <cstring>
-
-#include "y_absl/base/optimization.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-
-// Align 'x' up to the nearest 'align' bytes.
-inline constexpr size_t AlignUp(size_t x, size_t align) {
- return align * ((x + align - 1) / align);
-}
-
-// A SequenceLock implements lock-free reads. A sequence counter is incremented
-// before and after each write, and readers access the counter before and after
-// accessing the protected data. If the counter is verified to not change during
-// the access, and the sequence counter value was even, then the reader knows
-// that the read was race-free and valid. Otherwise, the reader must fall back
-// to a Mutex-based code path.
-//
-// This particular SequenceLock starts in an "uninitialized" state in which
-// TryRead() returns false. It must be enabled by calling MarkInitialized().
-// This serves as a marker that the associated flag value has not yet been
-// initialized and a slow path needs to be taken.
-//
-// The memory reads and writes protected by this lock must use the provided
-// `TryRead()` and `Write()` functions. These functions behave similarly to
-// `memcpy()`, with one oddity: the protected data must be an array of
-// `std::atomic<uint64>`. This is to comply with the C++ standard, which
-// considers data races on non-atomic objects to be undefined behavior. See "Can
-// Seqlocks Get Along With Programming Language Memory Models?"[1] by Hans J.
-// Boehm for more details.
-//
-// [1] https://www.hpl.hp.com/techreports/2012/HPL-2012-68.pdf
-class SequenceLock {
- public:
- constexpr SequenceLock() : lock_(kUninitialized) {}
-
- // Mark that this lock is ready for use.
- void MarkInitialized() {
- assert(lock_.load(std::memory_order_relaxed) == kUninitialized);
- lock_.store(0, std::memory_order_release);
- }
-
- // Copy "size" bytes of data from "src" to "dst", protected as a read-side
- // critical section of the sequence lock.
- //
- // Unlike traditional sequence lock implementations which loop until getting a
- // clean read, this implementation returns false in the case of concurrent
- // calls to `Write`. In such a case, the caller should fall back to a
- // locking-based slow path.
- //
- // Returns false if the sequence lock was not yet marked as initialized.
- //
- // NOTE: If this returns false, "dst" may be overwritten with undefined
- // (potentially uninitialized) data.
- bool TryRead(void* dst, const std::atomic<uint64_t>* src, size_t size) const {
- // Acquire barrier ensures that no loads done by f() are reordered
- // above the first load of the sequence counter.
- int64_t seq_before = lock_.load(std::memory_order_acquire);
- if (Y_ABSL_PREDICT_FALSE(seq_before & 1) == 1) return false;
- RelaxedCopyFromAtomic(dst, src, size);
- // Another acquire fence ensures that the load of 'lock_' below is
- // strictly ordered after the RelaxedCopyToAtomic call above.
- std::atomic_thread_fence(std::memory_order_acquire);
- int64_t seq_after = lock_.load(std::memory_order_relaxed);
- return Y_ABSL_PREDICT_TRUE(seq_before == seq_after);
- }
-
- // Copy "size" bytes from "src" to "dst" as a write-side critical section
- // of the sequence lock. Any concurrent readers will be forced to retry
- // until they get a read that does not conflict with this write.
- //
- // This call must be externally synchronized against other calls to Write,
- // but may proceed concurrently with reads.
- void Write(std::atomic<uint64_t>* dst, const void* src, size_t size) {
- // We can use relaxed instructions to increment the counter since we
- // are extenally synchronized. The std::atomic_thread_fence below
- // ensures that the counter updates don't get interleaved with the
- // copy to the data.
- int64_t orig_seq = lock_.load(std::memory_order_relaxed);
- assert((orig_seq & 1) == 0); // Must be initially unlocked.
- lock_.store(orig_seq + 1, std::memory_order_relaxed);
-
- // We put a release fence between update to lock_ and writes to shared data.
- // Thus all stores to shared data are effectively release operations and
- // update to lock_ above cannot be re-ordered past any of them. Note that
- // this barrier is not for the fetch_add above. A release barrier for the
- // fetch_add would be before it, not after.
- std::atomic_thread_fence(std::memory_order_release);
- RelaxedCopyToAtomic(dst, src, size);
- // "Release" semantics ensure that none of the writes done by
- // RelaxedCopyToAtomic() can be reordered after the following modification.
- lock_.store(orig_seq + 2, std::memory_order_release);
- }
-
- // Return the number of times that Write() has been called.
- //
- // REQUIRES: This must be externally synchronized against concurrent calls to
- // `Write()` or `IncrementModificationCount()`.
- // REQUIRES: `MarkInitialized()` must have been previously called.
- int64_t ModificationCount() const {
- int64_t val = lock_.load(std::memory_order_relaxed);
- assert(val != kUninitialized && (val & 1) == 0);
- return val / 2;
- }
-
- // REQUIRES: This must be externally synchronized against concurrent calls to
- // `Write()` or `ModificationCount()`.
- // REQUIRES: `MarkInitialized()` must have been previously called.
- void IncrementModificationCount() {
- int64_t val = lock_.load(std::memory_order_relaxed);
- assert(val != kUninitialized);
- lock_.store(val + 2, std::memory_order_relaxed);
- }
-
- private:
- // Perform the equivalent of "memcpy(dst, src, size)", but using relaxed
- // atomics.
- static void RelaxedCopyFromAtomic(void* dst, const std::atomic<uint64_t>* src,
- size_t size) {
- char* dst_byte = static_cast<char*>(dst);
- while (size >= sizeof(uint64_t)) {
- uint64_t word = src->load(std::memory_order_relaxed);
- std::memcpy(dst_byte, &word, sizeof(word));
- dst_byte += sizeof(word);
- src++;
- size -= sizeof(word);
- }
- if (size > 0) {
- uint64_t word = src->load(std::memory_order_relaxed);
- std::memcpy(dst_byte, &word, size);
- }
- }
-
- // Perform the equivalent of "memcpy(dst, src, size)", but using relaxed
- // atomics.
- static void RelaxedCopyToAtomic(std::atomic<uint64_t>* dst, const void* src,
- size_t size) {
- const char* src_byte = static_cast<const char*>(src);
- while (size >= sizeof(uint64_t)) {
- uint64_t word;
- std::memcpy(&word, src_byte, sizeof(word));
- dst->store(word, std::memory_order_relaxed);
- src_byte += sizeof(word);
- dst++;
- size -= sizeof(word);
- }
- if (size > 0) {
- uint64_t word = 0;
- std::memcpy(&word, src_byte, size);
- dst->store(word, std::memory_order_relaxed);
- }
- }
-
- static constexpr int64_t kUninitialized = -1;
- std::atomic<int64_t> lock_;
-};
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_INTERNAL_SEQUENCE_LOCK_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/usage.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/usage.cc
deleted file mode 100644
index cf7eff8ec9..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 "y_absl/flags/internal/usage.h"
-
-#include <stdint.h>
-
-#include <functional>
-#include <map>
-#include <ostream>
-#include <util/generic/string.h>
-#include <utility>
-#include <vector>
-
-#include "y_absl/base/config.h"
-#include "y_absl/flags/commandlineflag.h"
-#include "y_absl/flags/flag.h"
-#include "y_absl/flags/internal/flag.h"
-#include "y_absl/flags/internal/path_util.h"
-#include "y_absl/flags/internal/private_handle_accessor.h"
-#include "y_absl/flags/internal/program_name.h"
-#include "y_absl/flags/internal/registry.h"
-#include "y_absl/flags/usage_config.h"
-#include "y_absl/strings/str_cat.h"
-#include "y_absl/strings/str_split.h"
-#include "y_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 y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-namespace {
-
-using PerFlagFilter = std::function<bool(const y_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 &amp; Cookies</title>"
-class XMLElement {
- public:
- XMLElement(y_absl::string_view tag, y_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 << "&quot;";
- break;
- case '\'':
- out << "&apos;";
- break;
- case '&':
- out << "&amp;";
- break;
- case '<':
- out << "&lt;";
- break;
- case '>':
- out << "&gt;";
- break;
- default:
- out << c;
- break;
- }
- }
-
- return out << "</" << xml_elem.tag_ << ">";
- }
-
- private:
- y_absl::string_view tag_;
- y_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(y_absl::string_view str, bool wrap_line = false) {
- // Empty string - do nothing.
- if (str.empty()) return;
-
- std::vector<y_absl::string_view> tokens;
- if (wrap_line) {
- for (auto line : y_absl::StrSplit(str, y_absl::ByAnyChar("\n\r"))) {
- if (!tokens.empty()) {
- // Keep line separators in the input string.
- tokens.push_back("\n");
- }
- for (auto token :
- y_absl::StrSplit(line, y_absl::ByAnyChar(" \t"), y_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_ << TString(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(y_absl::StrCat("--", flag.Name()));
-
- // Flag help.
- printer.Write(y_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.
- TString dflt_val = flag.DefaultValue();
- TString curr_val = flag.CurrentValue();
- bool is_modified = curr_val != dflt_val;
-
- if (flag.IsOfType<TString>()) {
- dflt_val = y_absl::StrCat("\"", dflt_val, "\"");
- }
- printer.Write(y_absl::StrCat("default: ", dflt_val, ";"));
-
- if (is_modified) {
- if (flag.IsOfType<TString>()) {
- curr_val = y_absl::StrCat("\"", curr_val, "\"");
- }
- printer.Write(y_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, y_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';
- }
-
- // Ordered 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<TString,
- std::map<TString, std::vector<const y_absl::CommandLineFlag*>>>
- matching_flags;
-
- flags_internal::ForEachFlag([&](y_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;
-
- TString flag_filename = flag.Filename();
-
- matching_flags[TString(flags_internal::Package(flag_filename))]
- [flag_filename]
- .push_back(&flag);
- });
-
- y_absl::string_view package_separator; // controls blank lines between packages
- y_absl::string_view file_separator; // controls blank lines between files
- for (auto& package : matching_flags) {
- if (format == HelpFormat::kHumanReadable) {
- out << package_separator;
- package_separator = "\n\n";
- }
-
- file_separator = "";
- for (auto& flags_in_file : package.second) {
- if (format == HelpFormat::kHumanReadable) {
- out << file_separator << " Flags from " << flags_in_file.first
- << ":\n";
- file_separator = "\n";
- }
-
- std::sort(std::begin(flags_in_file.second),
- std::end(flags_in_file.second),
- [](const CommandLineFlag* lhs, const CommandLineFlag* rhs) {
- return lhs->Name() < rhs->Name();
- });
-
- 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, y_absl::string_view program_usage_message) {
- FlagsHelpImpl(
- out,
- [&](const y_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, y_absl::string_view filter, HelpFormat format,
- y_absl::string_view program_usage_message) {
- flags_internal::FlagKindFilter filter_cb = [&](y_absl::string_view filename) {
- return filter.empty() || filename.find(filter) != y_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,
- y_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: {
- TString substr = GetFlagsHelpMatchSubstr();
- if (substr.empty()) {
- // show all options
- flags_internal::FlagsHelp(out, substr, GetFlagsHelpFormat(),
- program_usage_message);
- } else {
- auto filter_cb = [&substr](const y_absl::CommandLineFlag& flag) {
- if (y_absl::StrContains(flag.Name(), substr)) return true;
- if (y_absl::StrContains(flag.Filename(), substr)) return true;
- if (y_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 {
-
-Y_ABSL_CONST_INIT y_absl::Mutex help_attributes_guard(y_absl::kConstInit);
-Y_ABSL_CONST_INIT TString* match_substr
- Y_ABSL_GUARDED_BY(help_attributes_guard) = nullptr;
-Y_ABSL_CONST_INIT HelpMode help_mode Y_ABSL_GUARDED_BY(help_attributes_guard) =
- HelpMode::kNone;
-Y_ABSL_CONST_INIT HelpFormat help_format Y_ABSL_GUARDED_BY(help_attributes_guard) =
- HelpFormat::kHumanReadable;
-
-} // namespace
-
-TString GetFlagsHelpMatchSubstr() {
- y_absl::MutexLock l(&help_attributes_guard);
- if (match_substr == nullptr) return "";
- return *match_substr;
-}
-
-void SetFlagsHelpMatchSubstr(y_absl::string_view substr) {
- y_absl::MutexLock l(&help_attributes_guard);
- if (match_substr == nullptr) match_substr = new TString;
- match_substr->assign(substr.data(), substr.size());
-}
-
-HelpMode GetFlagsHelpMode() {
- y_absl::MutexLock l(&help_attributes_guard);
- return help_mode;
-}
-
-void SetFlagsHelpMode(HelpMode mode) {
- y_absl::MutexLock l(&help_attributes_guard);
- help_mode = mode;
-}
-
-HelpFormat GetFlagsHelpFormat() {
- y_absl::MutexLock l(&help_attributes_guard);
- return help_format;
-}
-
-void SetFlagsHelpFormat(HelpFormat format) {
- y_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(y_absl::string_view name, y_absl::string_view value) {
- if (y_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(y_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
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/usage.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/internal/usage.h
deleted file mode 100644
index cc7adf27cb..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_INTERNAL_USAGE_H_
-#define Y_ABSL_FLAGS_INTERNAL_USAGE_H_
-
-#include <iosfwd>
-#include <util/generic/string.h>
-
-#include "y_absl/base/config.h"
-#include "y_absl/flags/commandlineflag.h"
-#include "y_absl/flags/declare.h"
-#include "y_absl/strings/string_view.h"
-
-// --------------------------------------------------------------------
-// Usage reporting interfaces
-
-namespace y_absl {
-Y_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, y_absl::string_view filter,
- HelpFormat format, y_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,
- y_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)
-TString 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(y_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(y_absl::string_view name, y_absl::string_view value);
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_INTERNAL_USAGE_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/marshalling.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/marshalling.cc
deleted file mode 100644
index 51abb779fb..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 "y_absl/flags/marshalling.h"
-
-#include <stddef.h>
-
-#include <cmath>
-#include <limits>
-#include <util/generic/string.h>
-#include <type_traits>
-#include <vector>
-
-#include "y_absl/base/config.h"
-#include "y_absl/base/log_severity.h"
-#include "y_absl/base/macros.h"
-#include "y_absl/strings/ascii.h"
-#include "y_absl/strings/match.h"
-#include "y_absl/strings/numbers.h"
-#include "y_absl/strings/str_cat.h"
-#include "y_absl/strings/str_format.h"
-#include "y_absl/strings/str_join.h"
-#include "y_absl/strings/str_split.h"
-#include "y_absl/strings/string_view.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-
-// --------------------------------------------------------------------
-// AbslParseFlag specializations for boolean type.
-
-bool AbslParseFlag(y_absl::string_view text, bool* dst, TString*) {
- 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 = y_absl::StripAsciiWhitespace(text);
-
- for (size_t i = 0; i < Y_ABSL_ARRAYSIZE(kTrue); ++i) {
- if (y_absl::EqualsIgnoreCase(text, kTrue[i])) {
- *dst = true;
- return true;
- } else if (y_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(y_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(y_absl::string_view text, IntType& dst) {
- text = y_absl::StripAsciiWhitespace(text);
-
- return y_absl::numbers_internal::safe_strtoi_base(text, &dst,
- NumericBase(text));
-}
-
-bool AbslParseFlag(y_absl::string_view text, short* dst, TString*) {
- 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(y_absl::string_view text, unsigned short* dst, TString*) {
- 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(y_absl::string_view text, int* dst, TString*) {
- return ParseFlagImpl(text, *dst);
-}
-
-bool AbslParseFlag(y_absl::string_view text, unsigned int* dst, TString*) {
- return ParseFlagImpl(text, *dst);
-}
-
-bool AbslParseFlag(y_absl::string_view text, long* dst, TString*) {
- return ParseFlagImpl(text, *dst);
-}
-
-bool AbslParseFlag(y_absl::string_view text, unsigned long* dst, TString*) {
- return ParseFlagImpl(text, *dst);
-}
-
-bool AbslParseFlag(y_absl::string_view text, long long* dst, TString*) {
- return ParseFlagImpl(text, *dst);
-}
-
-bool AbslParseFlag(y_absl::string_view text, unsigned long long* dst,
- TString*) {
- return ParseFlagImpl(text, *dst);
-}
-
-// --------------------------------------------------------------------
-// AbslParseFlag for floating point types.
-
-bool AbslParseFlag(y_absl::string_view text, float* dst, TString*) {
- return y_absl::SimpleAtof(text, dst);
-}
-
-bool AbslParseFlag(y_absl::string_view text, double* dst, TString*) {
- return y_absl::SimpleAtod(text, dst);
-}
-
-// --------------------------------------------------------------------
-// AbslParseFlag for strings.
-
-bool AbslParseFlag(y_absl::string_view text, TString* dst, TString*) {
- dst->assign(text.data(), text.size());
- return true;
-}
-
-// --------------------------------------------------------------------
-// AbslParseFlag for vector of strings.
-
-bool AbslParseFlag(y_absl::string_view text, std::vector<TString>* dst,
- TString*) {
- // An empty flag value corresponds to an empty vector, not a vector
- // with a single, empty TString.
- if (text.empty()) {
- dst->clear();
- return true;
- }
- *dst = y_absl::StrSplit(text, ',', y_absl::AllowEmpty());
- return true;
-}
-
-// --------------------------------------------------------------------
-// AbslUnparseFlag specializations for various builtin flag types.
-
-TString Unparse(bool v) { return v ? "true" : "false"; }
-TString Unparse(short v) { return y_absl::StrCat(v); }
-TString Unparse(unsigned short v) { return y_absl::StrCat(v); }
-TString Unparse(int v) { return y_absl::StrCat(v); }
-TString Unparse(unsigned int v) { return y_absl::StrCat(v); }
-TString Unparse(long v) { return y_absl::StrCat(v); }
-TString Unparse(unsigned long v) { return y_absl::StrCat(v); }
-TString Unparse(long long v) { return y_absl::StrCat(v); }
-TString Unparse(unsigned long long v) { return y_absl::StrCat(v); }
-template <typename T>
-TString 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.
- TString digit10_str =
- y_absl::StrFormat("%.*g", std::numeric_limits<T>::digits10, v);
- if (std::isnan(v) || std::isinf(v)) return digit10_str;
-
- T roundtrip_val = 0;
- TString err;
- if (y_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 y_absl::StrFormat("%.*g", std::numeric_limits<T>::max_digits10, v);
-}
-TString Unparse(float v) { return UnparseFloatingPointVal(v); }
-TString Unparse(double v) { return UnparseFloatingPointVal(v); }
-TString AbslUnparseFlag(y_absl::string_view v) { return TString(v); }
-TString AbslUnparseFlag(const std::vector<TString>& v) {
- return y_absl::StrJoin(v, ",");
-}
-
-} // namespace flags_internal
-
-bool AbslParseFlag(y_absl::string_view text, y_absl::LogSeverity* dst,
- TString* err) {
- text = y_absl::StripAsciiWhitespace(text);
- if (text.empty()) {
- *err = "no value provided";
- return false;
- }
- if (text.front() == 'k' || text.front() == 'K') text.remove_prefix(1);
- if (y_absl::EqualsIgnoreCase(text, "info")) {
- *dst = y_absl::LogSeverity::kInfo;
- return true;
- }
- if (y_absl::EqualsIgnoreCase(text, "warning")) {
- *dst = y_absl::LogSeverity::kWarning;
- return true;
- }
- if (y_absl::EqualsIgnoreCase(text, "error")) {
- *dst = y_absl::LogSeverity::kError;
- return true;
- }
- if (y_absl::EqualsIgnoreCase(text, "fatal")) {
- *dst = y_absl::LogSeverity::kFatal;
- return true;
- }
- std::underlying_type<y_absl::LogSeverity>::type numeric_value;
- if (y_absl::ParseFlag(text, &numeric_value, err)) {
- *dst = static_cast<y_absl::LogSeverity>(numeric_value);
- return true;
- }
- *err = "only integers and y_absl::LogSeverity enumerators are accepted";
- return false;
-}
-
-TString AbslUnparseFlag(y_absl::LogSeverity v) {
- if (v == y_absl::NormalizeLogSeverity(v)) return y_absl::LogSeverityName(v);
- return y_absl::UnparseFlag(static_cast<int>(v));
-}
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/marshalling.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/marshalling.h
deleted file mode 100644
index be84b1ea72..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/marshalling.h
+++ /dev/null
@@ -1,356 +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`
-// * `TString`
-// * `std::vector<TString>`
-// * `std::optional<T>`
-// * `y_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:
-//
-// * `y_absl::CivilSecond`
-// * `y_absl::CivilMinute`
-// * `y_absl::CivilHour`
-// * `y_absl::CivilDay`
-// * `y_absl::CivilMonth`
-// * `y_absl::CivilYear`
-//
-// and also provides support for the following absolute time values:
-//
-// * `y_absl::Duration`
-// * `y_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.)
-//
-// -----------------------------------------------------------------------------
-// Optional Flags
-// -----------------------------------------------------------------------------
-//
-// The Abseil flags library supports flags of type `std::optional<T>` where
-// `T` is a type of one of the supported flags. We refer to this flag type as
-// an "optional flag." An optional flag is either "valueless", holding no value
-// of type `T` (indicating that the flag has not been set) or a value of type
-// `T`. The valueless state in C++ code is represented by a value of
-// `std::nullopt` for the optional flag.
-//
-// Using `std::nullopt` as an optional flag's default value allows you to check
-// whether such a flag was ever specified on the command line:
-//
-// if (y_absl::GetFlag(FLAGS_foo).has_value()) {
-// // flag was set on command line
-// } else {
-// // flag was not passed on command line
-// }
-//
-// Using an optional flag in this manner avoids common workarounds for
-// indicating such an unset flag (such as using sentinal values to indicate this
-// state).
-//
-// An optional flag also allows a developer to pass a flag in an "unset"
-// valueless state on the command line, allowing the flag to later be set in
-// binary logic. An optional flag's valueless state is indicated by the special
-// notation of passing the value as an empty string through the syntax `--flag=`
-// or `--flag ""`.
-//
-// $ binary_with_optional --flag_in_unset_state=
-// $ binary_with_optional --flag_in_unset_state ""
-//
-// Note: as a result of the above syntax requirements, an optional flag cannot
-// be set to a `T` of any value which unparses to the empty string.
-//
-// -----------------------------------------------------------------------------
-// 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(y_absl::string_view text,
-// OutputMode* mode,
-// TString* 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`.
-// TString AbslUnparseFlag(OutputMode mode) {
-// switch (mode) {
-// case kPlainText: return "plaintext";
-// case kHtml: return "html";
-// }
-// return y_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 `y_absl::ParseFlag()`. For example, a custom struct `MyFlagType`
-// consisting of a `std::pair<int, TString>` would add an `AbslParseFlag()`
-// overload for its `MyFlagType` like so:
-//
-// Example:
-//
-// namespace my_flag_type {
-//
-// struct MyFlagType {
-// std::pair<int, TString> my_flag_data;
-// };
-//
-// bool AbslParseFlag(y_absl::string_view text, MyFlagType* flag,
-// TString* err);
-//
-// TString AbslUnparseFlag(const MyFlagType&);
-//
-// // Within the implementation, `AbslParseFlag()` will, in turn invoke
-// // `y_absl::ParseFlag()` on its constituent `int` and `TString` types
-// // (which have built-in Abseil flag support).
-//
-// bool AbslParseFlag(y_absl::string_view text, MyFlagType* flag,
-// TString* err) {
-// std::pair<y_absl::string_view, y_absl::string_view> tokens =
-// y_absl::StrSplit(text, ',');
-// if (!y_absl::ParseFlag(tokens.first, &flag->my_flag_data.first, err))
-// return false;
-// if (!y_absl::ParseFlag(tokens.second, &flag->my_flag_data.second, err))
-// return false;
-// return true;
-// }
-//
-// // Similarly, for unparsing, we can simply invoke `y_absl::UnparseFlag()` on
-// // the constituent types.
-// TString AbslUnparseFlag(const MyFlagType& flag) {
-// return y_absl::StrCat(y_absl::UnparseFlag(flag.my_flag_data.first),
-// ",",
-// y_absl::UnparseFlag(flag.my_flag_data.second));
-// }
-#ifndef Y_ABSL_FLAGS_MARSHALLING_H_
-#define Y_ABSL_FLAGS_MARSHALLING_H_
-
-#include "y_absl/base/config.h"
-
-#if defined(Y_ABSL_HAVE_STD_OPTIONAL) && !defined(Y_ABSL_USES_STD_OPTIONAL)
-#include <optional>
-#endif
-#include <util/generic/string.h>
-#include <vector>
-
-#include "y_absl/strings/string_view.h"
-#include "y_absl/types/optional.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-
-// Forward declaration to be used inside composable flag parse/unparse
-// implementations
-template <typename T>
-inline bool ParseFlag(y_absl::string_view input, T* dst, TString* error);
-template <typename T>
-inline TString UnparseFlag(const T& v);
-
-namespace flags_internal {
-
-// Overloads of `AbslParseFlag()` and `AbslUnparseFlag()` for fundamental types.
-bool AbslParseFlag(y_absl::string_view, bool*, TString*);
-bool AbslParseFlag(y_absl::string_view, short*, TString*); // NOLINT
-bool AbslParseFlag(y_absl::string_view, unsigned short*, TString*); // NOLINT
-bool AbslParseFlag(y_absl::string_view, int*, TString*); // NOLINT
-bool AbslParseFlag(y_absl::string_view, unsigned int*, TString*); // NOLINT
-bool AbslParseFlag(y_absl::string_view, long*, TString*); // NOLINT
-bool AbslParseFlag(y_absl::string_view, unsigned long*, TString*); // NOLINT
-bool AbslParseFlag(y_absl::string_view, long long*, TString*); // NOLINT
-bool AbslParseFlag(y_absl::string_view, unsigned long long*, // NOLINT
- TString*);
-bool AbslParseFlag(y_absl::string_view, float*, TString*);
-bool AbslParseFlag(y_absl::string_view, double*, TString*);
-bool AbslParseFlag(y_absl::string_view, TString*, TString*);
-bool AbslParseFlag(y_absl::string_view, std::vector<TString>*, TString*);
-
-template <typename T>
-bool AbslParseFlag(y_absl::string_view text, y_absl::optional<T>* f,
- TString* err) {
- if (text.empty()) {
- *f = y_absl::nullopt;
- return true;
- }
- T value;
- if (!y_absl::ParseFlag(text, &value, err)) return false;
-
- *f = std::move(value);
- return true;
-}
-
-#if defined(Y_ABSL_HAVE_STD_OPTIONAL) && !defined(Y_ABSL_USES_STD_OPTIONAL)
-template <typename T>
-bool AbslParseFlag(y_absl::string_view text, std::optional<T>* f,
- TString* err) {
- if (text.empty()) {
- *f = std::nullopt;
- return true;
- }
- T value;
- if (!y_absl::ParseFlag(text, &value, err)) return false;
-
- *f = std::move(value);
- return true;
-}
-#endif
-
-template <typename T>
-bool InvokeParseFlag(y_absl::string_view input, T* dst, TString* err) {
- // Comment on next line provides a good compiler error message if T
- // does not have AbslParseFlag(y_absl::string_view, T*, TString*).
- 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).
-TString AbslUnparseFlag(y_absl::string_view v);
-TString AbslUnparseFlag(const std::vector<TString>&);
-
-template <typename T>
-TString AbslUnparseFlag(const y_absl::optional<T>& f) {
- return f.has_value() ? y_absl::UnparseFlag(*f) : "";
-}
-
-#if defined(Y_ABSL_HAVE_STD_OPTIONAL) && !defined(Y_ABSL_USES_STD_OPTIONAL)
-template <typename T>
-TString AbslUnparseFlag(const std::optional<T>& f) {
- return f.has_value() ? y_absl::UnparseFlag(*f) : "";
-}
-#endif
-
-template <typename T>
-TString 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.
-TString Unparse(bool v);
-TString Unparse(short v); // NOLINT
-TString Unparse(unsigned short v); // NOLINT
-TString Unparse(int v); // NOLINT
-TString Unparse(unsigned int v); // NOLINT
-TString Unparse(long v); // NOLINT
-TString Unparse(unsigned long v); // NOLINT
-TString Unparse(long long v); // NOLINT
-TString Unparse(unsigned long long v); // NOLINT
-TString Unparse(float v);
-TString 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
-// `y_absl::ParseFlag()` on those consituent string values. (See above.)
-template <typename T>
-inline bool ParseFlag(y_absl::string_view input, T* dst, TString* 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
-// `y_absl::UnparseFlag()` on those constituent types. (See above.)
-template <typename T>
-inline TString UnparseFlag(const T& v) {
- return flags_internal::Unparse(v);
-}
-
-// Overloads for `y_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(y_absl::string_view, y_absl::LogSeverity*, TString*);
-TString AbslUnparseFlag(y_absl::LogSeverity);
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_MARSHALLING_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/parse.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/parse.cc
deleted file mode 100644
index 07ad9f5779..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 "y_absl/flags/parse.h"
-
-#include <stdlib.h>
-
-#include <algorithm>
-#include <fstream>
-#include <iostream>
-#include <iterator>
-#include <util/generic/string.h>
-#include <tuple>
-#include <utility>
-#include <vector>
-
-#ifdef _WIN32
-#include <windows.h>
-#endif
-
-#include "y_absl/base/attributes.h"
-#include "y_absl/base/config.h"
-#include "y_absl/base/const_init.h"
-#include "y_absl/base/thread_annotations.h"
-#include "y_absl/flags/commandlineflag.h"
-#include "y_absl/flags/config.h"
-#include "y_absl/flags/flag.h"
-#include "y_absl/flags/internal/commandlineflag.h"
-#include "y_absl/flags/internal/flag.h"
-#include "y_absl/flags/internal/parse.h"
-#include "y_absl/flags/internal/private_handle_accessor.h"
-#include "y_absl/flags/internal/program_name.h"
-#include "y_absl/flags/internal/usage.h"
-#include "y_absl/flags/reflection.h"
-#include "y_absl/flags/usage.h"
-#include "y_absl/flags/usage_config.h"
-#include "y_absl/strings/ascii.h"
-#include "y_absl/strings/str_cat.h"
-#include "y_absl/strings/string_view.h"
-#include "y_absl/strings/strip.h"
-#include "y_absl/synchronization/mutex.h"
-
-// --------------------------------------------------------------------
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-namespace {
-
-Y_ABSL_CONST_INIT y_absl::Mutex processing_checks_guard(y_absl::kConstInit);
-
-Y_ABSL_CONST_INIT bool flagfile_needs_processing
- Y_ABSL_GUARDED_BY(processing_checks_guard) = false;
-Y_ABSL_CONST_INIT bool fromenv_needs_processing
- Y_ABSL_GUARDED_BY(processing_checks_guard) = false;
-Y_ABSL_CONST_INIT bool tryfromenv_needs_processing
- Y_ABSL_GUARDED_BY(processing_checks_guard) = false;
-
-Y_ABSL_CONST_INIT y_absl::Mutex specified_flags_guard(y_absl::kConstInit);
-Y_ABSL_CONST_INIT std::vector<const CommandLineFlag*>* specified_flags
- Y_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, y_absl::string_view b) const {
- return a->Name() < b;
- }
- bool operator()(y_absl::string_view a, const CommandLineFlag* b) const {
- return a < b->Name();
- }
-};
-
-} // namespace
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-Y_ABSL_FLAG(std::vector<TString>, flagfile, {},
- "comma-separated list of files to load flags from")
- .OnUpdate([]() {
- if (y_absl::GetFlag(FLAGS_flagfile).empty()) return;
-
- y_absl::MutexLock l(&y_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 (y_absl::flags_internal::flagfile_needs_processing) {
- Y_ABSL_INTERNAL_LOG(WARNING, "flagfile set twice before it is handled");
- }
-
- y_absl::flags_internal::flagfile_needs_processing = true;
- });
-Y_ABSL_FLAG(std::vector<TString>, fromenv, {},
- "comma-separated list of flags to set from the environment"
- " [use 'export FLAGS_flag1=value']")
- .OnUpdate([]() {
- if (y_absl::GetFlag(FLAGS_fromenv).empty()) return;
-
- y_absl::MutexLock l(&y_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 (y_absl::flags_internal::fromenv_needs_processing) {
- Y_ABSL_INTERNAL_LOG(WARNING, "fromenv set twice before it is handled.");
- }
-
- y_absl::flags_internal::fromenv_needs_processing = true;
- });
-Y_ABSL_FLAG(std::vector<TString>, tryfromenv, {},
- "comma-separated list of flags to try to set from the environment if "
- "present")
- .OnUpdate([]() {
- if (y_absl::GetFlag(FLAGS_tryfromenv).empty()) return;
-
- y_absl::MutexLock l(&y_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 (y_absl::flags_internal::tryfromenv_needs_processing) {
- Y_ABSL_INTERNAL_LOG(WARNING,
- "tryfromenv set twice before it is handled.");
- }
-
- y_absl::flags_internal::tryfromenv_needs_processing = true;
- });
-
-Y_ABSL_FLAG(std::vector<TString>, 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 y_absl {
-Y_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<TString>& args)
- : args_(args), next_arg_(0) {}
-
- // Returns success status: true if parsing successful, false otherwise.
- bool ReadFromFlagfile(const TString& flag_file_name);
-
- int Size() const { return args_.size() - next_arg_; }
- int FrontIndex() const { return next_arg_; }
- y_absl::string_view Front() const { return args_[next_arg_]; }
- void PopFront() { next_arg_++; }
-
- private:
- std::vector<TString> args_;
- int next_arg_;
-};
-
-bool ArgsList::ReadFromFlagfile(const TString& flag_file_name) {
- std::ifstream flag_file(flag_file_name);
-
- if (!flag_file) {
- flags_internal::ReportUsageError(
- y_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)) {
- y_absl::string_view stripped = y_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(TString(stripped));
- continue;
- }
-
- flags_internal::ReportUsageError(
- y_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, TString& 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 = TString(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<y_absl::string_view, y_absl::string_view, bool> SplitNameAndValue(
- y_absl::string_view arg) {
- // Allow -foo and --foo
- y_absl::ConsumePrefix(&arg, "-");
-
- if (arg.empty()) {
- return std::make_tuple("", "", false);
- }
-
- auto equal_sign_pos = arg.find("=");
-
- y_absl::string_view flag_name = arg.substr(0, equal_sign_pos);
-
- y_absl::string_view value;
- bool is_empty_value = false;
-
- if (equal_sign_pos != y_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(y_absl::string_view flag_name) {
- CommandLineFlag* flag = y_absl::FindCommandLineFlag(flag_name);
- bool is_negative = false;
-
- if (!flag && y_absl::ConsumePrefix(&flag_name, "no")) {
- flag = y_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 Y_ABSL_FLAGS_INTERNAL_IGNORE_TYPE(T, _) \
- if (flag.IsOfType<T>()) return;
-
- Y_ABSL_FLAGS_INTERNAL_SUPPORTED_TYPES(Y_ABSL_FLAGS_INTERNAL_IGNORE_TYPE)
-#undef Y_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<TString>& 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<TString>& flag_names,
- std::vector<ArgsList>& input_args,
- bool fail_on_absent_in_env) {
- bool success = true;
- std::vector<TString> 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(
- y_absl::StrCat("Infinite recursion on flag ", flag_name), true);
-
- success = false;
- continue;
- }
-
- const TString envname = y_absl::StrCat("FLAGS_", flag_name);
- TString envval;
- if (!GetEnvVar(envname.c_str(), envval)) {
- if (fail_on_absent_in_env) {
- flags_internal::ReportUsageError(
- y_absl::StrCat(envname, " not found in environment"), true);
-
- success = false;
- }
-
- continue;
- }
-
- args.push_back(y_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<TString>& flagfile_value) {
- bool success = true;
-
- y_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 = y_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 = y_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 = y_absl::GetFlag(FLAGS_tryfromenv);
-
- success &= ReadFlagsFromEnv(flags_list, input_args, false);
-
- flags_internal::tryfromenv_needs_processing = false;
- }
-
- return success;
-}
-
-// --------------------------------------------------------------------
-
-void ResetGeneratorFlags(const std::vector<TString>& 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()) {
- y_absl::SetFlag(&FLAGS_flagfile, flagfile_value);
- y_absl::MutexLock l(&flags_internal::processing_checks_guard);
- flags_internal::flagfile_needs_processing = false;
- }
-
- // fromenv/tryfromenv are set to <undefined> value.
- if (!y_absl::GetFlag(FLAGS_fromenv).empty()) {
- y_absl::SetFlag(&FLAGS_fromenv, {});
- }
- if (!y_absl::GetFlag(FLAGS_tryfromenv).empty()) {
- y_absl::SetFlag(&FLAGS_tryfromenv, {});
- }
-
- y_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, y_absl::string_view> DeduceFlagValue(const CommandLineFlag& flag,
- y_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(
- y_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(
- y_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(
- y_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(
- y_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<TString>()) {
- 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
- Y_ABSL_INTERNAL_LOG(
- WARNING,
- y_absl::StrCat("Did you really mean to set flag '", flag.Name(),
- "' to the value '", value, "'?"));
- }
- }
- }
-
- return std::make_tuple(true, value);
-}
-
-// --------------------------------------------------------------------
-
-bool CanIgnoreUndefinedFlag(y_absl::string_view flag_name) {
- auto undefok = y_absl::GetFlag(FLAGS_undefok);
- if (std::find(undefok.begin(), undefok.end(), flag_name) != undefok.end()) {
- return true;
- }
-
- if (y_absl::ConsumePrefix(&flag_name, "no") &&
- std::find(undefok.begin(), undefok.end(), flag_name) != undefok.end()) {
- return true;
- }
-
- return false;
-}
-
-} // namespace
-
-// --------------------------------------------------------------------
-
-bool WasPresentOnCommandLine(y_absl::string_view flag_name) {
- y_absl::MutexLock l(&specified_flags_guard);
- Y_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) {
- Y_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<TString> 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, TString>> 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]);
-
- y_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.
- y_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 (!y_absl::ConsumePrefix(&arg, "-") || arg.empty()) {
- Y_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.
- y_absl::string_view flag_name;
- y_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()) {
- Y_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,
- TString(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.
- TString 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(
- y_absl::StrCat("Unknown command line flag '", flag_name.second, "'"),
- true);
-
- success = false;
- }
-
-#if Y_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);
-}
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/parse.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/parse.h
deleted file mode 100644
index c8ee5b21d3..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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:
-// `y_absl::ParseCommandLine()`.
-
-#ifndef Y_ABSL_FLAGS_PARSE_H_
-#define Y_ABSL_FLAGS_PARSE_H_
-
-#include <vector>
-
-#include "y_absl/base/config.h"
-#include "y_absl/flags/internal/parse.h"
-
-namespace y_absl {
-Y_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[]);
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_PARSE_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/reflection.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/reflection.cc
deleted file mode 100644
index 8776612249..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/reflection.cc
+++ /dev/null
@@ -1,354 +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 "y_absl/flags/reflection.h"
-
-#include <assert.h>
-
-#include <atomic>
-#include <util/generic/string.h>
-
-#include "y_absl/base/config.h"
-#include "y_absl/base/thread_annotations.h"
-#include "y_absl/container/flat_hash_map.h"
-#include "y_absl/flags/commandlineflag.h"
-#include "y_absl/flags/internal/private_handle_accessor.h"
-#include "y_absl/flags/internal/registry.h"
-#include "y_absl/flags/usage_config.h"
-#include "y_absl/strings/str_cat.h"
-#include "y_absl/strings/string_view.h"
-#include "y_absl/synchronization/mutex.h"
-
-namespace y_absl {
-Y_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, const char* filename);
-
- void Lock() Y_ABSL_EXCLUSIVE_LOCK_FUNCTION(lock_) { lock_.Lock(); }
- void Unlock() Y_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(y_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 = y_absl::flat_hash_map<y_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};
-
- y_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(y_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, const char* filename) {
- if (filename != nullptr &&
- flag.Filename() != GetUsageConfig().normalize_filename(filename)) {
- flags_internal::ReportUsageError(
- y_absl::StrCat(
- "Inconsistency between flag object and registration for flag '",
- flag.Name(),
- "', likely due to duplicate flags or an ODR violation. Relevant "
- "files: ",
- flag.Filename(), " and ", filename),
- true);
- std::exit(1);
- }
-
- 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(
- y_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(
- y_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(
- y_absl::StrCat("Flag '", flag.Name(),
- "' was defined more than once (in files '",
- old_flag.Filename(), "' and '", flag.Filename(), "')."),
- true);
- } else {
- flags_internal::ReportUsageError(
- y_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, const char* filename) {
- FlagRegistry::GlobalRegistry().RegisterFlag(flag, filename);
- 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);
- }
- std::sort(std::begin(registry.flat_flags_), std::end(registry.flat_flags_),
- [](const CommandLineFlag* lhs, const CommandLineFlag* rhs) {
- return lhs->Name() < rhs->Name();
- });
- 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:
- y_absl::string_view Name() const override { return name_; }
- TString Filename() const override {
- OnAccess();
- return "RETIRED";
- }
- FlagFastTypeId TypeId() const override { return type_id_; }
- TString Help() const override {
- OnAccess();
- return "";
- }
- bool IsRetired() const override { return true; }
- bool IsSpecifiedOnCommandLine() const override {
- OnAccess();
- return false;
- }
- TString DefaultValue() const override {
- OnAccess();
- return "";
- }
- TString CurrentValue() const override {
- OnAccess();
- return "";
- }
-
- // Any input is valid
- bool ValidateInputValue(y_absl::string_view) const override {
- OnAccess();
- return true;
- }
-
- std::unique_ptr<flags_internal::FlagStateInterface> SaveState() override {
- return nullptr;
- }
-
- bool ParseFrom(y_absl::string_view, flags_internal::FlagSettingMode,
- flags_internal::ValueSource, TString&) override {
- OnAccess();
- return false;
- }
-
- void CheckDefaultValueParsingRoundtrip() const override { OnAccess(); }
-
- void Read(void*) const override { OnAccess(); }
-
- void OnAccess() const {
- flags_internal::ReportUsageError(
- y_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, nullptr);
-}
-
-// --------------------------------------------------------------------
-
-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(y_absl::string_view name) {
- if (name.empty()) return nullptr;
- flags_internal::FlagRegistry& registry =
- flags_internal::FlagRegistry::GlobalRegistry();
- return registry.FindFlag(name);
-}
-
-// --------------------------------------------------------------------
-
-y_absl::flat_hash_map<y_absl::string_view, y_absl::CommandLineFlag*> GetAllFlags() {
- y_absl::flat_hash_map<y_absl::string_view, y_absl::CommandLineFlag*> res;
- flags_internal::ForEachFlag([&](CommandLineFlag& flag) {
- if (!flag.IsRetired()) res.insert({flag.Name(), &flag});
- });
- return res;
-}
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/reflection.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/reflection.h
deleted file mode 100644
index d2456590da..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_REFLECTION_H_
-#define Y_ABSL_FLAGS_REFLECTION_H_
-
-#include <util/generic/string.h>
-
-#include "y_absl/base/config.h"
-#include "y_absl/container/flat_hash_map.h"
-#include "y_absl/flags/commandlineflag.h"
-#include "y_absl/flags/internal/commandlineflag.h"
-
-namespace y_absl {
-Y_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.
-y_absl::CommandLineFlag* FindCommandLineFlag(y_absl::string_view name);
-
-// Returns current state of the Flags registry in a form of mapping from flag
-// name to a flag reflection handle.
-y_absl::flat_hash_map<y_absl::string_view, y_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() {
-// y_absl::FlagSaver fs;
-// ...
-// y_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_;
-};
-
-//-----------------------------------------------------------------------------
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_REFLECTION_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage.cc
deleted file mode 100644
index 495bd01fa3..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 "y_absl/flags/usage.h"
-
-#include <stdlib.h>
-
-#include <util/generic/string.h>
-
-#include "y_absl/base/attributes.h"
-#include "y_absl/base/config.h"
-#include "y_absl/base/const_init.h"
-#include "y_absl/base/thread_annotations.h"
-#include "y_absl/flags/internal/usage.h"
-#include "y_absl/strings/string_view.h"
-#include "y_absl/synchronization/mutex.h"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-namespace {
-Y_ABSL_CONST_INIT y_absl::Mutex usage_message_guard(y_absl::kConstInit);
-Y_ABSL_CONST_INIT TString* program_usage_message
- Y_ABSL_GUARDED_BY(usage_message_guard) = nullptr;
-} // namespace
-} // namespace flags_internal
-
-// --------------------------------------------------------------------
-// Sets the "usage" message to be used by help reporting routines.
-void SetProgramUsageMessage(y_absl::string_view new_usage_message) {
- y_absl::MutexLock l(&flags_internal::usage_message_guard);
-
- if (flags_internal::program_usage_message != nullptr) {
- Y_ABSL_INTERNAL_LOG(FATAL, "SetProgramUsageMessage() called twice.");
- std::exit(1);
- }
-
- flags_internal::program_usage_message = new TString(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.
-y_absl::string_view ProgramUsageMessage() {
- y_absl::MutexLock l(&flags_internal::usage_message_guard);
-
- return flags_internal::program_usage_message != nullptr
- ? y_absl::string_view(*flags_internal::program_usage_message)
- : "Warning: SetProgramUsageMessage() never called";
-}
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage.h
deleted file mode 100644
index 8ce0f1195f..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_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 Y_ABSL_FLAGS_USAGE_H_
-#define Y_ABSL_FLAGS_USAGE_H_
-
-#include "y_absl/base/config.h"
-#include "y_absl/strings/string_view.h"
-
-// --------------------------------------------------------------------
-// Usage reporting interfaces
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-
-// Sets the "usage" message to be used by help reporting routines.
-// For example:
-// y_absl::SetProgramUsageMessage(
-// y_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(y_absl::string_view new_usage_message);
-
-// Returns the usage message set by SetProgramUsageMessage().
-y_absl::string_view ProgramUsageMessage();
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
-
-#endif // Y_ABSL_FLAGS_USAGE_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage_config.cc b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage_config.cc
deleted file mode 100644
index c6cf8296d6..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage_config.cc
+++ /dev/null
@@ -1,165 +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 "y_absl/flags/usage_config.h"
-
-#include <functional>
-#include <iostream>
-#include <util/generic/string.h>
-
-#include "y_absl/base/attributes.h"
-#include "y_absl/base/config.h"
-#include "y_absl/base/const_init.h"
-#include "y_absl/base/thread_annotations.h"
-#include "y_absl/flags/internal/path_util.h"
-#include "y_absl/flags/internal/program_name.h"
-#include "y_absl/strings/match.h"
-#include "y_absl/strings/string_view.h"
-#include "y_absl/strings/strip.h"
-#include "y_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.
-Y_ABSL_ATTRIBUTE_WEAK void Y_ABSL_INTERNAL_C_SYMBOL(
- AbslInternalReportFatalUsageError)(y_absl::string_view) {}
-
-} // extern "C"
-
-namespace y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-namespace flags_internal {
-
-namespace {
-
-// --------------------------------------------------------------------
-// Returns true if flags defined in the filename should be reported with
-// -helpshort flag.
-
-bool ContainsHelpshortFlags(y_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();
- y_absl::string_view program_name_ref = program_name;
-#if defined(_WIN32)
- y_absl::ConsumeSuffix(&program_name_ref, ".exe");
-#endif
- if (!y_absl::ConsumePrefix(&suffix, program_name_ref))
- return false;
- return y_absl::StartsWith(suffix, ".") || y_absl::StartsWith(suffix, "-main.") ||
- y_absl::StartsWith(suffix, "_main.");
-}
-
-// --------------------------------------------------------------------
-// Returns true if flags defined in the filename should be reported with
-// -helppackage flag.
-
-bool ContainsHelppackageFlags(y_absl::string_view filename) {
- // TODO(rogeeff): implement properly when registry is available.
- return ContainsHelpshortFlags(filename);
-}
-
-// --------------------------------------------------------------------
-// Generates program version information into supplied output.
-
-TString VersionString() {
- TString 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.
-
-TString NormalizeFilename(y_absl::string_view filename) {
- // Skip any leading slashes
- auto pos = filename.find_first_not_of("\\/");
- if (pos == y_absl::string_view::npos) return "";
-
- filename.remove_prefix(pos);
- return TString(filename);
-}
-
-// --------------------------------------------------------------------
-
-Y_ABSL_CONST_INIT y_absl::Mutex custom_usage_config_guard(y_absl::kConstInit);
-Y_ABSL_CONST_INIT FlagsUsageConfig* custom_usage_config
- Y_ABSL_GUARDED_BY(custom_usage_config_guard) = nullptr;
-
-} // namespace
-
-FlagsUsageConfig GetUsageConfig() {
- y_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(y_absl::string_view msg, bool is_fatal) {
- std::cerr << "ERROR: " << msg << std::endl;
-
- if (is_fatal) {
- Y_ABSL_INTERNAL_C_SYMBOL(AbslInternalReportFatalUsageError)(msg);
- }
-}
-
-} // namespace flags_internal
-
-void SetFlagsUsageConfig(FlagsUsageConfig usage_config) {
- y_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);
-}
-
-Y_ABSL_NAMESPACE_END
-} // namespace y_absl
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage_config.h b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage_config.h
deleted file mode 100644
index 99b862f5d6..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/usage_config.h
+++ /dev/null
@@ -1,135 +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 Y_ABSL_FLAGS_USAGE_CONFIG_H_
-#define Y_ABSL_FLAGS_USAGE_CONFIG_H_
-
-#include <functional>
-#include <util/generic/string.h>
-
-#include "y_absl/base/config.h"
-#include "y_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 y_absl {
-Y_ABSL_NAMESPACE_BEGIN
-
-namespace flags_internal {
-using FlagKindFilter = std::function<bool (y_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<TString()> 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<TString(y_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(y_absl::string_view msg, bool is_fatal);
-
-} // namespace flags_internal
-Y_ABSL_NAMESPACE_END
-} // namespace y_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 Y_ABSL_INTERNAL_C_SYMBOL(AbslInternalReportFatalUsageError)(
- y_absl::string_view);
-
-} // extern "C"
-
-#endif // Y_ABSL_FLAGS_USAGE_CONFIG_H_
diff --git a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/ya.make b/contrib/restricted/abseil-cpp-tstring/y_absl/flags/ya.make
deleted file mode 100644
index f8e0a201f7..0000000000
--- a/contrib/restricted/abseil-cpp-tstring/y_absl/flags/ya.make
+++ /dev/null
@@ -1,44 +0,0 @@
-# Generated by devtools/yamaker.
-
-LIBRARY()
-
-LICENSE(Apache-2.0)
-
-LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-
-PEERDIR(
- contrib/restricted/abseil-cpp-tstring/y_absl/base
- contrib/restricted/abseil-cpp-tstring/y_absl/container
- contrib/restricted/abseil-cpp-tstring/y_absl/debugging
- contrib/restricted/abseil-cpp-tstring/y_absl/hash
- contrib/restricted/abseil-cpp-tstring/y_absl/memory
- contrib/restricted/abseil-cpp-tstring/y_absl/numeric
- contrib/restricted/abseil-cpp-tstring/y_absl/profiling
- contrib/restricted/abseil-cpp-tstring/y_absl/strings
- contrib/restricted/abseil-cpp-tstring/y_absl/synchronization
- contrib/restricted/abseil-cpp-tstring/y_absl/time
- contrib/restricted/abseil-cpp-tstring/y_absl/types
-)
-
-ADDINCL(
- GLOBAL contrib/restricted/abseil-cpp-tstring
-)
-
-NO_COMPILER_WARNINGS()
-
-SRCS(
- commandlineflag.cc
- flag.cc
- internal/commandlineflag.cc
- internal/flag.cc
- internal/private_handle_accessor.cc
- internal/program_name.cc
- internal/usage.cc
- marshalling.cc
- parse.cc
- reflection.cc
- usage.cc
- usage_config.cc
-)
-
-END()