Export of internal Abseil changes
-- a3e58c1870a9626039f4d178d2d599319bd9f8a8 by Matt Kulukundis <kfm@google.com>: Allow MakeCordFromExternal to take a zero arg releaser. PiperOrigin-RevId: 298650274 -- 01897c4a9bb99f3dc329a794019498ad345ddebd by Samuel Benzaquen <sbenza@google.com>: Reduce library bloat for absl::Flag by moving the definition of base virtual functions to a .cc file. This removes the duplicate symbols in user translation units and has the side effect of moving the vtable definition too (re key function) PiperOrigin-RevId: 298617920 -- 190f0d3782c63aed01046886d7fbc1be5bca2de9 by Derek Mauro <dmauro@google.com>: Import GitHub #596: Unbreak stacktrace code for UWP apps PiperOrigin-RevId: 298600834 -- cd5cf6f8c87b35b85a9584e94da2a99057345b73 by Gennadiy Rozental <rogeeff@google.com>: Use union of heap allocated pointer, one word atomic and two word atomic to represent flags value. Any type T, which is trivially copy-able and with with sizeof(T) <= 8, will be stored in atomic int64_t. Any type T, which is trivially copy-able and with with 8 < sizeof(T) <= 16, will be stored in atomic AlignedTwoWords. We also introducing value storage type to distinguish these cases. PiperOrigin-RevId: 298497200 -- f8fe7bd53bfed601f002f521e34ab4bc083fc28b by Matthew Brown <matthewbr@google.com>: Ensure a deep copy and proper equality on absl::Status::ErasePayload PiperOrigin-RevId: 298482742 -- a5c9ccddf4b04f444e3f7e27dbc14faf1fcb5373 by Gennadiy Rozental <rogeeff@google.com>: Change ChunkIterator implementation to use fixed capacity collection of CordRep*. We can now assume that depth never exceeds 91. That makes comparison operator exception safe. I've tested that with this CL we do not observe an overhead of chunk_end. Compiler optimized this iterator completely. PiperOrigin-RevId: 298458472 -- 327ea5e8910bc388b03389c730763f9823abfce5 by Abseil Team <absl-team@google.com>: Minor cleanups in b-tree code: - Rename some variables: fix issues of different param names between definition/declaration, move away from `x` as a default meaningless variable name. - Make init_leaf/init_internal be non-static methods (they already take the node as the first parameter). - In internal_emplace/try_shrink, update root/rightmost the same way as in insert_unique/insert_multi. - Replace a TODO with a comment. PiperOrigin-RevId: 298432836 -- 8020ce9ec8558ee712d9733ae3d660ac1d3ffe1a by Abseil Team <absl-team@google.com>: Guard against unnecessary copy in case the buffer is empty. This is important in cases were the user is explicitly tuning their chunks to match PiecewiseChunkSize(). PiperOrigin-RevId: 298366044 -- 89324441d1c0c697c90ba7d8fc63639805fcaa9d by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 298219363 GitOrigin-RevId: a3e58c1870a9626039f4d178d2d599319bd9f8a8 Change-Id: I28dffc684b6fd0292b94807b88ec6664d5d0e183
This commit is contained in:
parent
06f0e767d1
commit
b19ba96766
24 changed files with 842 additions and 501 deletions
|
|
@ -49,28 +49,6 @@ void* TestMakeDflt() {
|
|||
}
|
||||
void TestCallback() {}
|
||||
|
||||
template <typename T>
|
||||
bool TestConstructionFor() {
|
||||
constexpr flags::FlagHelpArg help_arg{flags::FlagHelpMsg("literal help"),
|
||||
flags::FlagHelpKind::kLiteral};
|
||||
constexpr flags::Flag<T> f1("f1", "file", help_arg, &TestMakeDflt<T>);
|
||||
EXPECT_EQ(f1.Name(), "f1");
|
||||
EXPECT_EQ(f1.Help(), "literal help");
|
||||
EXPECT_EQ(f1.Filename(), "file");
|
||||
|
||||
ABSL_CONST_INIT static flags::Flag<T> f2(
|
||||
"f2", "file",
|
||||
{flags::FlagHelpMsg(&TestHelpMsg), flags::FlagHelpKind::kGenFunc},
|
||||
&TestMakeDflt<T>);
|
||||
flags::FlagRegistrar<T, false>(&f2).OnUpdate(TestCallback);
|
||||
|
||||
EXPECT_EQ(f2.Name(), "f2");
|
||||
EXPECT_EQ(f2.Help(), "dynamic help");
|
||||
EXPECT_EQ(f2.Filename(), "file");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
struct UDT {
|
||||
UDT() = default;
|
||||
UDT(const UDT&) = default;
|
||||
|
|
@ -98,19 +76,103 @@ class FlagTest : public testing::Test {
|
|||
}
|
||||
};
|
||||
|
||||
TEST_F(FlagTest, TestConstruction) {
|
||||
TestConstructionFor<bool>();
|
||||
TestConstructionFor<int16_t>();
|
||||
TestConstructionFor<uint16_t>();
|
||||
TestConstructionFor<int32_t>();
|
||||
TestConstructionFor<uint32_t>();
|
||||
TestConstructionFor<int64_t>();
|
||||
TestConstructionFor<uint64_t>();
|
||||
TestConstructionFor<double>();
|
||||
TestConstructionFor<float>();
|
||||
TestConstructionFor<std::string>();
|
||||
struct S1 {
|
||||
S1() = default;
|
||||
S1(const S1&) = default;
|
||||
int32_t f1;
|
||||
int64_t f2;
|
||||
};
|
||||
|
||||
TestConstructionFor<UDT>();
|
||||
struct S2 {
|
||||
S2() = default;
|
||||
S2(const S2&) = default;
|
||||
int64_t f1;
|
||||
double f2;
|
||||
};
|
||||
|
||||
TEST_F(FlagTest, Traits) {
|
||||
EXPECT_EQ(flags::FlagValue::Kind<int>(),
|
||||
flags::FlagValueStorageKind::kOneWordAtomic);
|
||||
EXPECT_EQ(flags::FlagValue::Kind<bool>(),
|
||||
flags::FlagValueStorageKind::kOneWordAtomic);
|
||||
EXPECT_EQ(flags::FlagValue::Kind<double>(),
|
||||
flags::FlagValueStorageKind::kOneWordAtomic);
|
||||
EXPECT_EQ(flags::FlagValue::Kind<int64_t>(),
|
||||
flags::FlagValueStorageKind::kOneWordAtomic);
|
||||
|
||||
#if defined(ABSL_FLAGS_INTERNAL_ATOMIC_DOUBLE_WORD)
|
||||
EXPECT_EQ(flags::FlagValue::Kind<S1>(),
|
||||
flags::FlagValueStorageKind::kTwoWordsAtomic);
|
||||
EXPECT_EQ(flags::FlagValue::Kind<S2>(),
|
||||
flags::FlagValueStorageKind::kTwoWordsAtomic);
|
||||
#else
|
||||
EXPECT_EQ(flags::FlagValue::Kind<S1>(),
|
||||
flags::FlagValueStorageKind::kHeapAllocated);
|
||||
EXPECT_EQ(flags::FlagValue::Kind<S2>(),
|
||||
flags::FlagValueStorageKind::kHeapAllocated);
|
||||
#endif
|
||||
|
||||
EXPECT_EQ(flags::FlagValue::Kind<std::string>(),
|
||||
flags::FlagValueStorageKind::kHeapAllocated);
|
||||
EXPECT_EQ(flags::FlagValue::Kind<std::vector<std::string>>(),
|
||||
flags::FlagValueStorageKind::kHeapAllocated);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
constexpr flags::FlagHelpArg help_arg{flags::FlagHelpMsg("literal help"),
|
||||
flags::FlagHelpKind::kLiteral};
|
||||
|
||||
using String = std::string;
|
||||
|
||||
#define DEFINE_CONSTRUCTED_FLAG(T) \
|
||||
constexpr flags::Flag<T> f1##T("f1", "file", help_arg, &TestMakeDflt<T>); \
|
||||
ABSL_CONST_INIT flags::Flag<T> f2##T( \
|
||||
"f2", "file", \
|
||||
{flags::FlagHelpMsg(&TestHelpMsg), flags::FlagHelpKind::kGenFunc}, \
|
||||
&TestMakeDflt<T>)
|
||||
|
||||
#define TEST_CONSTRUCTED_FLAG(T) TestConstructionFor(f1##T, &f2##T);
|
||||
|
||||
DEFINE_CONSTRUCTED_FLAG(bool);
|
||||
DEFINE_CONSTRUCTED_FLAG(int16_t);
|
||||
DEFINE_CONSTRUCTED_FLAG(uint16_t);
|
||||
DEFINE_CONSTRUCTED_FLAG(int32_t);
|
||||
DEFINE_CONSTRUCTED_FLAG(uint32_t);
|
||||
DEFINE_CONSTRUCTED_FLAG(int64_t);
|
||||
DEFINE_CONSTRUCTED_FLAG(uint64_t);
|
||||
DEFINE_CONSTRUCTED_FLAG(float);
|
||||
DEFINE_CONSTRUCTED_FLAG(double);
|
||||
DEFINE_CONSTRUCTED_FLAG(String);
|
||||
DEFINE_CONSTRUCTED_FLAG(UDT);
|
||||
|
||||
template <typename T>
|
||||
bool TestConstructionFor(const flags::Flag<T>& f1, flags::Flag<T>* f2) {
|
||||
EXPECT_EQ(f1.Name(), "f1");
|
||||
EXPECT_EQ(f1.Help(), "literal help");
|
||||
EXPECT_EQ(f1.Filename(), "file");
|
||||
|
||||
flags::FlagRegistrar<T, false>(f2).OnUpdate(TestCallback);
|
||||
|
||||
EXPECT_EQ(f2->Name(), "f2");
|
||||
EXPECT_EQ(f2->Help(), "dynamic help");
|
||||
EXPECT_EQ(f2->Filename(), "file");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
TEST_F(FlagTest, TestConstruction) {
|
||||
TEST_CONSTRUCTED_FLAG(bool);
|
||||
TEST_CONSTRUCTED_FLAG(int16_t);
|
||||
TEST_CONSTRUCTED_FLAG(uint16_t);
|
||||
TEST_CONSTRUCTED_FLAG(int32_t);
|
||||
TEST_CONSTRUCTED_FLAG(uint32_t);
|
||||
TEST_CONSTRUCTED_FLAG(int64_t);
|
||||
TEST_CONSTRUCTED_FLAG(uint64_t);
|
||||
TEST_CONSTRUCTED_FLAG(float);
|
||||
TEST_CONSTRUCTED_FLAG(double);
|
||||
TEST_CONSTRUCTED_FLAG(String);
|
||||
TEST_CONSTRUCTED_FLAG(UDT);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
|
@ -391,17 +453,18 @@ TEST_F(FlagTest, TestCustomUDT) {
|
|||
using FlagDeathTest = FlagTest;
|
||||
|
||||
TEST_F(FlagDeathTest, TestTypeMismatchValidations) {
|
||||
EXPECT_DEBUG_DEATH(
|
||||
static_cast<void>(absl::GetFlag(FLAGS_mistyped_int_flag)),
|
||||
"Flag 'mistyped_int_flag' is defined as one type and declared "
|
||||
"as another");
|
||||
EXPECT_DEATH(absl::SetFlag(&FLAGS_mistyped_int_flag, 1),
|
||||
#if !defined(NDEBUG)
|
||||
EXPECT_DEATH(static_cast<void>(absl::GetFlag(FLAGS_mistyped_int_flag)),
|
||||
"Flag 'mistyped_int_flag' is defined as one type and declared "
|
||||
"as another");
|
||||
|
||||
EXPECT_DEATH(static_cast<void>(absl::GetFlag(FLAGS_mistyped_string_flag)),
|
||||
"Flag 'mistyped_string_flag' is defined as one type and "
|
||||
"declared as another");
|
||||
#endif
|
||||
|
||||
EXPECT_DEATH(absl::SetFlag(&FLAGS_mistyped_int_flag, 1),
|
||||
"Flag 'mistyped_int_flag' is defined as one type and declared "
|
||||
"as another");
|
||||
EXPECT_DEATH(
|
||||
absl::SetFlag(&FLAGS_mistyped_string_flag, std::vector<std::string>{}),
|
||||
"Flag 'mistyped_string_flag' is defined as one type and declared as "
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue