15 #include "absl/container/internal/hash_function_defaults.h"
18 #include <type_traits>
21 #include "gtest/gtest.h"
22 #include "absl/random/random.h"
23 #include "absl/strings/cord.h"
24 #include "absl/strings/cord_test_helpers.h"
25 #include "absl/strings/string_view.h"
29 namespace container_internal {
35 hash_default_eq<int32_t>
eq;
47 hash_default_hash<int32_t>
hash;
59 enum class MyEnum {
A, B,
C, D };
62 hash_default_eq<MyEnum>
eq;
68 hash_default_hash<MyEnum>
hash;
72 EXPECT_EQ(h, hash_default_hash<int>{}(
static_cast<int>(
e)));
114 void operator()(
const T*
ptr)
const {}
119 std::unique_ptr<const int, NoDeleter>,
120 std::unique_ptr<int>, std::unique_ptr<int, NoDeleter>,
121 std::shared_ptr<const int>, std::shared_ptr<int>>;
125 hash_default_eq<T>
key_eq;
132 hash_default_hash<T>
hasher;
140 auto sptr = std::make_shared<int>();
141 std::shared_ptr<const int> csptr = sptr;
142 int*
ptr = sptr.get();
143 const int* cptr =
ptr;
144 std::unique_ptr<int, NoDeleter> uptr(
ptr);
145 std::unique_ptr<const int, NoDeleter> cuptr(
ptr);
161 struct Derived : Base {};
163 hash_default_hash<Base*>
hasher;
170 auto dp = std::make_shared<Derived>();
176 hash_default_hash<Func>
hasher;
177 hash_default_eq<Func>
eq;
179 Func p1 = [] {
return 1; }, p2 = [] {
return 2; };
190 auto sptr = std::make_shared<int>();
191 std::shared_ptr<const int> csptr = sptr;
192 int*
ptr = sptr.get();
193 const int* cptr =
ptr;
194 std::unique_ptr<int, NoDeleter> uptr(
ptr);
195 std::unique_ptr<const int, NoDeleter> cuptr(
ptr);
209 TEST(EqCord, Works) {
210 hash_default_eq<absl::Cord>
eq;
224 TEST(HashCord, Works) {
225 hash_default_hash<absl::Cord>
hash;
246 TEST(HashCord, FragmentedCordWorks) {
247 hash_default_hash<absl::Cord>
hash;
253 TEST(HashCord, FragmentedLongCordWorks) {
254 hash_default_hash<absl::Cord>
hash;
263 TEST(HashCord, RandomCord) {
264 hash_default_hash<absl::Cord>
hash;
266 for (
int i = 0;
i < 1000; ++
i) {
268 std::vector<std::string> pieces;
269 for (
size_t s = 0;
s < number_of_segments; ++
s) {
274 return static_cast<char>(absl::Uniform<unsigned char>(bitgen));
276 pieces.push_back(
str);
285 using StringTypesCartesianProduct =
Types<
287 std::pair<absl::Cord, std::string>,
288 std::pair<absl::Cord, absl::string_view>,
289 std::pair<absl::Cord, absl::Cord>,
290 std::pair<absl::Cord, const char*>,
292 std::pair<std::string, absl::Cord>,
293 std::pair<absl::string_view, absl::Cord>,
295 std::pair<absl::string_view, std::string>,
296 std::pair<absl::string_view, absl::string_view>,
297 std::pair<absl::string_view, const char*>>;
300 constexpr
char kFirstString[] =
"abc123";
301 constexpr
char kSecondString[] =
"ijk456";
303 template <
typename T>
305 typename T::first_type
a1{kFirstString};
306 typename T::second_type
b1{kFirstString};
307 typename T::first_type
a2{kSecondString};
308 typename T::second_type
b2{kSecondString};
309 hash_default_eq<typename T::first_type> eq;
310 hash_default_hash<typename T::first_type>
hash;
358 template <
class E = Hashable<H>,
359 class =
typename std::enable_if<E::HashableBy(kStd)>::type>
368 namespace container_internal {
373 return hash_default_hash<T>()(
v);
376 TEST(Delegate, HashDispatch) {