Export of internal Abseil changes.
-- f9f068aa8a260dc576398e47b8e4540902e41358 by Derek Mauro <dmauro@google.com>: Fix test string with embedded NUL. Currently parses as octal. PiperOrigin-RevId: 237088193 -- d271ffdd3f450f817f6d30e98ff39d439aaf3a98 by Abseil Team <absl-team@google.com>: Make symbolizer examine any mapping with read+exec permission regardless of 'w' bit. PiperOrigin-RevId: 237056461 -- af315f8306d36a7367a452fd0b58cafdbf20719d by Abseil Team <absl-team@google.com>: Switch comments referencing base:: CondVar and Mutex to absl::. PiperOrigin-RevId: 236917884 -- c624d5d1c0bdb917bff5e651ba40599472f84e0e by Gennadiy Rozental <rogeeff@google.com>: Internal change PiperOrigin-RevId: 236898300 -- 3cdc82429af964846d1152f49148abc61d196a4b by Samuel Benzaquen <sbenza@google.com>: Make the `long double` overload if AbslHashValue a template to avoid invalid conversions with implicit operators. This overload was never meant to capture anything other than `long double` and any current caller to it that wasn't a `long double` is potentially a bug. In particular, any type with an implicit `bool` conversion is calling this overload instead of trying to find a hash<> specialization, thus causing pretty bad hash behavior. PiperOrigin-RevId: 236877073 GitOrigin-RevId: f9f068aa8a260dc576398e47b8e4540902e41358 Change-Id: If9cc008dd814f0ca06ed881f612c06575f1f7137
This commit is contained in:
parent
9fdf5e5b80
commit
febc5ee6a9
70 changed files with 483 additions and 410 deletions
|
|
@ -365,7 +365,8 @@ TEST(IteratorConstructorTest, Inline) {
|
|||
TEST(IteratorConstructorTest, NonPod) {
|
||||
char const* kInput[] =
|
||||
{ "red", "orange", "yellow", "green", "blue", "indigo", "violet" };
|
||||
absl::FixedArray<std::string> const fixed(kInput, kInput + ABSL_ARRAYSIZE(kInput));
|
||||
absl::FixedArray<std::string> const fixed(kInput,
|
||||
kInput + ABSL_ARRAYSIZE(kInput));
|
||||
ASSERT_EQ(ABSL_ARRAYSIZE(kInput), fixed.size());
|
||||
for (size_t i = 0; i < ABSL_ARRAYSIZE(kInput); ++i) {
|
||||
ASSERT_EQ(kInput[i], fixed[i]);
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ using Map = flat_hash_map<K, V, StatefulTestingHash, StatefulTestingEqual,
|
|||
static_assert(!std::is_standard_layout<NonStandardLayout>(), "");
|
||||
|
||||
using MapTypes =
|
||||
::testing::Types<Map<int, int>, Map<std::string, int>, Map<Enum, std::string>,
|
||||
Map<EnumClass, int>, Map<int, NonStandardLayout>,
|
||||
Map<NonStandardLayout, int>>;
|
||||
::testing::Types<Map<int, int>, Map<std::string, int>,
|
||||
Map<Enum, std::string>, Map<EnumClass, int>,
|
||||
Map<int, NonStandardLayout>, Map<NonStandardLayout, int>>;
|
||||
|
||||
INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashMap, ConstructorTest, MapTypes);
|
||||
INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashMap, LookupTest, MapTypes);
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ void BM_InlinedVectorFillString(benchmark::State& state) {
|
|||
const int len = state.range(0);
|
||||
const int no_sso = GetNonShortStringOptimizationSize();
|
||||
std::string strings[4] = {std::string(no_sso, 'A'), std::string(no_sso, 'B'),
|
||||
std::string(no_sso, 'C'), std::string(no_sso, 'D')};
|
||||
std::string(no_sso, 'C'), std::string(no_sso, 'D')};
|
||||
|
||||
for (auto _ : state) {
|
||||
absl::InlinedVector<std::string, 8> v;
|
||||
|
|
@ -105,7 +105,7 @@ void BM_StdVectorFillString(benchmark::State& state) {
|
|||
const int len = state.range(0);
|
||||
const int no_sso = GetNonShortStringOptimizationSize();
|
||||
std::string strings[4] = {std::string(no_sso, 'A'), std::string(no_sso, 'B'),
|
||||
std::string(no_sso, 'C'), std::string(no_sso, 'D')};
|
||||
std::string(no_sso, 'C'), std::string(no_sso, 'D')};
|
||||
|
||||
for (auto _ : state) {
|
||||
std::vector<std::string> v;
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@
|
|||
// equal functions are still bound to T. This is important because some type U
|
||||
// can be hashed by/tested for equality differently depending on T. A notable
|
||||
// example is `const char*`. `const char*` is treated as a c-style string when
|
||||
// the hash function is hash<string> but as a pointer when the hash function is
|
||||
// hash<void*>.
|
||||
// the hash function is hash<std::string> but as a pointer when the hash
|
||||
// function is hash<void*>.
|
||||
//
|
||||
#ifndef ABSL_CONTAINER_INTERNAL_HASH_FUNCTION_DEFAULTS_H_
|
||||
#define ABSL_CONTAINER_INTERNAL_HASH_FUNCTION_DEFAULTS_H_
|
||||
|
|
@ -83,6 +83,7 @@ struct StringHashEq {
|
|||
}
|
||||
};
|
||||
};
|
||||
|
||||
template <>
|
||||
struct HashEq<std::string> : StringHashEq {};
|
||||
template <>
|
||||
|
|
|
|||
|
|
@ -202,15 +202,11 @@ TYPED_TEST(HashPointer, Works) {
|
|||
EXPECT_NE(hash(&dummy), hash(cuptr));
|
||||
}
|
||||
|
||||
// Cartesian product of (string, std::string, absl::string_view)
|
||||
// with (string, std::string, absl::string_view, const char*).
|
||||
// Cartesian product of (std::string, absl::string_view)
|
||||
// with (std::string, absl::string_view, const char*).
|
||||
using StringTypesCartesianProduct = Types<
|
||||
// clang-format off
|
||||
|
||||
std::pair<std::string, std::string>,
|
||||
std::pair<std::string, absl::string_view>,
|
||||
std::pair<std::string, const char*>,
|
||||
|
||||
std::pair<absl::string_view, std::string>,
|
||||
std::pair<absl::string_view, absl::string_view>,
|
||||
std::pair<absl::string_view, const char*>>;
|
||||
|
|
|
|||
|
|
@ -643,7 +643,8 @@ class LayoutImpl<std::tuple<Elements...>, absl::index_sequence<SizeSeq...>,
|
|||
std::string DebugString() const {
|
||||
const auto offsets = Offsets();
|
||||
const size_t sizes[] = {SizeOf<ElementType<OffsetSeq>>()...};
|
||||
const std::string types[] = {adl_barrier::TypeName<ElementType<OffsetSeq>>()...};
|
||||
const std::string types[] = {
|
||||
adl_barrier::TypeName<ElementType<OffsetSeq>>()...};
|
||||
std::string res = absl::StrCat("@0", types[0], "(", sizes[0], ")");
|
||||
for (size_t i = 0; i != NumOffsets - 1; ++i) {
|
||||
absl::StrAppend(&res, "[", size_[i], "]; @", offsets[i + 1], types[i + 1],
|
||||
|
|
|
|||
|
|
@ -763,8 +763,8 @@ class raw_hash_set {
|
|||
// that accept std::initializer_list<T> and std::initializer_list<init_type>.
|
||||
// This is advantageous for performance.
|
||||
//
|
||||
// // Turns {"abc", "def"} into std::initializer_list<std::string>, then copies
|
||||
// // the strings into the set.
|
||||
// // Turns {"abc", "def"} into std::initializer_list<std::string>, then
|
||||
// // copies the strings into the set.
|
||||
// std::unordered_set<std::string> s = {"abc", "def"};
|
||||
//
|
||||
// // Turns {"abc", "def"} into std::initializer_list<const char*>, then
|
||||
|
|
|
|||
|
|
@ -1460,7 +1460,8 @@ TEST(Table, MoveAssign) {
|
|||
|
||||
TEST(Table, Equality) {
|
||||
StringTable t;
|
||||
std::vector<std::pair<std::string, std::string>> v = {{"a", "b"}, {"aa", "bb"}};
|
||||
std::vector<std::pair<std::string, std::string>> v = {{"a", "b"},
|
||||
{"aa", "bb"}};
|
||||
t.insert(std::begin(v), std::end(v));
|
||||
StringTable u = t;
|
||||
EXPECT_EQ(u, t);
|
||||
|
|
@ -1468,20 +1469,24 @@ TEST(Table, Equality) {
|
|||
|
||||
TEST(Table, Equality2) {
|
||||
StringTable t;
|
||||
std::vector<std::pair<std::string, std::string>> v1 = {{"a", "b"}, {"aa", "bb"}};
|
||||
std::vector<std::pair<std::string, std::string>> v1 = {{"a", "b"},
|
||||
{"aa", "bb"}};
|
||||
t.insert(std::begin(v1), std::end(v1));
|
||||
StringTable u;
|
||||
std::vector<std::pair<std::string, std::string>> v2 = {{"a", "a"}, {"aa", "aa"}};
|
||||
std::vector<std::pair<std::string, std::string>> v2 = {{"a", "a"},
|
||||
{"aa", "aa"}};
|
||||
u.insert(std::begin(v2), std::end(v2));
|
||||
EXPECT_NE(u, t);
|
||||
}
|
||||
|
||||
TEST(Table, Equality3) {
|
||||
StringTable t;
|
||||
std::vector<std::pair<std::string, std::string>> v1 = {{"b", "b"}, {"bb", "bb"}};
|
||||
std::vector<std::pair<std::string, std::string>> v1 = {{"b", "b"},
|
||||
{"bb", "bb"}};
|
||||
t.insert(std::begin(v1), std::end(v1));
|
||||
StringTable u;
|
||||
std::vector<std::pair<std::string, std::string>> v2 = {{"a", "a"}, {"aa", "aa"}};
|
||||
std::vector<std::pair<std::string, std::string>> v2 = {{"a", "a"},
|
||||
{"aa", "aa"}};
|
||||
u.insert(std::begin(v2), std::end(v2));
|
||||
EXPECT_NE(u, t);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,11 +23,11 @@ namespace absl {
|
|||
namespace container_internal {
|
||||
namespace {
|
||||
|
||||
using SetTypes =
|
||||
::testing::Types<std::unordered_set<int, StatefulTestingHash,
|
||||
StatefulTestingEqual, Alloc<int>>,
|
||||
std::unordered_set<std::string, StatefulTestingHash,
|
||||
StatefulTestingEqual, Alloc<std::string>>>;
|
||||
using SetTypes = ::testing::Types<
|
||||
std::unordered_set<int, StatefulTestingHash, StatefulTestingEqual,
|
||||
Alloc<int>>,
|
||||
std::unordered_set<std::string, StatefulTestingHash, StatefulTestingEqual,
|
||||
Alloc<std::string>>>;
|
||||
|
||||
INSTANTIATE_TYPED_TEST_SUITE_P(UnorderedSet, ConstructorTest, SetTypes);
|
||||
INSTANTIATE_TYPED_TEST_SUITE_P(UnorderedSet, LookupTest, SetTypes);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue