Export of internal Abseil changes
-- 167cd2647144583746311129b0cc98a89a9897e1 by Andy Soffer <asoffer@google.com>: Internal Changes PiperOrigin-RevId: 268000987 -- ab44fea7dfdaf763c69609a08ddfac22480ce520 by Derek Mauro <dmauro@google.com>: Fix flags Cmake tests on Windows PiperOrigin-RevId: 267859442 -- d7ec9f7611370b01bc9a5aed7e18460df2a15429 by Abseil Team <absl-team@google.com>: Fix undefined behavior in symbolize_elf.inc PiperOrigin-RevId: 267684904 -- e7c5f8e472a91ed99bdf4876942f2bda5751aa6c by Abseil Team <absl-team@google.com>: Turn off ABSL_HAS_ALARM on Fuchsia. PiperOrigin-RevId: 267666090 -- b7d25d5c71a49e697a8bf6440ed30f2e3f036420 by Chris Kennelly <ckennelly@google.com>: Mark once initialization function as no inline. We expect this code to run infrequently. PiperOrigin-RevId: 267649713 -- dc2a5e5f1e39a03fff837d34a319033fde55d9ba by Derek Mauro <dmauro@google.com>: Fix the MSVC CMake random build PiperOrigin-RevId: 267624074 -- ba2751b67fa17d1b6c53e5ba79f81a5371e4a03a by Abseil Team <absl-team@google.com>: Move "internal/flag.*" files to the "internal" build target. PiperOrigin-RevId: 267588996 -- 05b985a33eec4f8acff1809ad9218a1e22220f34 by Abseil Team <absl-team@google.com>: Move "internal/flag.*" files to the "internal" build target. PiperOrigin-RevId: 267580412 GitOrigin-RevId: 167cd2647144583746311129b0cc98a89a9897e1 Change-Id: Ibd334f46a5671c7c1d3fcf5354029e2fbb7ba91f
This commit is contained in:
parent
325fd7b042
commit
97c1664b4b
14 changed files with 154 additions and 62 deletions
|
@ -142,6 +142,7 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Callable, typename... Args>
|
template <typename Callable, typename... Args>
|
||||||
|
ABSL_ATTRIBUTE_NOINLINE
|
||||||
void CallOnceImpl(std::atomic<uint32_t>* control,
|
void CallOnceImpl(std::atomic<uint32_t>* control,
|
||||||
base_internal::SchedulingMode scheduling_mode, Callable&& fn,
|
base_internal::SchedulingMode scheduling_mode, Callable&& fn,
|
||||||
Args&&... args) {
|
Args&&... args) {
|
||||||
|
|
|
@ -336,6 +336,8 @@
|
||||||
// feature tests for Microsoft's library
|
// feature tests for Microsoft's library
|
||||||
#elif defined(__EMSCRIPTEN__)
|
#elif defined(__EMSCRIPTEN__)
|
||||||
// emscripten doesn't support signals
|
// emscripten doesn't support signals
|
||||||
|
#elif defined(__Fuchsia__)
|
||||||
|
// Signals don't exist on fuchsia.
|
||||||
#elif defined(__native_client__)
|
#elif defined(__native_client__)
|
||||||
#else
|
#else
|
||||||
// other standard libraries
|
// other standard libraries
|
||||||
|
|
|
@ -624,6 +624,13 @@ static bool InSection(const void *address, const ElfW(Shdr) * section) {
|
||||||
return start <= address && address < (start + size);
|
return start <= address && address < (start + size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *ComputeOffset(const char *base, ptrdiff_t offset) {
|
||||||
|
// Note: cast to uintptr_t to avoid undefined behavior when base evaluates to
|
||||||
|
// zero and offset is non-zero.
|
||||||
|
return reinterpret_cast<const char *>(
|
||||||
|
reinterpret_cast<uintptr_t>(base) + offset);
|
||||||
|
}
|
||||||
|
|
||||||
// Read a symbol table and look for the symbol containing the
|
// Read a symbol table and look for the symbol containing the
|
||||||
// pc. Iterate over symbols in a symbol table and look for the symbol
|
// pc. Iterate over symbols in a symbol table and look for the symbol
|
||||||
// containing "pc". If the symbol is found, and its name fits in
|
// containing "pc". If the symbol is found, and its name fits in
|
||||||
|
@ -676,7 +683,8 @@ static ABSL_ATTRIBUTE_NOINLINE FindSymbolResult FindSymbol(
|
||||||
// We keep the original address for opd redirection below.
|
// We keep the original address for opd redirection below.
|
||||||
const char *const original_start_address =
|
const char *const original_start_address =
|
||||||
reinterpret_cast<const char *>(symbol.st_value);
|
reinterpret_cast<const char *>(symbol.st_value);
|
||||||
const char *start_address = original_start_address + relocation;
|
const char *start_address =
|
||||||
|
ComputeOffset(original_start_address, relocation);
|
||||||
|
|
||||||
if (deref_function_descriptor_pointer &&
|
if (deref_function_descriptor_pointer &&
|
||||||
InSection(original_start_address, opd)) {
|
InSection(original_start_address, opd)) {
|
||||||
|
@ -688,8 +696,7 @@ static ABSL_ATTRIBUTE_NOINLINE FindSymbolResult FindSymbol(
|
||||||
|
|
||||||
// If pc is inside the .opd section, it points to a function descriptor.
|
// If pc is inside the .opd section, it points to a function descriptor.
|
||||||
const size_t size = pc_in_opd ? kFunctionDescriptorSize : symbol.st_size;
|
const size_t size = pc_in_opd ? kFunctionDescriptorSize : symbol.st_size;
|
||||||
const void *const end_address =
|
const void *const end_address = ComputeOffset(start_address, size);
|
||||||
reinterpret_cast<const char *>(start_address) + size;
|
|
||||||
if (symbol.st_value != 0 && // Skip null value symbols.
|
if (symbol.st_value != 0 && // Skip null value symbols.
|
||||||
symbol.st_shndx != 0 && // Skip undefined symbols.
|
symbol.st_shndx != 0 && // Skip undefined symbols.
|
||||||
#ifdef STT_TLS
|
#ifdef STT_TLS
|
||||||
|
|
|
@ -231,6 +231,7 @@ cc_test(
|
||||||
copts = ABSL_TEST_COPTS,
|
copts = ABSL_TEST_COPTS,
|
||||||
linkopts = ABSL_DEFAULT_LINKOPTS,
|
linkopts = ABSL_DEFAULT_LINKOPTS,
|
||||||
deps = [
|
deps = [
|
||||||
|
":config",
|
||||||
":flag",
|
":flag",
|
||||||
":handle",
|
":handle",
|
||||||
":registry",
|
":registry",
|
||||||
|
@ -264,6 +265,7 @@ cc_test(
|
||||||
copts = ABSL_TEST_COPTS,
|
copts = ABSL_TEST_COPTS,
|
||||||
linkopts = ABSL_DEFAULT_LINKOPTS,
|
linkopts = ABSL_DEFAULT_LINKOPTS,
|
||||||
deps = [
|
deps = [
|
||||||
|
":config",
|
||||||
":flag",
|
":flag",
|
||||||
"//absl/strings",
|
"//absl/strings",
|
||||||
"@com_google_googletest//:gtest_main",
|
"@com_google_googletest//:gtest_main",
|
||||||
|
|
|
@ -213,6 +213,7 @@ absl_cc_test(
|
||||||
${ABSL_TEST_COPTS}
|
${ABSL_TEST_COPTS}
|
||||||
DEPS
|
DEPS
|
||||||
absl::flags
|
absl::flags
|
||||||
|
absl::flags_config
|
||||||
absl::flags_handle
|
absl::flags_handle
|
||||||
absl::flags_registry
|
absl::flags_registry
|
||||||
absl::memory
|
absl::memory
|
||||||
|
@ -242,6 +243,7 @@ absl_cc_test(
|
||||||
${ABSL_TEST_COPTS}
|
${ABSL_TEST_COPTS}
|
||||||
DEPS
|
DEPS
|
||||||
absl::flags
|
absl::flags
|
||||||
|
absl::flags_config
|
||||||
absl::strings
|
absl::strings
|
||||||
gtest_main
|
gtest_main
|
||||||
)
|
)
|
||||||
|
|
|
@ -15,7 +15,11 @@
|
||||||
|
|
||||||
#include "absl/flags/flag.h"
|
#include "absl/flags/flag.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
#include "absl/flags/usage_config.h"
|
||||||
#include "absl/strings/match.h"
|
#include "absl/strings/match.h"
|
||||||
#include "absl/strings/numbers.h"
|
#include "absl/strings/numbers.h"
|
||||||
#include "absl/strings/str_cat.h"
|
#include "absl/strings/str_cat.h"
|
||||||
|
@ -63,7 +67,27 @@ struct UDT {
|
||||||
bool AbslParseFlag(absl::string_view, UDT*, std::string*) { return true; }
|
bool AbslParseFlag(absl::string_view, UDT*, std::string*) { return true; }
|
||||||
std::string AbslUnparseFlag(const UDT&) { return ""; }
|
std::string AbslUnparseFlag(const UDT&) { return ""; }
|
||||||
|
|
||||||
TEST(FlagTest, TestConstruction) {
|
class FlagTest : public testing::Test {
|
||||||
|
protected:
|
||||||
|
static void SetUpTestSuite() {
|
||||||
|
// Install a function to normalize filenames before this test is run.
|
||||||
|
absl::FlagsUsageConfig default_config;
|
||||||
|
default_config.normalize_filename = &FlagTest::NormalizeFileName;
|
||||||
|
absl::SetFlagsUsageConfig(default_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::string NormalizeFileName(absl::string_view fname) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
std::string normalized(fname);
|
||||||
|
std::replace(normalized.begin(), normalized.end(), '\\', '/');
|
||||||
|
fname = normalized;
|
||||||
|
#endif
|
||||||
|
return std::string(fname);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(FlagTest, TestConstruction) {
|
||||||
TestConstructionFor<bool>();
|
TestConstructionFor<bool>();
|
||||||
TestConstructionFor<int16_t>();
|
TestConstructionFor<int16_t>();
|
||||||
TestConstructionFor<uint16_t>();
|
TestConstructionFor<uint16_t>();
|
||||||
|
@ -98,7 +122,7 @@ namespace {
|
||||||
|
|
||||||
#if !ABSL_FLAGS_STRIP_NAMES
|
#if !ABSL_FLAGS_STRIP_NAMES
|
||||||
|
|
||||||
TEST(FlagTest, TestFlagDeclaration) {
|
TEST_F(FlagTest, TestFlagDeclaration) {
|
||||||
// test that we can access flag objects.
|
// test that we can access flag objects.
|
||||||
EXPECT_EQ(FLAGS_test_flag_01.Name(), "test_flag_01");
|
EXPECT_EQ(FLAGS_test_flag_01.Name(), "test_flag_01");
|
||||||
EXPECT_EQ(FLAGS_test_flag_02.Name(), "test_flag_02");
|
EXPECT_EQ(FLAGS_test_flag_02.Name(), "test_flag_02");
|
||||||
|
@ -133,69 +157,69 @@ ABSL_FLAG(std::string, test_flag_11, "", "test flag 11");
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
#if !ABSL_FLAGS_STRIP_NAMES
|
#if !ABSL_FLAGS_STRIP_NAMES
|
||||||
TEST(FlagTest, TestFlagDefinition) {
|
TEST_F(FlagTest, TestFlagDefinition) {
|
||||||
absl::string_view expected_file_name = "absl/flags/flag_test.cc";
|
absl::string_view expected_file_name = "absl/flags/flag_test.cc";
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_01.Name(), "test_flag_01");
|
EXPECT_EQ(FLAGS_test_flag_01.Name(), "test_flag_01");
|
||||||
EXPECT_EQ(FLAGS_test_flag_01.Help(), "test flag 01");
|
EXPECT_EQ(FLAGS_test_flag_01.Help(), "test flag 01");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_01.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_01.Filename(), expected_file_name));
|
<< FLAGS_test_flag_01.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_02.Name(), "test_flag_02");
|
EXPECT_EQ(FLAGS_test_flag_02.Name(), "test_flag_02");
|
||||||
EXPECT_EQ(FLAGS_test_flag_02.Help(), "test flag 02");
|
EXPECT_EQ(FLAGS_test_flag_02.Help(), "test flag 02");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_02.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_02.Filename(), expected_file_name));
|
<< FLAGS_test_flag_02.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_03.Name(), "test_flag_03");
|
EXPECT_EQ(FLAGS_test_flag_03.Name(), "test_flag_03");
|
||||||
EXPECT_EQ(FLAGS_test_flag_03.Help(), "test flag 03");
|
EXPECT_EQ(FLAGS_test_flag_03.Help(), "test flag 03");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_03.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_03.Filename(), expected_file_name));
|
<< FLAGS_test_flag_03.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_04.Name(), "test_flag_04");
|
EXPECT_EQ(FLAGS_test_flag_04.Name(), "test_flag_04");
|
||||||
EXPECT_EQ(FLAGS_test_flag_04.Help(), "test flag 04");
|
EXPECT_EQ(FLAGS_test_flag_04.Help(), "test flag 04");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_04.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_04.Filename(), expected_file_name));
|
<< FLAGS_test_flag_04.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_05.Name(), "test_flag_05");
|
EXPECT_EQ(FLAGS_test_flag_05.Name(), "test_flag_05");
|
||||||
EXPECT_EQ(FLAGS_test_flag_05.Help(), "test flag 05");
|
EXPECT_EQ(FLAGS_test_flag_05.Help(), "test flag 05");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_05.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_05.Filename(), expected_file_name));
|
<< FLAGS_test_flag_05.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_06.Name(), "test_flag_06");
|
EXPECT_EQ(FLAGS_test_flag_06.Name(), "test_flag_06");
|
||||||
EXPECT_EQ(FLAGS_test_flag_06.Help(), "test flag 06");
|
EXPECT_EQ(FLAGS_test_flag_06.Help(), "test flag 06");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_06.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_06.Filename(), expected_file_name));
|
<< FLAGS_test_flag_06.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_07.Name(), "test_flag_07");
|
EXPECT_EQ(FLAGS_test_flag_07.Name(), "test_flag_07");
|
||||||
EXPECT_EQ(FLAGS_test_flag_07.Help(), "test flag 07");
|
EXPECT_EQ(FLAGS_test_flag_07.Help(), "test flag 07");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_07.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_07.Filename(), expected_file_name));
|
<< FLAGS_test_flag_07.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_08.Name(), "test_flag_08");
|
EXPECT_EQ(FLAGS_test_flag_08.Name(), "test_flag_08");
|
||||||
EXPECT_EQ(FLAGS_test_flag_08.Help(), "test flag 08");
|
EXPECT_EQ(FLAGS_test_flag_08.Help(), "test flag 08");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_08.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_08.Filename(), expected_file_name));
|
<< FLAGS_test_flag_08.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_09.Name(), "test_flag_09");
|
EXPECT_EQ(FLAGS_test_flag_09.Name(), "test_flag_09");
|
||||||
EXPECT_EQ(FLAGS_test_flag_09.Help(), "test flag 09");
|
EXPECT_EQ(FLAGS_test_flag_09.Help(), "test flag 09");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_09.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_09.Filename(), expected_file_name));
|
<< FLAGS_test_flag_09.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_10.Name(), "test_flag_10");
|
EXPECT_EQ(FLAGS_test_flag_10.Name(), "test_flag_10");
|
||||||
EXPECT_EQ(FLAGS_test_flag_10.Help(), "test flag 10");
|
EXPECT_EQ(FLAGS_test_flag_10.Help(), "test flag 10");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_10.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_10.Filename(), expected_file_name));
|
<< FLAGS_test_flag_10.Filename();
|
||||||
|
|
||||||
EXPECT_EQ(FLAGS_test_flag_11.Name(), "test_flag_11");
|
EXPECT_EQ(FLAGS_test_flag_11.Name(), "test_flag_11");
|
||||||
EXPECT_EQ(FLAGS_test_flag_11.Help(), "test flag 11");
|
EXPECT_EQ(FLAGS_test_flag_11.Help(), "test flag 11");
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_11.Filename(), expected_file_name))
|
||||||
absl::EndsWith(FLAGS_test_flag_11.Filename(), expected_file_name));
|
<< FLAGS_test_flag_11.Filename();
|
||||||
}
|
}
|
||||||
#endif // !ABSL_FLAGS_STRIP_NAMES
|
#endif // !ABSL_FLAGS_STRIP_NAMES
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
TEST(FlagTest, TestDefault) {
|
TEST_F(FlagTest, TestDefault) {
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), true);
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), true);
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 1234);
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 1234);
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), -34);
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), -34);
|
||||||
|
@ -211,7 +235,7 @@ TEST(FlagTest, TestDefault) {
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
TEST(FlagTest, TestGetSet) {
|
TEST_F(FlagTest, TestGetSet) {
|
||||||
absl::SetFlag(&FLAGS_test_flag_01, false);
|
absl::SetFlag(&FLAGS_test_flag_01, false);
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), false);
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), false);
|
||||||
|
|
||||||
|
@ -258,7 +282,7 @@ ABSL_FLAG(std::string, test_flag_13, absl::StrCat("AAA", "BBB"),
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST(FlagTest, TestNonConstexprDefault) {
|
TEST_F(FlagTest, TestNonConstexprDefault) {
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), 1);
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), 1);
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_13), "AAABBB");
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_13), "AAABBB");
|
||||||
}
|
}
|
||||||
|
@ -272,7 +296,7 @@ ABSL_FLAG(bool, test_flag_14, true, absl::StrCat("test ", "flag ", "14"));
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
#if !ABSL_FLAGS_STRIP_HELP
|
#if !ABSL_FLAGS_STRIP_HELP
|
||||||
TEST(FlagTest, TestNonConstexprHelp) {
|
TEST_F(FlagTest, TestNonConstexprHelp) {
|
||||||
EXPECT_EQ(FLAGS_test_flag_14.Help(), "test flag 14");
|
EXPECT_EQ(FLAGS_test_flag_14.Help(), "test flag 14");
|
||||||
}
|
}
|
||||||
#endif //! ABSL_FLAGS_STRIP_HELP
|
#endif //! ABSL_FLAGS_STRIP_HELP
|
||||||
|
@ -296,7 +320,7 @@ namespace {
|
||||||
void TestFlagCB() { cb_test_value = absl::GetFlag(FLAGS_test_flag_with_cb); }
|
void TestFlagCB() { cb_test_value = absl::GetFlag(FLAGS_test_flag_with_cb); }
|
||||||
|
|
||||||
// Tests side-effects of callback invocation.
|
// Tests side-effects of callback invocation.
|
||||||
TEST(FlagTest, CallbackInvocation) {
|
TEST_F(FlagTest, CallbackInvocation) {
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_with_cb), 100);
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_with_cb), 100);
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_with_lambda_cb), 200);
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_with_lambda_cb), 200);
|
||||||
EXPECT_EQ(cb_test_value, 300);
|
EXPECT_EQ(cb_test_value, 300);
|
||||||
|
@ -343,7 +367,7 @@ ABSL_FLAG(CustomUDT, test_flag_15, CustomUDT(), "test flag 15");
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST(FlagTest, TestCustomUDT) {
|
TEST_F(FlagTest, TestCustomUDT) {
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_15), CustomUDT(1, 1));
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_15), CustomUDT(1, 1));
|
||||||
absl::SetFlag(&FLAGS_test_flag_15, CustomUDT(2, 3));
|
absl::SetFlag(&FLAGS_test_flag_15, CustomUDT(2, 3));
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_15), CustomUDT(2, 3));
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_15), CustomUDT(2, 3));
|
||||||
|
@ -409,7 +433,7 @@ ABSL_FLAG(ConversionTestVal, test_flag_16,
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST(FlagTest, CanSetViaImplicitConversion) {
|
TEST_F(FlagTest, CanSetViaImplicitConversion) {
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_16).a, 10);
|
EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_16).a, 10);
|
||||||
absl::SetFlag(&FLAGS_test_flag_16,
|
absl::SetFlag(&FLAGS_test_flag_16,
|
||||||
ConversionTestVal::ViaImplicitConv::kEleven);
|
ConversionTestVal::ViaImplicitConv::kEleven);
|
||||||
|
@ -447,7 +471,7 @@ ABSL_FLAG(NonDfltConstructible, ndc_flag2, 0,
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST(FlagTest, TestNonDefaultConstructibleType) {
|
TEST_F(FlagTest, TestNonDefaultConstructibleType) {
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag1).value, '1' + 100);
|
EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag1).value, '1' + 100);
|
||||||
EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag2).value, 0);
|
EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag2).value, 0);
|
||||||
|
|
||||||
|
@ -468,7 +492,7 @@ ABSL_RETIRED_FLAG(std::string, old_str_flag, "", absl::StrCat("old ", "descr"));
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST(FlagTest, TestRetiredFlagRegistration) {
|
TEST_F(FlagTest, TestRetiredFlagRegistration) {
|
||||||
bool is_bool = false;
|
bool is_bool = false;
|
||||||
EXPECT_TRUE(flags::IsRetiredFlag("old_bool_flag", &is_bool));
|
EXPECT_TRUE(flags::IsRetiredFlag("old_bool_flag", &is_bool));
|
||||||
EXPECT_TRUE(is_bool);
|
EXPECT_TRUE(is_bool);
|
||||||
|
|
|
@ -15,9 +15,13 @@
|
||||||
|
|
||||||
#include "absl/flags/internal/commandlineflag.h"
|
#include "absl/flags/internal/commandlineflag.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
#include "absl/flags/flag.h"
|
#include "absl/flags/flag.h"
|
||||||
#include "absl/flags/internal/registry.h"
|
#include "absl/flags/internal/registry.h"
|
||||||
|
#include "absl/flags/usage_config.h"
|
||||||
#include "absl/memory/memory.h"
|
#include "absl/memory/memory.h"
|
||||||
#include "absl/strings/match.h"
|
#include "absl/strings/match.h"
|
||||||
#include "absl/strings/str_cat.h"
|
#include "absl/strings/str_cat.h"
|
||||||
|
@ -33,10 +37,26 @@ namespace flags = absl::flags_internal;
|
||||||
|
|
||||||
class CommandLineFlagTest : public testing::Test {
|
class CommandLineFlagTest : public testing::Test {
|
||||||
protected:
|
protected:
|
||||||
|
static void SetUpTestSuite() {
|
||||||
|
// Install a function to normalize filenames before this test is run.
|
||||||
|
absl::FlagsUsageConfig default_config;
|
||||||
|
default_config.normalize_filename = &CommandLineFlagTest::NormalizeFileName;
|
||||||
|
absl::SetFlagsUsageConfig(default_config);
|
||||||
|
}
|
||||||
|
|
||||||
void SetUp() override { flag_saver_ = absl::make_unique<flags::FlagSaver>(); }
|
void SetUp() override { flag_saver_ = absl::make_unique<flags::FlagSaver>(); }
|
||||||
void TearDown() override { flag_saver_.reset(); }
|
void TearDown() override { flag_saver_.reset(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static std::string NormalizeFileName(absl::string_view fname) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
std::string normalized(fname);
|
||||||
|
std::replace(normalized.begin(), normalized.end(), '\\', '/');
|
||||||
|
fname = normalized;
|
||||||
|
#endif
|
||||||
|
return std::string(fname);
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<flags::FlagSaver> flag_saver_;
|
std::unique_ptr<flags::FlagSaver> flag_saver_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -49,9 +69,10 @@ TEST_F(CommandLineFlagTest, TestAttributesAccessMethods) {
|
||||||
EXPECT_EQ(flag_01->Typename(), "");
|
EXPECT_EQ(flag_01->Typename(), "");
|
||||||
EXPECT_TRUE(!flag_01->IsRetired());
|
EXPECT_TRUE(!flag_01->IsRetired());
|
||||||
EXPECT_TRUE(flag_01->IsOfType<int>());
|
EXPECT_TRUE(flag_01->IsOfType<int>());
|
||||||
EXPECT_TRUE(absl::EndsWith(
|
EXPECT_TRUE(
|
||||||
flag_01->Filename(),
|
absl::EndsWith(flag_01->Filename(),
|
||||||
"absl/flags/internal/commandlineflag_test.cc"));
|
"absl/flags/internal/commandlineflag_test.cc"))
|
||||||
|
<< flag_01->Filename();
|
||||||
|
|
||||||
auto* flag_02 = flags::FindCommandLineFlag("string_flag");
|
auto* flag_02 = flags::FindCommandLineFlag("string_flag");
|
||||||
|
|
||||||
|
@ -61,9 +82,10 @@ TEST_F(CommandLineFlagTest, TestAttributesAccessMethods) {
|
||||||
EXPECT_EQ(flag_02->Typename(), "");
|
EXPECT_EQ(flag_02->Typename(), "");
|
||||||
EXPECT_TRUE(!flag_02->IsRetired());
|
EXPECT_TRUE(!flag_02->IsRetired());
|
||||||
EXPECT_TRUE(flag_02->IsOfType<std::string>());
|
EXPECT_TRUE(flag_02->IsOfType<std::string>());
|
||||||
EXPECT_TRUE(absl::EndsWith(
|
EXPECT_TRUE(
|
||||||
flag_02->Filename(),
|
absl::EndsWith(flag_02->Filename(),
|
||||||
"absl/flags/internal/commandlineflag_test.cc"));
|
"absl/flags/internal/commandlineflag_test.cc"))
|
||||||
|
<< flag_02->Filename();
|
||||||
|
|
||||||
auto* flag_03 = flags::FindRetiredFlag("bool_retired_flag");
|
auto* flag_03 = flags::FindRetiredFlag("bool_retired_flag");
|
||||||
|
|
||||||
|
|
|
@ -67,9 +67,9 @@ static std::string NormalizeFileName(absl::string_view fname) {
|
||||||
fname = normalized;
|
fname = normalized;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto absl_pos = fname.find("/absl/");
|
auto absl_pos = fname.rfind("absl/");
|
||||||
if (absl_pos != absl::string_view::npos) {
|
if (absl_pos != absl::string_view::npos) {
|
||||||
fname = fname.substr(absl_pos + 1);
|
fname = fname.substr(absl_pos);
|
||||||
}
|
}
|
||||||
return std::string(fname);
|
return std::string(fname);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1025,6 +1025,8 @@ absl_cc_test(
|
||||||
random_internal_iostream_state_saver_test
|
random_internal_iostream_state_saver_test
|
||||||
SRCS
|
SRCS
|
||||||
"internal/iostream_state_saver_test.cc"
|
"internal/iostream_state_saver_test.cc"
|
||||||
|
COPTS
|
||||||
|
${ABSL_TEST_COPTS}
|
||||||
LINKOPTS
|
LINKOPTS
|
||||||
${ABSL_DEFAULT_LINKOPTS}
|
${ABSL_DEFAULT_LINKOPTS}
|
||||||
DEPS
|
DEPS
|
||||||
|
|
|
@ -129,7 +129,7 @@ class beta_distribution {
|
||||||
private:
|
private:
|
||||||
friend class beta_distribution;
|
friend class beta_distribution;
|
||||||
|
|
||||||
#ifdef COMPILER_MSVC
|
#ifdef _MSC_VER
|
||||||
// MSVC does not have constexpr implementations for std::log and std::exp
|
// MSVC does not have constexpr implementations for std::log and std::exp
|
||||||
// so they are computed at runtime.
|
// so they are computed at runtime.
|
||||||
#define ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR
|
#define ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR
|
||||||
|
|
|
@ -36,6 +36,12 @@
|
||||||
#include "absl/types/span.h"
|
#include "absl/types/span.h"
|
||||||
|
|
||||||
namespace absl {
|
namespace absl {
|
||||||
|
|
||||||
|
struct IntervalClosedClosedTag;
|
||||||
|
struct IntervalClosedOpenTag;
|
||||||
|
struct IntervalOpenClosedTag;
|
||||||
|
struct IntervalOpenOpenTag;
|
||||||
|
|
||||||
namespace random_internal {
|
namespace random_internal {
|
||||||
|
|
||||||
// ScalarTypeName defines a preferred hierarchy of preferred type names for
|
// ScalarTypeName defines a preferred hierarchy of preferred type names for
|
||||||
|
@ -243,6 +249,39 @@ struct DistributionFormatTraits<absl::log_uniform_int_distribution<R>> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename TagType, typename NumType>
|
||||||
|
struct UniformDistributionWrapper;
|
||||||
|
|
||||||
|
template <typename TagType, typename NumType>
|
||||||
|
struct DistributionFormatTraits<UniformDistributionWrapper<TagType, NumType>> {
|
||||||
|
using distribution_t = UniformDistributionWrapper<TagType, NumType>;
|
||||||
|
using result_t = NumType;
|
||||||
|
|
||||||
|
static constexpr const char* Name() { return "Uniform"; }
|
||||||
|
|
||||||
|
static std::string FunctionName() {
|
||||||
|
return absl::StrCat(Name(), "<", ScalarTypeName<NumType>(), ">");
|
||||||
|
}
|
||||||
|
static std::string FormatArgs(const distribution_t& d) {
|
||||||
|
absl::string_view tag;
|
||||||
|
if (std::is_same<TagType, IntervalClosedClosedTag>::value) {
|
||||||
|
tag = "IntervalClosedClosed";
|
||||||
|
} else if (std::is_same<TagType, IntervalClosedOpenTag>::value) {
|
||||||
|
tag = "IntervalClosedOpen";
|
||||||
|
} else if (std::is_same<TagType, IntervalOpenClosedTag>::value) {
|
||||||
|
tag = "IntervalOpenClosed";
|
||||||
|
} else if (std::is_same<TagType, IntervalOpenOpenTag>::value) {
|
||||||
|
tag = "IntervalOpenOpen";
|
||||||
|
} else {
|
||||||
|
tag = "[[unknown tag type]]";
|
||||||
|
}
|
||||||
|
return absl::StrCat(tag, ", ", (d.min)(), ", ", (d.max)());
|
||||||
|
}
|
||||||
|
static std::string FormatResults(absl::Span<const result_t> results) {
|
||||||
|
return absl::StrJoin(results, ", ");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace random_internal
|
} // namespace random_internal
|
||||||
} // namespace absl
|
} // namespace absl
|
||||||
|
|
||||||
|
|
|
@ -60,13 +60,11 @@ cc_library(
|
||||||
linkopts = ABSL_DEFAULT_LINKOPTS,
|
linkopts = ABSL_DEFAULT_LINKOPTS,
|
||||||
deps = [
|
deps = [
|
||||||
":distribution_caller",
|
":distribution_caller",
|
||||||
":fast_uniform_bits",
|
|
||||||
":fastmath",
|
|
||||||
":traits",
|
":traits",
|
||||||
":uniform_helper",
|
":uniform_helper",
|
||||||
|
"//absl/base",
|
||||||
"//absl/meta:type_traits",
|
"//absl/meta:type_traits",
|
||||||
"//absl/strings",
|
"//absl/strings",
|
||||||
"//absl/types:span",
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -618,11 +616,6 @@ cc_library(
|
||||||
copts = ABSL_DEFAULT_COPTS,
|
copts = ABSL_DEFAULT_COPTS,
|
||||||
linkopts = ABSL_DEFAULT_LINKOPTS,
|
linkopts = ABSL_DEFAULT_LINKOPTS,
|
||||||
deps = [
|
deps = [
|
||||||
":distribution_impl",
|
|
||||||
":fast_uniform_bits",
|
|
||||||
":iostream_state_saver",
|
|
||||||
":traits",
|
|
||||||
"//absl/base:core_headers",
|
|
||||||
"//absl/meta:type_traits",
|
"//absl/meta:type_traits",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -39,22 +39,20 @@ NumType UniformImpl(TagType tag,
|
||||||
"absl::Uniform<T>() must use an integer or real parameter type.");
|
"absl::Uniform<T>() must use an integer or real parameter type.");
|
||||||
|
|
||||||
using distribution_t =
|
using distribution_t =
|
||||||
typename std::conditional<std::is_integral<NumType>::value,
|
UniformDistributionWrapper<absl::decay_t<TagType>, NumType>;
|
||||||
absl::uniform_int_distribution<NumType>,
|
|
||||||
absl::uniform_real_distribution<NumType>>::type;
|
|
||||||
using format_t = random_internal::DistributionFormatTraits<distribution_t>;
|
using format_t = random_internal::DistributionFormatTraits<distribution_t>;
|
||||||
|
auto a = uniform_lower_bound(tag, lo, hi);
|
||||||
|
auto b = uniform_upper_bound(tag, lo, hi);
|
||||||
|
|
||||||
auto a = random_internal::uniform_lower_bound<NumType>(tag, lo, hi);
|
|
||||||
auto b = random_internal::uniform_upper_bound<NumType>(tag, lo, hi);
|
|
||||||
// TODO(lar): it doesn't make a lot of sense to ask for a random number in an
|
// TODO(lar): it doesn't make a lot of sense to ask for a random number in an
|
||||||
// empty range. Right now we just return a boundary--even though that
|
// empty range. Right now we just return a boundary--even though that
|
||||||
// boundary is not an acceptable value! Is there something better we can do
|
// boundary is not an acceptable value! Is there something better we can do
|
||||||
// here?
|
// here?
|
||||||
|
if (a > b) return a;
|
||||||
|
|
||||||
using gen_t = absl::decay_t<URBG>;
|
using gen_t = absl::decay_t<URBG>;
|
||||||
if (a > b) return a;
|
|
||||||
return DistributionCaller<gen_t>::template Call<distribution_t, format_t>(
|
return DistributionCaller<gen_t>::template Call<distribution_t, format_t>(
|
||||||
&urbg, a, b);
|
&urbg, tag, lo, hi);
|
||||||
}
|
}
|
||||||
|
|
||||||
// In the absence of an explicitly provided return-type, the template
|
// In the absence of an explicitly provided return-type, the template
|
||||||
|
|
|
@ -156,7 +156,7 @@ using UniformDistribution =
|
||||||
|
|
||||||
template <typename TagType, typename NumType>
|
template <typename TagType, typename NumType>
|
||||||
struct UniformDistributionWrapper : public UniformDistribution<NumType> {
|
struct UniformDistributionWrapper : public UniformDistribution<NumType> {
|
||||||
explicit UniformDistributionWrapper(NumType lo, NumType hi)
|
explicit UniformDistributionWrapper(TagType, NumType lo, NumType hi)
|
||||||
: UniformDistribution<NumType>(
|
: UniformDistribution<NumType>(
|
||||||
uniform_lower_bound<NumType>(TagType{}, lo, hi),
|
uniform_lower_bound<NumType>(TagType{}, lo, hi),
|
||||||
uniform_upper_bound<NumType>(TagType{}, lo, hi)) {}
|
uniform_upper_bound<NumType>(TagType{}, lo, hi)) {}
|
||||||
|
|
Loading…
Reference in a new issue