Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "absl/container/internal/raw_hash_set.h"
00016
00017 #include <atomic>
00018 #include <cstddef>
00019
00020 #include "absl/base/config.h"
00021
00022 namespace absl {
00023 namespace container_internal {
00024
00025 constexpr size_t Group::kWidth;
00026
00027
00028 inline size_t RandomSeed() {
00029 #if ABSL_HAVE_THREAD_LOCAL
00030 static thread_local size_t counter = 0;
00031 size_t value = ++counter;
00032 #else // ABSL_HAVE_THREAD_LOCAL
00033 static std::atomic<size_t> counter(0);
00034 size_t value = counter.fetch_add(1, std::memory_order_relaxed);
00035 #endif // ABSL_HAVE_THREAD_LOCAL
00036 return value ^ static_cast<size_t>(reinterpret_cast<uintptr_t>(&counter));
00037 }
00038
00039 bool ShouldInsertBackwards(size_t hash, ctrl_t* ctrl) {
00040
00041
00042 return (H1(hash, ctrl) ^ RandomSeed()) % 13 > 6;
00043 }
00044
00045 }
00046 }