Export of internal Abseil changes.
-- 1c1d6e2404dfc6caa022b335df5acdac6da50fe1 by Derek Mauro <dmauro@google.com>: Fix the internal namespacing in unaligned_access.h PiperOrigin-RevId: 215434506 -- 17d4400aebf025a230690fc1c7a968ef8d85bbba by Eric Fiselier <ericwf@google.com>: gtest depends on the GCC extension allowing variadic macros to be passed a empty parameter pack for ..., but LLVM diagnoses this as a GNU extension. This patch suppresses the warning when building the absl tests. PiperOrigin-RevId: 215426161 -- f2c49dde23a9f445b9de963f1bbe840ebb568b30 by Eric Fiselier <ericwf@google.com>: Use EXPECT_DEATH_IF_SUPPORTED instead of EXPECT_DEATH. This avoids breaking the test when gtest doesn't support death tests. PiperOrigin-RevId: 215423849 -- cd687c1e121709603f4fc3726b534f6a9c52cc89 by Eric Fiselier <ericwf@google.com>: Disable LLVM's -Wmissing-variable-declarations in tests. GCC's configuration already disables this via -Wno-missing-declarations, this change makes LLVM do the same. The warning would otherwise flag most tests which use ABSL_FLAG. PiperOrigin-RevId: 215407429 -- d14098824c84e3a8c8f6fb920e0335fb48fe2010 by Eric Fiselier <ericwf@google.com>: Fix local variable shadowing in city hash implementation. PiperOrigin-RevId: 215407249 -- 4b5e140ba743f0d231790a26c49083abb4329e2c by Abseil Team <absl-team@google.com>: Make raw_hash_set::reserve 2X fast when reserve doesn't do any allocation. Make raw_hash_set::reserve ~1% faster when reserve does some (128~4k) allocation. PiperOrigin-RevId: 215348727 -- 461161e65e04b801480aa117af2534c594654ccf by Eric Fiselier <ericwf@google.com>: Internal change PiperOrigin-RevId: 215272283 -- 50413ae31ad3d3a177257416acd8ede47a17bff2 by Eric Fiselier <ericwf@google.com>: Internal Change PiperOrigin-RevId: 215233183 -- 477be54c43d61019a8fe4e190e340eb52737d383 by Abseil Team <absl-team@google.com>: Clarify misleading comment on ABSL_ATTRIBUTE_UNUSED PiperOrigin-RevId: 215185496 -- 2cafa2b5287507d3a946682aee9ab13af6d471c9 by Matt Kulukundis <kfm@google.com>: Add support for absl::Hash to various absl in types. PiperOrigin-RevId: 215039569 -- 082248901991aa3d29be0ea3689c7f213cf0fd83 by Derek Mauro <dmauro@google.com>: Remove an instance of HAS_GLOBAL_STRING from hash_function_defaults.h PiperOrigin-RevId: 214989094 -- b929f61907f0786a6133e3a9d7287e339c0a0acb by Derek Mauro <dmauro@google.com>: Internal import of Github #174 Fix code snippet in comment https://github.com/abseil/abseil-cpp/pull/174 PiperOrigin-RevId: 214958849 -- f2c5e829eca11c352e121f56eefbf87083305023 by Derek Mauro <dmauro@google.com>: Internal import of GitHub #173 Fix CMake build for absl::container. https://github.com/abseil/abseil-cpp/pull/173 PiperOrigin-RevId: 214957796 -- d704f860f9fddafb99e34e6c5032e49f73874e10 by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 214828181 GitOrigin-RevId: 1c1d6e2404dfc6caa022b335df5acdac6da50fe1 Change-Id: I551de2b1ba0cbaf6856cd5959358cf6651179dea
This commit is contained in:
parent
5441bbe1db
commit
f21d187b80
26 changed files with 176 additions and 73 deletions
|
|
@ -67,6 +67,7 @@ cc_test(
|
|||
deps = [
|
||||
":fixed_array",
|
||||
"//absl/base:exception_testing",
|
||||
"//absl/hash:hash_testing",
|
||||
"//absl/memory",
|
||||
"@com_google_googletest//:gtest_main",
|
||||
],
|
||||
|
|
@ -79,6 +80,7 @@ cc_test(
|
|||
deps = [
|
||||
":fixed_array",
|
||||
"//absl/base:exception_testing",
|
||||
"//absl/hash:hash_testing",
|
||||
"//absl/memory",
|
||||
"@com_google_googletest//:gtest_main",
|
||||
],
|
||||
|
|
@ -130,6 +132,7 @@ cc_test(
|
|||
"//absl/base",
|
||||
"//absl/base:core_headers",
|
||||
"//absl/base:exception_testing",
|
||||
"//absl/hash:hash_testing",
|
||||
"//absl/memory",
|
||||
"//absl/strings",
|
||||
"@com_google_googletest//:gtest_main",
|
||||
|
|
@ -146,6 +149,7 @@ cc_test(
|
|||
"//absl/base",
|
||||
"//absl/base:core_headers",
|
||||
"//absl/base:exception_testing",
|
||||
"//absl/hash:hash_testing",
|
||||
"//absl/memory",
|
||||
"//absl/strings",
|
||||
"@com_google_googletest//:gtest_main",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ list(APPEND CONTAINER_INTERNAL_HEADERS
|
|||
"internal/unordered_set_modifiers_test.h"
|
||||
)
|
||||
|
||||
|
||||
absl_library(
|
||||
TARGET
|
||||
absl_container
|
||||
|
|
|
|||
|
|
@ -358,6 +358,13 @@ class FixedArray {
|
|||
friend bool operator>=(const FixedArray& lhs, const FixedArray& rhs) {
|
||||
return !(lhs < rhs);
|
||||
}
|
||||
|
||||
template <typename H>
|
||||
friend H AbslHashValue(H h, const FixedArray& v) {
|
||||
return H::combine(H::combine_contiguous(std::move(h), v.data(), v.size()),
|
||||
v.size());
|
||||
}
|
||||
|
||||
private:
|
||||
// StorageElement
|
||||
//
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include "absl/base/internal/exception_testing.h"
|
||||
#include "absl/hash/hash_testing.h"
|
||||
#include "absl/memory/memory.h"
|
||||
|
||||
using ::testing::ElementsAreArray;
|
||||
|
|
@ -867,4 +868,5 @@ TEST(FixedArrayTest, AddressSanitizerAnnotations4) {
|
|||
EXPECT_DEATH(raw[21] = ThreeInts(), "container-overflow");
|
||||
}
|
||||
#endif // ADDRESS_SANITIZER
|
||||
|
||||
} // namespace
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ class flat_hash_map : public absl::container_internal::raw_hash_map<
|
|||
// insertion) and a bool denoting whether the insertion took place.
|
||||
//
|
||||
// std::pair<iterator,bool> insert(T&& value):
|
||||
// std::pair<iterator,bool> insert(init_type&& value ):
|
||||
// std::pair<iterator,bool> insert(init_type&& value):
|
||||
//
|
||||
// Inserts a moveable value into the `flat_hash_map`. Returns a pair
|
||||
// consisting of an iterator to the inserted element (or to the element that
|
||||
|
|
@ -215,14 +215,14 @@ class flat_hash_map : public absl::container_internal::raw_hash_map<
|
|||
//
|
||||
// iterator insert(const_iterator hint, const init_type& value):
|
||||
// iterator insert(const_iterator hint, T&& value):
|
||||
// iterator insert(const_iterator hint, init_type&& value );
|
||||
// iterator insert(const_iterator hint, init_type&& value);
|
||||
//
|
||||
// Inserts a value, using the position of `hint` as a non-binding suggestion
|
||||
// for where to begin the insertion search. Returns an iterator to the
|
||||
// inserted element, or to the existing element that prevented the
|
||||
// insertion.
|
||||
//
|
||||
// void insert(InputIterator first, InputIterator last ):
|
||||
// void insert(InputIterator first, InputIterator last):
|
||||
//
|
||||
// Inserts a range of values [`first`, `last`).
|
||||
//
|
||||
|
|
@ -230,7 +230,7 @@ class flat_hash_map : public absl::container_internal::raw_hash_map<
|
|||
// multiple keys compare equivalently, for `flat_hash_map` we guarantee the
|
||||
// first match is inserted.
|
||||
//
|
||||
// void insert(std::initializer_list<init_type> ilist ):
|
||||
// void insert(std::initializer_list<init_type> ilist):
|
||||
//
|
||||
// Inserts the elements within the initializer list `ilist`.
|
||||
//
|
||||
|
|
@ -423,12 +423,12 @@ class flat_hash_map : public absl::container_internal::raw_hash_map<
|
|||
// iterators are invalidated. Otherwise iterators are not affected and
|
||||
// references are not invalidated. Overloads are listed below.
|
||||
//
|
||||
// T& operator[](const Key& key ):
|
||||
// T& operator[](const Key& key):
|
||||
//
|
||||
// Inserts an init_type object constructed in-place if the element with the
|
||||
// given key does not exist.
|
||||
//
|
||||
// T& operator[]( Key&& key ):
|
||||
// T& operator[](Key&& key):
|
||||
//
|
||||
// Inserts an init_type object constructed in-place provided that an element
|
||||
// with the given key does not exist.
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ class flat_hash_set
|
|||
// inserted element, or to the existing element that prevented the
|
||||
// insertion.
|
||||
//
|
||||
// void insert(InputIterator first, InputIterator last ):
|
||||
// void insert(InputIterator first, InputIterator last):
|
||||
//
|
||||
// Inserts a range of values [`first`, `last`).
|
||||
//
|
||||
|
|
@ -221,7 +221,7 @@ class flat_hash_set
|
|||
// multiple keys compare equivalently, for `flat_hash_set` we guarantee the
|
||||
// first match is inserted.
|
||||
//
|
||||
// void insert(std::initializer_list<T> ilist ):
|
||||
// void insert(std::initializer_list<T> ilist):
|
||||
//
|
||||
// Inserts the elements within the initializer list `ilist`.
|
||||
//
|
||||
|
|
|
|||
|
|
@ -620,6 +620,12 @@ class InlinedVector {
|
|||
// Returns the allocator of this inlined vector.
|
||||
allocator_type get_allocator() const { return allocator(); }
|
||||
|
||||
template <typename H>
|
||||
friend H AbslHashValue(H h, const InlinedVector& v) {
|
||||
return H::combine(H::combine_contiguous(std::move(h), v.data(), v.size()),
|
||||
v.size());
|
||||
}
|
||||
|
||||
private:
|
||||
static_assert(N > 0, "inlined vector with nonpositive size");
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include "absl/base/internal/raw_logging.h"
|
||||
#include "absl/base/macros.h"
|
||||
#include "absl/container/internal/test_instance_tracker.h"
|
||||
#include "absl/hash/hash_testing.h"
|
||||
#include "absl/memory/memory.h"
|
||||
#include "absl/strings/str_cat.h"
|
||||
|
||||
|
|
@ -1788,4 +1789,5 @@ TEST(AllocatorSupportTest, SizeAllocConstructor) {
|
|||
EXPECT_THAT(v, AllOf(SizeIs(len), Each(0)));
|
||||
}
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
|
|
|||
|
|
@ -83,11 +83,6 @@ struct StringHashEq {
|
|||
}
|
||||
};
|
||||
};
|
||||
|
||||
#if defined(HAS_GLOBAL_STRING)
|
||||
template <>
|
||||
struct HashEq<std::string> : StringHashEq {};
|
||||
#endif
|
||||
template <>
|
||||
struct HashEq<std::string> : StringHashEq {};
|
||||
template <>
|
||||
|
|
|
|||
|
|
@ -1330,8 +1330,7 @@ class raw_hash_set {
|
|||
void rehash(size_t n) {
|
||||
if (n == 0 && capacity_ == 0) return;
|
||||
if (n == 0 && size_ == 0) return destroy_slots();
|
||||
auto m = NormalizeCapacity(std::max(
|
||||
n, static_cast<size_t>(std::ceil(size() / kMaxLoadFactor))));
|
||||
auto m = NormalizeCapacity(std::max(n, NumSlotsFast(size())));
|
||||
// n == 0 unconditionally rehashes as per the standard.
|
||||
if (n == 0 || m > capacity_) {
|
||||
resize(m);
|
||||
|
|
@ -1339,7 +1338,7 @@ class raw_hash_set {
|
|||
}
|
||||
|
||||
void reserve(size_t n) {
|
||||
rehash(static_cast<size_t>(std::ceil(n / kMaxLoadFactor)));
|
||||
rehash(NumSlotsFast(n));
|
||||
}
|
||||
|
||||
// Extension API: support for heterogeneous keys.
|
||||
|
|
@ -1518,6 +1517,13 @@ class raw_hash_set {
|
|||
slot_type&& slot;
|
||||
};
|
||||
|
||||
// Computes std::ceil(n / kMaxLoadFactor). Faster than calling std::ceil.
|
||||
static inline size_t NumSlotsFast(size_t n) {
|
||||
return static_cast<size_t>(
|
||||
(n * kMaxLoadFactorDenominator + (kMaxLoadFactorNumerator - 1)) /
|
||||
kMaxLoadFactorNumerator);
|
||||
}
|
||||
|
||||
// "erases" the object from the container, except that it doesn't actually
|
||||
// destroy the object. It only updates all the metadata of the class.
|
||||
// This can be used in conjunction with Policy::transfer to move the object to
|
||||
|
|
@ -1825,7 +1831,10 @@ class raw_hash_set {
|
|||
}
|
||||
|
||||
// On average each group has 2 empty slot (for the vectorized case).
|
||||
static constexpr float kMaxLoadFactor = 14.0 / 16.0;
|
||||
static constexpr int64_t kMaxLoadFactorNumerator = 14;
|
||||
static constexpr int64_t kMaxLoadFactorDenominator = 16;
|
||||
static constexpr float kMaxLoadFactor =
|
||||
1.0 * kMaxLoadFactorNumerator / kMaxLoadFactorDenominator;
|
||||
|
||||
// TODO(alkis): Investigate removing some of these fields:
|
||||
// - ctrl/slots can be derived from each other
|
||||
|
|
|
|||
|
|
@ -1916,7 +1916,7 @@ TEST(Table, EffectiveLoadFactorInts) {
|
|||
}
|
||||
|
||||
// Confirm that we assert if we try to erase() end().
|
||||
TEST(Table, EraseOfEndAsserts) {
|
||||
TEST(TableDeathTest, EraseOfEndAsserts) {
|
||||
// Use an assert with side-effects to figure out if they are actually enabled.
|
||||
bool assert_enabled = false;
|
||||
assert([&]() {
|
||||
|
|
@ -1928,7 +1928,7 @@ TEST(Table, EraseOfEndAsserts) {
|
|||
IntTable t;
|
||||
// Extra simple "regexp" as regexp support is highly varied across platforms.
|
||||
constexpr char kDeathMsg[] = "it != end";
|
||||
EXPECT_DEATH(t.erase(t.end()), kDeathMsg);
|
||||
EXPECT_DEATH_IF_SUPPORTED(t.erase(t.end()), kDeathMsg);
|
||||
}
|
||||
|
||||
#ifdef ADDRESS_SANITIZER
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ class node_hash_map
|
|||
// insertion) and a `bool` denoting whether the insertion took place.
|
||||
//
|
||||
// std::pair<iterator,bool> insert(T&& value):
|
||||
// std::pair<iterator,bool> insert(init_type&& value ):
|
||||
// std::pair<iterator,bool> insert(init_type&& value):
|
||||
//
|
||||
// Inserts a moveable value into the `node_hash_map`. Returns a `std::pair`
|
||||
// consisting of an iterator to the inserted element (or to the element that
|
||||
|
|
@ -210,14 +210,14 @@ class node_hash_map
|
|||
//
|
||||
// iterator insert(const_iterator hint, const init_type& value):
|
||||
// iterator insert(const_iterator hint, T&& value):
|
||||
// iterator insert(const_iterator hint, init_type&& value );
|
||||
// iterator insert(const_iterator hint, init_type&& value);
|
||||
//
|
||||
// Inserts a value, using the position of `hint` as a non-binding suggestion
|
||||
// for where to begin the insertion search. Returns an iterator to the
|
||||
// inserted element, or to the existing element that prevented the
|
||||
// insertion.
|
||||
//
|
||||
// void insert(InputIterator first, InputIterator last ):
|
||||
// void insert(InputIterator first, InputIterator last):
|
||||
//
|
||||
// Inserts a range of values [`first`, `last`).
|
||||
//
|
||||
|
|
@ -225,7 +225,7 @@ class node_hash_map
|
|||
// multiple keys compare equivalently, for `node_hash_map` we guarantee the
|
||||
// first match is inserted.
|
||||
//
|
||||
// void insert(std::initializer_list<init_type> ilist ):
|
||||
// void insert(std::initializer_list<init_type> ilist):
|
||||
//
|
||||
// Inserts the elements within the initializer list `ilist`.
|
||||
//
|
||||
|
|
@ -413,12 +413,12 @@ class node_hash_map
|
|||
// all iterators are invalidated. Otherwise iterators are not affected and
|
||||
// references are not invalidated. Overloads are listed below.
|
||||
//
|
||||
// T& operator[](const Key& key ):
|
||||
// T& operator[](const Key& key):
|
||||
//
|
||||
// Inserts an init_type object constructed in-place if the element with the
|
||||
// given key does not exist.
|
||||
//
|
||||
// T& operator[]( Key&& key ):
|
||||
// T& operator[](Key&& key):
|
||||
//
|
||||
// Inserts an init_type object constructed in-place provided that an element
|
||||
// with the given key does not exist.
|
||||
|
|
|
|||
|
|
@ -207,7 +207,7 @@ class node_hash_set
|
|||
// inserted element, or to the existing element that prevented the
|
||||
// insertion.
|
||||
//
|
||||
// void insert(InputIterator first, InputIterator last ):
|
||||
// void insert(InputIterator first, InputIterator last):
|
||||
//
|
||||
// Inserts a range of values [`first`, `last`).
|
||||
//
|
||||
|
|
@ -215,7 +215,7 @@ class node_hash_set
|
|||
// multiple keys compare equivalently, for `node_hash_set` we guarantee the
|
||||
// first match is inserted.
|
||||
//
|
||||
// void insert(std::initializer_list<T> ilist ):
|
||||
// void insert(std::initializer_list<T> ilist):
|
||||
//
|
||||
// Inserts the elements within the initializer list `ilist`.
|
||||
//
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue